COSMOS core  1.0.2 (beta)
Comprehensive Open-architecture Solution for Mission Operations Systems
pngwrite.c File Reference
#include "pngpriv.h"
#include <errno.h>
Include dependency graph for pngwrite.c:

Classes

struct  png_image_write_control
 

Macros

#define UNP_RECIPROCAL(alpha)   ((((0xffff*0xff)<<7)+(alpha>>1))/alpha)
 

Functions

static void write_unknown_chunks (png_structrp png_ptr, png_const_inforp info_ptr, unsigned int where)
 
void png_write_info_before_PLTE (png_structrp png_ptr, png_const_inforp info_ptr)
 
void png_write_info (png_structrp png_ptr, png_const_inforp info_ptr)
 
void png_write_end (png_structrp png_ptr, png_inforp info_ptr)
 
void png_convert_from_struct_tm (png_timep ptime, const struct tm *ttime)
 
void png_convert_from_time_t (png_timep ptime, time_t ttime)
 
png_structp png_create_write_struct (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn)
 
png_structp png_create_write_struct_2 (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn)
 
void png_write_rows (png_structrp png_ptr, png_bytepp row, png_uint_32 num_rows)
 
void png_write_image (png_structrp png_ptr, png_bytepp image)
 
static void png_do_write_intrapixel (png_row_infop row_info, png_bytep row)
 
void png_write_row (png_structrp png_ptr, png_const_bytep row)
 
void png_set_flush (png_structrp png_ptr, int nrows)
 
void png_write_flush (png_structrp png_ptr)
 
static void png_reset_filter_heuristics (png_structrp png_ptr)
 
static void png_write_destroy (png_structrp png_ptr)
 
void png_destroy_write_struct (png_structpp png_ptr_ptr, png_infopp info_ptr_ptr)
 
void png_set_filter (png_structrp png_ptr, int method, int filters)
 
static int png_init_filter_heuristics (png_structrp png_ptr, int heuristic_method, int num_weights)
 
void png_set_filter_heuristics (png_structrp png_ptr, int heuristic_method, int num_weights, png_const_doublep filter_weights, png_const_doublep filter_costs)
 
void png_set_filter_heuristics_fixed (png_structrp png_ptr, int heuristic_method, int num_weights, png_const_fixed_point_p filter_weights, png_const_fixed_point_p filter_costs)
 
void png_set_compression_level (png_structrp png_ptr, int level)
 
void png_set_compression_mem_level (png_structrp png_ptr, int mem_level)
 
void png_set_compression_strategy (png_structrp png_ptr, int strategy)
 
void png_set_compression_window_bits (png_structrp png_ptr, int window_bits)
 
void png_set_compression_method (png_structrp png_ptr, int method)
 
void png_set_text_compression_level (png_structrp png_ptr, int level)
 
void png_set_text_compression_mem_level (png_structrp png_ptr, int mem_level)
 
void png_set_text_compression_strategy (png_structrp png_ptr, int strategy)
 
void png_set_text_compression_window_bits (png_structrp png_ptr, int window_bits)
 
void png_set_text_compression_method (png_structrp png_ptr, int method)
 
void png_set_write_status_fn (png_structrp png_ptr, png_write_status_ptr write_row_fn)
 
void png_set_write_user_transform_fn (png_structrp png_ptr, png_user_transform_ptr write_user_transform_fn)
 
void png_write_png (png_structrp png_ptr, png_inforp info_ptr, int transforms, voidp params)
 
static int png_image_write_init (png_imagep image)
 
static int png_write_image_16bit (png_voidp argument)
 
static png_byte png_unpremultiply (png_uint_32 component, png_uint_32 alpha, png_uint_32 reciprocal)
 
static int png_write_image_8bit (png_voidp argument)
 
static void png_image_set_PLTE (png_image_write_control *display)
 
static int png_image_write_main (png_voidp argument)
 
int png_image_write_to_stdio (png_imagep image, FILE *file, int convert_to_8bit, const void *buffer, png_int_32 row_stride, const void *colormap)
 
int png_image_write_to_file (png_imagep image, const char *file_name, int convert_to_8bit, const void *buffer, png_int_32 row_stride, const void *colormap)
 

Macro Definition Documentation

#define UNP_RECIPROCAL (   alpha)    ((((0xffff*0xff)<<7)+(alpha>>1))/alpha)

Function Documentation

static void write_unknown_chunks ( png_structrp  png_ptr,
png_const_inforp  info_ptr,
unsigned int  where 
)
static
26 {
27  if (info_ptr->unknown_chunks_num != 0)
28  {
30 
31  png_debug(5, "writing extra chunks");
32 
33  for (up = info_ptr->unknown_chunks;
34  up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num;
35  ++up)
36  if ((up->location & where) != 0)
37  {
38  /* If per-chunk unknown chunk handling is enabled use it, otherwise
39  * just write the chunks the application has set.
40  */
41 #ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
42  int keep = png_handle_as_unknown(png_ptr, up->name);
43 
44  /* NOTE: this code is radically different from the read side in the
45  * matter of handling an ancillary unknown chunk. In the read side
46  * the default behavior is to discard it, in the code below the default
47  * behavior is to write it. Critical chunks are, however, only
48  * written if explicitly listed or if the default is set to write all
49  * unknown chunks.
50  *
51  * The default handling is also slightly weird - it is not possible to
52  * stop the writing of all unsafe-to-copy chunks!
53  *
54  * TODO: REVIEW: this would seem to be a bug.
55  */
56  if (keep != PNG_HANDLE_CHUNK_NEVER &&
57  ((up->name[3] & 0x20) /* safe-to-copy overrides everything */ ||
58  keep == PNG_HANDLE_CHUNK_ALWAYS ||
59  (keep == PNG_HANDLE_CHUNK_AS_DEFAULT &&
60  png_ptr->unknown_default == PNG_HANDLE_CHUNK_ALWAYS)))
61 #endif
62  {
63  /* TODO: review, what is wrong with a zero length unknown chunk? */
64  if (up->size == 0)
65  png_warning(png_ptr, "Writing zero-length unknown chunk");
66 
67  png_write_chunk(png_ptr, up->name, up->data, up->size);
68  }
69  }
70  }
71 }
PNG_IMPEXP void() png_warning(png_const_structrp png_ptr, png_const_charp warning_message)
Definition: pngerror.c:216
#define png_debug(l, m)
Definition: pngdebug.h:146
#define PNG_HANDLE_CHUNK_AS_DEFAULT
Definition: png.h:2497
png_byte name[5]
Definition: png.h:765
Definition: png.h:763
#define PNG_HANDLE_CHUNK_ALWAYS
Definition: png.h:2500
png_byte location
Definition: png.h:775
PNG_IMPEXP void() png_write_chunk(png_structrp png_ptr, png_const_bytep chunk_name, png_const_bytep data, png_size_t length)
Definition: pngwutil.c:193
png_byte * data
Definition: png.h:766
int png_handle_as_unknown(png_const_structrp png_ptr, png_const_bytep chunk_name)
Definition: png.c:884
#define PNG_HANDLE_CHUNK_NEVER
Definition: png.h:2498
png_size_t size
Definition: png.h:767
void png_write_info_before_PLTE ( png_structrp  png_ptr,
png_const_inforp  info_ptr 
)
85 {
86  png_debug(1, "in png_write_info_before_PLTE");
87 
88  if (png_ptr == NULL || info_ptr == NULL)
89  return;
90 
91  if ((png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE) == 0)
92  {
93  /* Write PNG signature */
94  png_write_sig(png_ptr);
95 
96 #ifdef PNG_MNG_FEATURES_SUPPORTED
97  if ((png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) != 0 && \
98  png_ptr->mng_features_permitted != 0)
99  {
100  png_warning(png_ptr, "MNG features are not allowed in a PNG datastream");
101  png_ptr->mng_features_permitted = 0;
102  }
103 #endif
104 
105  /* Write IHDR information. */
106  png_write_IHDR(png_ptr, info_ptr->width, info_ptr->height,
107  info_ptr->bit_depth, info_ptr->color_type, info_ptr->compression_type,
108  info_ptr->filter_type,
110  info_ptr->interlace_type
111 #else
112  0
113 #endif
114  );
115 
116  /* The rest of these check to see if the valid field has the appropriate
117  * flag set, and if it does, writes the chunk.
118  *
119  * 1.6.0: COLORSPACE support controls the writing of these chunks too, and
120  * the chunks will be written if the WRITE routine is there and information
121  * is available in the COLORSPACE. (See png_colorspace_sync_info in png.c
122  * for where the valid flags get set.)
123  *
124  * Under certain circumstances the colorspace can be invalidated without
125  * syncing the info_struct 'valid' flags; this happens if libpng detects and
126  * error and calls png_error while the color space is being set, yet the
127  * application continues writing the PNG. So check the 'invalid' flag here
128  * too.
129  */
130 #ifdef PNG_GAMMA_SUPPORTED
131 # ifdef PNG_WRITE_gAMA_SUPPORTED
132  if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 &&
133  (info_ptr->colorspace.flags & PNG_COLORSPACE_FROM_gAMA) != 0 &&
134  (info_ptr->valid & PNG_INFO_gAMA) != 0)
135  png_write_gAMA_fixed(png_ptr, info_ptr->colorspace.gamma);
136 # endif
137 #endif
138 
139 #ifdef PNG_COLORSPACE_SUPPORTED
140  /* Write only one of sRGB or an ICC profile. If a profile was supplied
141  * and it matches one of the known sRGB ones issue a warning.
142  */
143 # ifdef PNG_WRITE_iCCP_SUPPORTED
144  if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 &&
145  (info_ptr->valid & PNG_INFO_iCCP) != 0)
146  {
147 # ifdef PNG_WRITE_sRGB_SUPPORTED
148  if ((info_ptr->valid & PNG_INFO_sRGB) != 0)
149  png_app_warning(png_ptr,
150  "profile matches sRGB but writing iCCP instead");
151 # endif
152 
153  png_write_iCCP(png_ptr, info_ptr->iccp_name,
154  info_ptr->iccp_profile);
155  }
156 # ifdef PNG_WRITE_sRGB_SUPPORTED
157  else
158 # endif
159 # endif
160 
161 # ifdef PNG_WRITE_sRGB_SUPPORTED
162  if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 &&
163  (info_ptr->valid & PNG_INFO_sRGB) != 0)
164  png_write_sRGB(png_ptr, info_ptr->colorspace.rendering_intent);
165 # endif /* WRITE_sRGB */
166 #endif /* COLORSPACE */
167 
168 #ifdef PNG_WRITE_sBIT_SUPPORTED
169  if ((info_ptr->valid & PNG_INFO_sBIT) != 0)
170  png_write_sBIT(png_ptr, &(info_ptr->sig_bit), info_ptr->color_type);
171 #endif
172 
173 #ifdef PNG_COLORSPACE_SUPPORTED
174 # ifdef PNG_WRITE_cHRM_SUPPORTED
175  if ((info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) == 0 &&
176  (info_ptr->colorspace.flags & PNG_COLORSPACE_FROM_cHRM) != 0 &&
177  (info_ptr->valid & PNG_INFO_cHRM) != 0)
178  png_write_cHRM_fixed(png_ptr, &info_ptr->colorspace.end_points_xy);
179 # endif
180 #endif
181 
182 #ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
183  write_unknown_chunks(png_ptr, info_ptr, PNG_HAVE_IHDR);
184 #endif
185 
186  png_ptr->mode |= PNG_WROTE_INFO_BEFORE_PLTE;
187  }
188 }
png_byte filter_type
Definition: pnginfo.h:70
#define PNG_INFO_gAMA
Definition: png.h:873
#define PNG_INFO_sRGB
Definition: png.h:884
png_byte interlace_type
Definition: pnginfo.h:71
PNG_IMPEXP void() png_warning(png_const_structrp png_ptr, png_const_charp warning_message)
Definition: pngerror.c:216
#define png_debug(l, m)
Definition: pngdebug.h:146
void png_write_sBIT(png_structrp png_ptr, png_const_color_8p sbit, int color_type)
Definition: pngwutil.c:1339
static void write_unknown_chunks(png_structrp png_ptr, png_const_inforp info_ptr, unsigned int where)
Definition: pngwrite.c:24
void png_write_cHRM_fixed(png_structrp png_ptr, const png_xy *xy)
Definition: pngwutil.c:1398
png_byte compression_type
Definition: pnginfo.h:69
png_byte color_type
Definition: pnginfo.h:67
#define PNG_HAVE_IHDR
Definition: png.h:785
png_uint_32 height
Definition: pnginfo.h:60
void png_write_IHDR(png_structrp png_ptr, png_uint_32 width, png_uint_32 height, int bit_depth, int color_type, int compression_method, int filter_method, int interlace_method)
Definition: pngwutil.c:757
PNG_IMPEXP void() png_write_sig(png_structrp png_ptr)
Definition: pngwutil.c:51
#define PNG_INFO_sBIT
Definition: png.h:874
void png_write_gAMA_fixed(png_structrp png_ptr, png_fixed_point file_gamma)
Definition: pngwutil.c:1159
png_byte bit_depth
Definition: pnginfo.h:66
void png_write_sRGB(png_structrp png_ptr, int intent)
Definition: pngwutil.c:1174
png_uint_32 valid
Definition: pnginfo.h:61
png_uint_32 mode
Definition: pngstruct.h:179
#define PNG_WROTE_INFO_BEFORE_PLTE
Definition: pngpriv.h:552
void png_write_iCCP(png_structrp png_ptr, png_const_charp name, png_const_bytep profile)
Definition: pngwutil.c:1192
#define PNG_WRITE_INTERLACING_SUPPORTED
Definition: pnglibconf.h:137
void png_app_warning(png_const_structrp png_ptr, png_const_charp error_message)
Definition: pngerror.c:392
png_uint_32 width
Definition: pnginfo.h:59
#define PNG_HAVE_PNG_SIGNATURE
Definition: pngpriv.h:554
#define PNG_INFO_cHRM
Definition: png.h:875
#define PNG_INFO_iCCP
Definition: png.h:885
void png_write_info ( png_structrp  png_ptr,
png_const_inforp  info_ptr 
)
192 {
193 #if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED)
194  int i;
195 #endif
196 
197  png_debug(1, "in png_write_info");
198 
199  if (png_ptr == NULL || info_ptr == NULL)
200  return;
201 
202  png_write_info_before_PLTE(png_ptr, info_ptr);
203 
204  if ((info_ptr->valid & PNG_INFO_PLTE) != 0)
205  png_write_PLTE(png_ptr, info_ptr->palette,
206  (png_uint_32)info_ptr->num_palette);
207 
208  else if ((info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) !=0)
209  png_error(png_ptr, "Valid palette required for paletted images");
210 
211 #ifdef PNG_WRITE_tRNS_SUPPORTED
212  if ((info_ptr->valid & PNG_INFO_tRNS) !=0)
213  {
214 #ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED
215  /* Invert the alpha channel (in tRNS) */
216  if ((png_ptr->transformations & PNG_INVERT_ALPHA) != 0 &&
217  info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
218  {
219  int j;
220  for (j = 0; j<(int)info_ptr->num_trans; j++)
221  info_ptr->trans_alpha[j] =
222  (png_byte)(255 - info_ptr->trans_alpha[j]);
223  }
224 #endif
225  png_write_tRNS(png_ptr, info_ptr->trans_alpha, &(info_ptr->trans_color),
226  info_ptr->num_trans, info_ptr->color_type);
227  }
228 #endif
229 #ifdef PNG_WRITE_bKGD_SUPPORTED
230  if ((info_ptr->valid & PNG_INFO_bKGD) != 0)
231  png_write_bKGD(png_ptr, &(info_ptr->background), info_ptr->color_type);
232 #endif
233 
234 #ifdef PNG_WRITE_hIST_SUPPORTED
235  if ((info_ptr->valid & PNG_INFO_hIST) != 0)
236  png_write_hIST(png_ptr, info_ptr->hist, info_ptr->num_palette);
237 #endif
238 
239 #ifdef PNG_WRITE_oFFs_SUPPORTED
240  if ((info_ptr->valid & PNG_INFO_oFFs) != 0)
241  png_write_oFFs(png_ptr, info_ptr->x_offset, info_ptr->y_offset,
242  info_ptr->offset_unit_type);
243 #endif
244 
245 #ifdef PNG_WRITE_pCAL_SUPPORTED
246  if ((info_ptr->valid & PNG_INFO_pCAL) != 0)
247  png_write_pCAL(png_ptr, info_ptr->pcal_purpose, info_ptr->pcal_X0,
248  info_ptr->pcal_X1, info_ptr->pcal_type, info_ptr->pcal_nparams,
249  info_ptr->pcal_units, info_ptr->pcal_params);
250 #endif
251 
252 #ifdef PNG_WRITE_sCAL_SUPPORTED
253  if ((info_ptr->valid & PNG_INFO_sCAL) != 0)
254  png_write_sCAL_s(png_ptr, (int)info_ptr->scal_unit,
255  info_ptr->scal_s_width, info_ptr->scal_s_height);
256 #endif /* sCAL */
257 
258 #ifdef PNG_WRITE_pHYs_SUPPORTED
259  if ((info_ptr->valid & PNG_INFO_pHYs) != 0)
260  png_write_pHYs(png_ptr, info_ptr->x_pixels_per_unit,
261  info_ptr->y_pixels_per_unit, info_ptr->phys_unit_type);
262 #endif /* pHYs */
263 
264 #ifdef PNG_WRITE_tIME_SUPPORTED
265  if ((info_ptr->valid & PNG_INFO_tIME) != 0)
266  {
267  png_write_tIME(png_ptr, &(info_ptr->mod_time));
268  png_ptr->mode |= PNG_WROTE_tIME;
269  }
270 #endif /* tIME */
271 
272 #ifdef PNG_WRITE_sPLT_SUPPORTED
273  if ((info_ptr->valid & PNG_INFO_sPLT) != 0)
274  for (i = 0; i < (int)info_ptr->splt_palettes_num; i++)
275  png_write_sPLT(png_ptr, info_ptr->splt_palettes + i);
276 #endif /* sPLT */
277 
278 #ifdef PNG_WRITE_TEXT_SUPPORTED
279  /* Check to see if we need to write text chunks */
280  for (i = 0; i < info_ptr->num_text; i++)
281  {
282  png_debug2(2, "Writing header text chunk %d, type %d", i,
283  info_ptr->text[i].compression);
284  /* An internationalized chunk? */
285  if (info_ptr->text[i].compression > 0)
286  {
287 #ifdef PNG_WRITE_iTXt_SUPPORTED
288  /* Write international chunk */
289  png_write_iTXt(png_ptr,
290  info_ptr->text[i].compression,
291  info_ptr->text[i].key,
292  info_ptr->text[i].lang,
293  info_ptr->text[i].lang_key,
294  info_ptr->text[i].text);
295  /* Mark this chunk as written */
296  if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE)
297  info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR;
298  else
299  info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR;
300 #else
301  png_warning(png_ptr, "Unable to write international text");
302 #endif
303  }
304 
305  /* If we want a compressed text chunk */
306  else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_zTXt)
307  {
308 #ifdef PNG_WRITE_zTXt_SUPPORTED
309  /* Write compressed chunk */
310  png_write_zTXt(png_ptr, info_ptr->text[i].key,
311  info_ptr->text[i].text, info_ptr->text[i].compression);
312  /* Mark this chunk as written */
313  info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR;
314 #else
315  png_warning(png_ptr, "Unable to write compressed text");
316 #endif
317  }
318 
319  else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE)
320  {
321 #ifdef PNG_WRITE_tEXt_SUPPORTED
322  /* Write uncompressed chunk */
323  png_write_tEXt(png_ptr, info_ptr->text[i].key,
324  info_ptr->text[i].text,
325  0);
326  /* Mark this chunk as written */
327  info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR;
328 #else
329  /* Can't get here */
330  png_warning(png_ptr, "Unable to write uncompressed text");
331 #endif
332  }
333  }
334 #endif /* tEXt */
335 
336 #ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
337  write_unknown_chunks(png_ptr, info_ptr, PNG_HAVE_PLTE);
338 #endif
339 }
void png_write_sPLT(png_structrp png_ptr, png_const_sPLT_tp palette)
Definition: pngwutil.c:1254
void png_write_tIME(png_structrp png_ptr, png_const_timep mod_time)
Definition: pngwutil.c:1916
#define PNG_INVERT_ALPHA
Definition: pngpriv.h:579
#define PNG_INFO_tIME
Definition: png.h:882
void png_write_info_before_PLTE(png_structrp png_ptr, png_const_inforp info_ptr)
Definition: pngwrite.c:84
#define PNG_INFO_hIST
Definition: png.h:879
int i
Definition: rw_test.cpp:37
png_colorp palette
Definition: pnginfo.h:63
void png_write_pCAL(png_structrp png_ptr, png_charp purpose, png_int_32 X0, png_int_32 X1, int type, int nparams, png_const_charp units, png_charpp params)
Definition: pngwutil.c:1797
#define PNG_COLOR_TYPE_PALETTE
Definition: png.h:810
PNG_IMPEXP void() png_warning(png_const_structrp png_ptr, png_const_charp warning_message)
Definition: pngerror.c:216
#define png_debug(l, m)
Definition: pngdebug.h:146
#define PNG_HAVE_PLTE
Definition: png.h:786
void png_write_hIST(png_structrp png_ptr, png_const_uint_16p hist, int num_hist)
Definition: pngwutil.c:1552
void png_write_iTXt(png_structrp png_ptr, int compression, png_const_charp key, png_const_charp lang, png_const_charp lang_key, png_const_charp text)
Definition: pngwutil.c:1677
#define PNG_TEXT_COMPRESSION_NONE_WR
Definition: png.h:727
static void write_unknown_chunks(png_structrp png_ptr, png_const_inforp info_ptr, unsigned int where)
Definition: pngwrite.c:24
#define PNG_INFO_oFFs
Definition: png.h:881
void png_write_tRNS(png_structrp png_ptr, png_const_bytep trans, png_const_color_16p values, int number, int color_type)
Definition: pngwutil.c:1424
void png_write_bKGD(png_structrp png_ptr, png_const_color_16p values, int color_type)
Definition: pngwutil.c:1490
void png_write_oFFs(png_structrp png_ptr, png_int_32 x_offset, png_int_32 y_offset, int unit_type)
Definition: pngwutil.c:1777
png_byte color_type
Definition: pnginfo.h:67
#define PNG_TEXT_COMPRESSION_zTXt
Definition: png.h:730
#define PNG_TEXT_COMPRESSION_NONE
Definition: png.h:729
void png_write_sCAL_s(png_structrp png_ptr, int unit, png_const_charp width, png_const_charp height)
Definition: pngwutil.c:1862
png_uint_16 num_palette
Definition: pnginfo.h:64
#define PNG_INFO_PLTE
Definition: png.h:876
#define PNG_WROTE_tIME
Definition: pngpriv.h:551
#define PNG_TEXT_COMPRESSION_zTXt_WR
Definition: png.h:728
#define PNG_INFO_tRNS
Definition: png.h:877
void png_write_zTXt(png_structrp png_ptr, png_const_charp key, png_const_charp text, int compression)
Definition: pngwutil.c:1626
png_uint_32 valid
Definition: pnginfo.h:61
png_uint_32 mode
Definition: pngstruct.h:179
PNG_IMPEXP void() png_error(png_const_structrp png_ptr, png_const_charp error_message)
Definition: pngerror.c:40
void png_write_tEXt(png_structrp png_ptr, png_const_charp key, png_const_charp text, png_size_t text_len)
Definition: pngwutil.c:1583
#define PNG_INFO_sPLT
Definition: png.h:886
png_uint_16 num_trans
Definition: pnginfo.h:65
void png_write_pHYs(png_structrp png_ptr, png_uint_32 x_pixels_per_unit, png_uint_32 y_pixels_per_unit, int unit_type)
Definition: pngwutil.c:1892
#define PNG_INFO_pHYs
Definition: png.h:880
#define PNG_INFO_pCAL
Definition: png.h:883
png_uint_32 transformations
Definition: pngstruct.h:181
#define PNG_INFO_bKGD
Definition: png.h:878
#define PNG_INFO_sCAL
Definition: png.h:887
#define png_debug2(l, m, p1, p2)
Definition: pngdebug.h:152
void png_write_PLTE(png_structrp png_ptr, png_const_colorp palette, png_uint_32 num_pal)
Definition: pngwutil.c:922
void png_write_end ( png_structrp  png_ptr,
png_inforp  info_ptr 
)
348 {
349  png_debug(1, "in png_write_end");
350 
351  if (png_ptr == NULL)
352  return;
353 
354  if ((png_ptr->mode & PNG_HAVE_IDAT) == 0)
355  png_error(png_ptr, "No IDATs written into file");
356 
357 #ifdef PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED
358  if (png_ptr->num_palette_max > png_ptr->num_palette)
359  png_benign_error(png_ptr, "Wrote palette index exceeding num_palette");
360 #endif
361 
362  /* See if user wants us to write information chunks */
363  if (info_ptr != NULL)
364  {
365 #ifdef PNG_WRITE_TEXT_SUPPORTED
366  int i; /* local index variable */
367 #endif
368 #ifdef PNG_WRITE_tIME_SUPPORTED
369  /* Check to see if user has supplied a time chunk */
370  if ((info_ptr->valid & PNG_INFO_tIME) != 0 &&
371  (png_ptr->mode & PNG_WROTE_tIME) == 0)
372  png_write_tIME(png_ptr, &(info_ptr->mod_time));
373 
374 #endif
375 #ifdef PNG_WRITE_TEXT_SUPPORTED
376  /* Loop through comment chunks */
377  for (i = 0; i < info_ptr->num_text; i++)
378  {
379  png_debug2(2, "Writing trailer text chunk %d, type %d", i,
380  info_ptr->text[i].compression);
381  /* An internationalized chunk? */
382  if (info_ptr->text[i].compression > 0)
383  {
384 #ifdef PNG_WRITE_iTXt_SUPPORTED
385  /* Write international chunk */
386  png_write_iTXt(png_ptr,
387  info_ptr->text[i].compression,
388  info_ptr->text[i].key,
389  info_ptr->text[i].lang,
390  info_ptr->text[i].lang_key,
391  info_ptr->text[i].text);
392  /* Mark this chunk as written */
393  if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE)
394  info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR;
395  else
396  info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR;
397 #else
398  png_warning(png_ptr, "Unable to write international text");
399 #endif
400  }
401 
402  else if (info_ptr->text[i].compression >= PNG_TEXT_COMPRESSION_zTXt)
403  {
404 #ifdef PNG_WRITE_zTXt_SUPPORTED
405  /* Write compressed chunk */
406  png_write_zTXt(png_ptr, info_ptr->text[i].key,
407  info_ptr->text[i].text, info_ptr->text[i].compression);
408  /* Mark this chunk as written */
409  info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR;
410 #else
411  png_warning(png_ptr, "Unable to write compressed text");
412 #endif
413  }
414 
415  else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE)
416  {
417 #ifdef PNG_WRITE_tEXt_SUPPORTED
418  /* Write uncompressed chunk */
419  png_write_tEXt(png_ptr, info_ptr->text[i].key,
420  info_ptr->text[i].text, 0);
421  /* Mark this chunk as written */
422  info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR;
423 #else
424  png_warning(png_ptr, "Unable to write uncompressed text");
425 #endif
426  }
427  }
428 #endif
429 #ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
430  write_unknown_chunks(png_ptr, info_ptr, PNG_AFTER_IDAT);
431 #endif
432  }
433 
434  png_ptr->mode |= PNG_AFTER_IDAT;
435 
436  /* Write end of PNG file */
437  png_write_IEND(png_ptr);
438 
439  /* This flush, added in libpng-1.0.8, removed from libpng-1.0.9beta03,
440  * and restored again in libpng-1.2.30, may cause some applications that
441  * do not set png_ptr->output_flush_fn to crash. If your application
442  * experiences a problem, please try building libpng with
443  * PNG_WRITE_FLUSH_AFTER_IEND_SUPPORTED defined, and report the event to
444  * png-mng-implement at lists.sf.net .
445  */
446 #ifdef PNG_WRITE_FLUSH_SUPPORTED
447 # ifdef PNG_WRITE_FLUSH_AFTER_IEND_SUPPORTED
448  png_flush(png_ptr);
449 # endif
450 #endif
451 }
void png_write_IEND(png_structrp png_ptr)
Definition: pngwutil.c:1148
void png_write_tIME(png_structrp png_ptr, png_const_timep mod_time)
Definition: pngwutil.c:1916
#define PNG_INFO_tIME
Definition: png.h:882
void png_flush(png_structrp png_ptr)
Definition: pngwio.c:71
int i
Definition: rw_test.cpp:37
PNG_IMPEXP void() png_warning(png_const_structrp png_ptr, png_const_charp warning_message)
Definition: pngerror.c:216
#define png_debug(l, m)
Definition: pngdebug.h:146
void png_write_iTXt(png_structrp png_ptr, int compression, png_const_charp key, png_const_charp lang, png_const_charp lang_key, png_const_charp text)
Definition: pngwutil.c:1677
#define PNG_TEXT_COMPRESSION_NONE_WR
Definition: png.h:727
static void write_unknown_chunks(png_structrp png_ptr, png_const_inforp info_ptr, unsigned int where)
Definition: pngwrite.c:24
#define PNG_HAVE_IDAT
Definition: pngpriv.h:544
#define PNG_TEXT_COMPRESSION_zTXt
Definition: png.h:730
#define PNG_TEXT_COMPRESSION_NONE
Definition: png.h:729
png_uint_16 num_palette
Definition: pngstruct.h:239
#define PNG_AFTER_IDAT
Definition: png.h:787
#define PNG_WROTE_tIME
Definition: pngpriv.h:551
#define PNG_TEXT_COMPRESSION_zTXt_WR
Definition: png.h:728
void png_write_zTXt(png_structrp png_ptr, png_const_charp key, png_const_charp text, int compression)
Definition: pngwutil.c:1626
png_uint_32 valid
Definition: pnginfo.h:61
png_uint_32 mode
Definition: pngstruct.h:179
PNG_IMPEXP void() png_error(png_const_structrp png_ptr, png_const_charp error_message)
Definition: pngerror.c:40
void png_write_tEXt(png_structrp png_ptr, png_const_charp key, png_const_charp text, png_size_t text_len)
Definition: pngwutil.c:1583
PNG_IMPEXP void() png_benign_error(png_const_structrp png_ptr, png_const_charp warning_message)
Definition: pngerror.c:362
#define png_debug2(l, m, p1, p2)
Definition: pngdebug.h:152
void png_convert_from_struct_tm ( png_timep  ptime,
const struct tm *  ttime 
)
456 {
457  png_debug(1, "in png_convert_from_struct_tm");
458 
459  ptime->year = (png_uint_16)(1900 + ttime->tm_year);
460  ptime->month = (png_byte)(ttime->tm_mon + 1);
461  ptime->day = (png_byte)ttime->tm_mday;
462  ptime->hour = (png_byte)ttime->tm_hour;
463  ptime->minute = (png_byte)ttime->tm_min;
464  ptime->second = (png_byte)ttime->tm_sec;
465 }
#define png_debug(l, m)
Definition: pngdebug.h:146
png_byte hour
Definition: png.h:746
png_byte second
Definition: png.h:748
png_byte minute
Definition: png.h:747
png_byte day
Definition: png.h:745
png_byte month
Definition: png.h:744
png_uint_16 year
Definition: png.h:743
void png_convert_from_time_t ( png_timep  ptime,
time_t  ttime 
)
469 {
470  struct tm *tbuf;
471 
472  png_debug(1, "in png_convert_from_time_t");
473 
474  tbuf = gmtime(&ttime);
475  png_convert_from_struct_tm(ptime, tbuf);
476 }
void png_convert_from_struct_tm(png_timep ptime, const struct tm *ttime)
Definition: pngwrite.c:455
#define png_debug(l, m)
Definition: pngdebug.h:146
png_structp png_create_write_struct ( png_const_charp  user_png_ver,
png_voidp  error_ptr,
png_error_ptr  error_fn,
png_error_ptr  warn_fn 
)
483 {
484 #ifndef PNG_USER_MEM_SUPPORTED
485  png_structrp png_ptr = png_create_png_struct(user_png_ver, error_ptr,
486  error_fn, warn_fn, NULL, NULL, NULL);
487 #else
488  return png_create_write_struct_2(user_png_ver, error_ptr, error_fn,
489  warn_fn, NULL, NULL, NULL);
490 }
Definition: pngstruct.h:144
png_structp png_create_png_struct(png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn)
Definition: png.c:225
png_structp png_create_write_struct_2(png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn)
Definition: pngwrite.c:496
png_structp png_create_write_struct_2 ( png_const_charp  user_png_ver,
png_voidp  error_ptr,
png_error_ptr  error_fn,
png_error_ptr  warn_fn,
png_voidp  mem_ptr,
png_malloc_ptr  malloc_fn,
png_free_ptr  free_fn 
)
497 {
498  png_structrp png_ptr = png_create_png_struct(user_png_ver, error_ptr,
499  error_fn, warn_fn, mem_ptr, malloc_fn, free_fn);
500 #endif /* USER_MEM */
501  if (png_ptr != NULL)
502  {
503  /* Set the zlib control values to defaults; they can be overridden by the
504  * application after the struct has been created.
505  */
506  png_ptr->zbuffer_size = PNG_ZBUF_SIZE;
507 
508  /* The 'zlib_strategy' setting is irrelevant because png_default_claim in
509  * pngwutil.c defaults it according to whether or not filters will be
510  * used, and ignores this setting.
511  */
512  png_ptr->zlib_strategy = PNG_Z_DEFAULT_STRATEGY;
513  png_ptr->zlib_level = PNG_Z_DEFAULT_COMPRESSION;
514  png_ptr->zlib_mem_level = 8;
515  png_ptr->zlib_window_bits = 15;
516  png_ptr->zlib_method = 8;
517 
518 #ifdef PNG_WRITE_COMPRESSED_TEXT_SUPPORTED
519  png_ptr->zlib_text_strategy = PNG_TEXT_Z_DEFAULT_STRATEGY;
520  png_ptr->zlib_text_level = PNG_TEXT_Z_DEFAULT_COMPRESSION;
521  png_ptr->zlib_text_mem_level = 8;
522  png_ptr->zlib_text_window_bits = 15;
523  png_ptr->zlib_text_method = 8;
524 #endif /* WRITE_COMPRESSED_TEXT */
525 
526  /* This is a highly dubious configuration option; by default it is off,
527  * but it may be appropriate for private builds that are testing
528  * extensions not conformant to the current specification, or of
529  * applications that must not fail to write at all costs!
530  */
531 #ifdef PNG_BENIGN_WRITE_ERRORS_SUPPORTED
532  /* In stable builds only warn if an application error can be completely
533  * handled.
534  */
536 #endif
537 
538  /* App warnings are warnings in release (or release candidate) builds but
539  * are errors during development.
540  */
541 #if PNG_LIBPNG_BUILD_BASE_TYPE >= PNG_LIBPNG_BUILD_RC
542  png_ptr->flags |= PNG_FLAG_APP_WARNINGS_WARN;
543 #endif
544 
545  /* TODO: delay this, it can be done in png_init_io() (if the app doesn't
546  * do it itself) avoiding setting the default function if it is not
547  * required.
548  */
549  png_set_write_fn(png_ptr, NULL, NULL, NULL);
550  }
551 
552  return png_ptr;
553 }
#define PNG_FLAG_APP_WARNINGS_WARN
Definition: pngpriv.h:622
#define PNG_Z_DEFAULT_COMPRESSION
Definition: pnglibconf.h:204
PNG_IMPEXP void() png_set_write_fn(png_structrp png_ptr, png_voidp io_ptr, png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn)
Definition: pngwio.c:122
Definition: pngstruct.h:144
png_structp png_create_png_struct(png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn)
Definition: png.c:225
png_uint_32 flags
Definition: pngstruct.h:180
#define PNG_TEXT_Z_DEFAULT_STRATEGY
Definition: pnglibconf.h:200
#define PNG_FLAG_BENIGN_ERRORS_WARN
Definition: pngpriv.h:621
#define PNG_TEXT_Z_DEFAULT_COMPRESSION
Definition: pnglibconf.h:199
#define PNG_ZBUF_SIZE
Definition: pnglibconf.h:202
#define PNG_Z_DEFAULT_STRATEGY
Definition: pnglibconf.h:206
void png_write_rows ( png_structrp  png_ptr,
png_bytepp  row,
png_uint_32  num_rows 
)
564 {
565  png_uint_32 i; /* row counter */
566  png_bytepp rp; /* row pointer */
567 
568  png_debug(1, "in png_write_rows");
569 
570  if (png_ptr == NULL)
571  return;
572 
573  /* Loop through the rows */
574  for (i = 0, rp = row; i < num_rows; i++, rp++)
575  {
576  png_write_row(png_ptr, *rp);
577  }
578 }
int i
Definition: rw_test.cpp:37
#define png_debug(l, m)
Definition: pngdebug.h:146
png_byte ** png_bytepp
Definition: pngconf.h:627
void png_write_row(png_structrp png_ptr, png_const_bytep row)
Definition: pngwrite.c:681
int JSAMPARRAY int int num_rows
Definition: jpegint.h:373
void png_write_image ( png_structrp  png_ptr,
png_bytepp  image 
)
585 {
586  png_uint_32 i; /* row index */
587  int pass, num_pass; /* pass variables */
588  png_bytepp rp; /* points to current row */
589 
590  if (png_ptr == NULL)
591  return;
592 
593  png_debug(1, "in png_write_image");
594 
595 #ifdef PNG_WRITE_INTERLACING_SUPPORTED
596  /* Initialize interlace handling. If image is not interlaced,
597  * this will set pass to 1
598  */
599  num_pass = png_set_interlace_handling(png_ptr);
600 #else
601  num_pass = 1;
602 #endif
603  /* Loop through passes */
604  for (pass = 0; pass < num_pass; pass++)
605  {
606  /* Loop through image */
607  for (i = 0, rp = image; i < png_ptr->height; i++, rp++)
608  {
609  png_write_row(png_ptr, *rp);
610  }
611  }
612 }
uint8_t image[110000000]
Definition: gige_snap.cpp:38
int i
Definition: rw_test.cpp:37
#define png_debug(l, m)
Definition: pngdebug.h:146
png_byte ** png_bytepp
Definition: pngconf.h:627
void png_write_row(png_structrp png_ptr, png_const_bytep row)
Definition: pngwrite.c:681
PNG_IMPEXP int() png_set_interlace_handling(png_structrp png_ptr)
Definition: pngtrans.c:99
png_uint_32 height
Definition: pngstruct.h:215
static void png_do_write_intrapixel ( png_row_infop  row_info,
png_bytep  row 
)
static
618 {
619  png_debug(1, "in png_do_write_intrapixel");
620 
621  if ((row_info->color_type & PNG_COLOR_MASK_COLOR) != 0)
622  {
623  int bytes_per_pixel;
624  png_uint_32 row_width = row_info->width;
625  if (row_info->bit_depth == 8)
626  {
627  png_bytep rp;
628  png_uint_32 i;
629 
630  if (row_info->color_type == PNG_COLOR_TYPE_RGB)
631  bytes_per_pixel = 3;
632 
633  else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
634  bytes_per_pixel = 4;
635 
636  else
637  return;
638 
639  for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel)
640  {
641  *(rp) = (png_byte)((*rp - *(rp + 1)) & 0xff);
642  *(rp + 2) = (png_byte)((*(rp + 2) - *(rp + 1)) & 0xff);
643  }
644  }
645 
646 #ifdef PNG_WRITE_16BIT_SUPPORTED
647  else if (row_info->bit_depth == 16)
648  {
649  png_bytep rp;
650  png_uint_32 i;
651 
652  if (row_info->color_type == PNG_COLOR_TYPE_RGB)
653  bytes_per_pixel = 6;
654 
655  else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
656  bytes_per_pixel = 8;
657 
658  else
659  return;
660 
661  for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel)
662  {
663  png_uint_32 s0 = (*(rp ) << 8) | *(rp + 1);
664  png_uint_32 s1 = (*(rp + 2) << 8) | *(rp + 3);
665  png_uint_32 s2 = (*(rp + 4) << 8) | *(rp + 5);
666  png_uint_32 red = (png_uint_32)((s0 - s1) & 0xffffL);
667  png_uint_32 blue = (png_uint_32)((s2 - s1) & 0xffffL);
668  *(rp ) = (png_byte)((red >> 8) & 0xff);
669  *(rp + 1) = (png_byte)(red & 0xff);
670  *(rp + 4) = (png_byte)((blue >> 8) & 0xff);
671  *(rp + 5) = (png_byte)(blue & 0xff);
672  }
673  }
674 #endif /* WRITE_16BIT */
675  }
676 }
int i
Definition: rw_test.cpp:37
#define PNG_COLOR_TYPE_RGB
Definition: png.h:811
png_byte * png_bytep
Definition: pngconf.h:600
#define png_debug(l, m)
Definition: pngdebug.h:146
#define PNG_COLOR_TYPE_RGB_ALPHA
Definition: png.h:812
png_uint_32 width
Definition: png.h:896
png_byte color_type
Definition: png.h:898
#define PNG_COLOR_MASK_COLOR
Definition: png.h:805
png_byte bit_depth
Definition: png.h:899
void png_write_row ( png_structrp  png_ptr,
png_const_bytep  row 
)
682 {
683  /* 1.5.6: moved from png_struct to be a local structure: */
684  png_row_info row_info;
685 
686  if (png_ptr == NULL)
687  return;
688 
689  png_debug2(1, "in png_write_row (row %u, pass %d)",
690  png_ptr->row_number, png_ptr->pass);
691 
692  /* Initialize transformations and other stuff if first time */
693  if (png_ptr->row_number == 0 && png_ptr->pass == 0)
694  {
695  /* Make sure we wrote the header info */
696  if ((png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE) == 0)
697  png_error(png_ptr,
698  "png_write_info was never called before png_write_row");
699 
700  /* Check for transforms that have been set but were defined out */
701 #if !defined(PNG_WRITE_INVERT_SUPPORTED) && defined(PNG_READ_INVERT_SUPPORTED)
702  if ((png_ptr->transformations & PNG_INVERT_MONO) != 0)
703  png_warning(png_ptr, "PNG_WRITE_INVERT_SUPPORTED is not defined");
704 #endif
705 
706 #if !defined(PNG_WRITE_FILLER_SUPPORTED) && defined(PNG_READ_FILLER_SUPPORTED)
707  if ((png_ptr->transformations & PNG_FILLER) != 0)
708  png_warning(png_ptr, "PNG_WRITE_FILLER_SUPPORTED is not defined");
709 #endif
710 #if !defined(PNG_WRITE_PACKSWAP_SUPPORTED) && \
711  defined(PNG_READ_PACKSWAP_SUPPORTED)
712  if ((png_ptr->transformations & PNG_PACKSWAP) != 0)
713  png_warning(png_ptr,
714  "PNG_WRITE_PACKSWAP_SUPPORTED is not defined");
715 #endif
716 
717 #if !defined(PNG_WRITE_PACK_SUPPORTED) && defined(PNG_READ_PACK_SUPPORTED)
718  if ((png_ptr->transformations & PNG_PACK) != 0)
719  png_warning(png_ptr, "PNG_WRITE_PACK_SUPPORTED is not defined");
720 #endif
721 
722 #if !defined(PNG_WRITE_SHIFT_SUPPORTED) && defined(PNG_READ_SHIFT_SUPPORTED)
723  if ((png_ptr->transformations & PNG_SHIFT) != 0)
724  png_warning(png_ptr, "PNG_WRITE_SHIFT_SUPPORTED is not defined");
725 #endif
726 
727 #if !defined(PNG_WRITE_BGR_SUPPORTED) && defined(PNG_READ_BGR_SUPPORTED)
728  if ((png_ptr->transformations & PNG_BGR) != 0)
729  png_warning(png_ptr, "PNG_WRITE_BGR_SUPPORTED is not defined");
730 #endif
731 
732 #if !defined(PNG_WRITE_SWAP_SUPPORTED) && defined(PNG_READ_SWAP_SUPPORTED)
733  if ((png_ptr->transformations & PNG_SWAP_BYTES) != 0)
734  png_warning(png_ptr, "PNG_WRITE_SWAP_SUPPORTED is not defined");
735 #endif
736 
737  png_write_start_row(png_ptr);
738  }
739 
740 #ifdef PNG_WRITE_INTERLACING_SUPPORTED
741  /* If interlaced and not interested in row, return */
742  if (png_ptr->interlaced != 0 &&
743  (png_ptr->transformations & PNG_INTERLACE) != 0)
744  {
745  switch (png_ptr->pass)
746  {
747  case 0:
748  if ((png_ptr->row_number & 0x07) != 0)
749  {
750  png_write_finish_row(png_ptr);
751  return;
752  }
753  break;
754 
755  case 1:
756  if ((png_ptr->row_number & 0x07) != 0 || png_ptr->width < 5)
757  {
758  png_write_finish_row(png_ptr);
759  return;
760  }
761  break;
762 
763  case 2:
764  if ((png_ptr->row_number & 0x07) != 4)
765  {
766  png_write_finish_row(png_ptr);
767  return;
768  }
769  break;
770 
771  case 3:
772  if ((png_ptr->row_number & 0x03) != 0 || png_ptr->width < 3)
773  {
774  png_write_finish_row(png_ptr);
775  return;
776  }
777  break;
778 
779  case 4:
780  if ((png_ptr->row_number & 0x03) != 2)
781  {
782  png_write_finish_row(png_ptr);
783  return;
784  }
785  break;
786 
787  case 5:
788  if ((png_ptr->row_number & 0x01) != 0 || png_ptr->width < 2)
789  {
790  png_write_finish_row(png_ptr);
791  return;
792  }
793  break;
794 
795  case 6:
796  if ((png_ptr->row_number & 0x01) == 0)
797  {
798  png_write_finish_row(png_ptr);
799  return;
800  }
801  break;
802 
803  default: /* error: ignore it */
804  break;
805  }
806  }
807 #endif
808 
809  /* Set up row info for transformations */
810  row_info.color_type = png_ptr->color_type;
811  row_info.width = png_ptr->usr_width;
812  row_info.channels = png_ptr->usr_channels;
813  row_info.bit_depth = png_ptr->usr_bit_depth;
814  row_info.pixel_depth = (png_byte)(row_info.bit_depth * row_info.channels);
815  row_info.rowbytes = PNG_ROWBYTES(row_info.pixel_depth, row_info.width);
816 
817  png_debug1(3, "row_info->color_type = %d", row_info.color_type);
818  png_debug1(3, "row_info->width = %u", row_info.width);
819  png_debug1(3, "row_info->channels = %d", row_info.channels);
820  png_debug1(3, "row_info->bit_depth = %d", row_info.bit_depth);
821  png_debug1(3, "row_info->pixel_depth = %d", row_info.pixel_depth);
822  png_debug1(3, "row_info->rowbytes = %lu", (unsigned long)row_info.rowbytes);
823 
824  /* Copy user's row into buffer, leaving room for filter byte. */
825  memcpy(png_ptr->row_buf + 1, row, row_info.rowbytes);
826 
827 #ifdef PNG_WRITE_INTERLACING_SUPPORTED
828  /* Handle interlacing */
829  if (png_ptr->interlaced && png_ptr->pass < 6 &&
830  (png_ptr->transformations & PNG_INTERLACE) != 0)
831  {
832  png_do_write_interlace(&row_info, png_ptr->row_buf + 1, png_ptr->pass);
833  /* This should always get caught above, but still ... */
834  if (row_info.width == 0)
835  {
836  png_write_finish_row(png_ptr);
837  return;
838  }
839  }
840 #endif
841 
842 #ifdef PNG_WRITE_TRANSFORMS_SUPPORTED
843  /* Handle other transformations */
844  if (png_ptr->transformations != 0)
845  png_do_write_transformations(png_ptr, &row_info);
846 #endif
847 
848  /* At this point the row_info pixel depth must match the 'transformed' depth,
849  * which is also the output depth.
850  */
851  if (row_info.pixel_depth != png_ptr->pixel_depth ||
852  row_info.pixel_depth != png_ptr->transformed_pixel_depth)
853  png_error(png_ptr, "internal write transform logic error");
854 
855 #ifdef PNG_MNG_FEATURES_SUPPORTED
856  /* Write filter_method 64 (intrapixel differencing) only if
857  * 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and
858  * 2. Libpng did not write a PNG signature (this filter_method is only
859  * used in PNG datastreams that are embedded in MNG datastreams) and
860  * 3. The application called png_permit_mng_features with a mask that
861  * included PNG_FLAG_MNG_FILTER_64 and
862  * 4. The filter_method is 64 and
863  * 5. The color_type is RGB or RGBA
864  */
865  if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) != 0 &&
866  (png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING))
867  {
868  /* Intrapixel differencing */
869  png_do_write_intrapixel(&row_info, png_ptr->row_buf + 1);
870  }
871 #endif
872 
873 /* Added at libpng-1.5.10 */
874 #ifdef PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED
875  /* Check for out-of-range palette index */
876  if (row_info.color_type == PNG_COLOR_TYPE_PALETTE &&
877  png_ptr->num_palette_max >= 0)
878  png_do_check_palette_indexes(png_ptr, &row_info);
879 #endif
880 
881  /* Find a filter if necessary, filter the row and write it out. */
882  png_write_find_filter(png_ptr, &row_info);
883 
884  if (png_ptr->write_row_fn != NULL)
885  (*(png_ptr->write_row_fn))(png_ptr, png_ptr->row_number, png_ptr->pass);
886 }
#define PNG_BGR
Definition: pngpriv.h:560
Definition: png.h:894
#define PNG_INVERT_MONO
Definition: pngpriv.h:565
png_uint_32 row_number
Definition: pngstruct.h:220
void png_do_write_interlace(png_row_infop row_info, png_bytep row, int pass)
Definition: pngwutil.c:2141
png_write_status_ptr write_row_fn
Definition: pngstruct.h:316
png_uint_32 width
Definition: pngstruct.h:214
#define PNG_COLOR_TYPE_PALETTE
Definition: png.h:810
PNG_IMPEXP void() png_warning(png_const_structrp png_ptr, png_const_charp warning_message)
Definition: pngerror.c:216
void png_do_check_palette_indexes(png_structrp png_ptr, png_row_infop row_info)
Definition: pngtrans.c:684
png_byte transformed_pixel_depth
Definition: pngstruct.h:263
png_byte color_type
Definition: pngstruct.h:252
png_uint_32 width
Definition: png.h:896
#define PNG_FILLER
Definition: pngpriv.h:575
png_byte color_type
Definition: png.h:898
png_byte channels
Definition: png.h:900
void png_write_start_row(png_structrp png_ptr)
Definition: pngwutil.c:1943
png_uint_32 usr_width
Definition: pngstruct.h:217
void png_do_write_transformations(png_structrp png_ptr, png_row_infop row_info)
Definition: pngwtran.c:500
png_bytep row_buf
Definition: pngstruct.h:225
void png_write_find_filter(png_structrp png_ptr, png_row_infop row_info)
Definition: pngwutil.c:2326
#define PNG_SWAP_BYTES
Definition: pngpriv.h:564
#define PNG_PACKSWAP
Definition: pngpriv.h:576
#define png_debug1(l, m, p1)
Definition: pngdebug.h:149
png_byte pixel_depth
Definition: png.h:901
static void png_do_write_intrapixel(png_row_infop row_info, png_bytep row)
Definition: pngwrite.c:617
png_byte pixel_depth
Definition: pngstruct.h:255
#define PNG_FLAG_MNG_FILTER_64
Definition: png.h:996
png_size_t rowbytes
Definition: png.h:897
#define PNG_INTERLACE
Definition: pngpriv.h:561
void png_write_finish_row(png_structrp png_ptr)
Definition: pngwutil.c:2050
png_uint_32 mode
Definition: pngstruct.h:179
#define PNG_WROTE_INFO_BEFORE_PLTE
Definition: pngpriv.h:552
#define PNG_SHIFT
Definition: pngpriv.h:563
PNG_IMPEXP void() png_error(png_const_structrp png_ptr, png_const_charp error_message)
Definition: pngerror.c:40
png_byte usr_bit_depth
Definition: pngstruct.h:254
#define PNG_INTRAPIXEL_DIFFERENCING
Definition: png.h:824
#define PNG_ROWBYTES(pixel_bits, width)
Definition: pngpriv.h:660
png_uint_32 transformations
Definition: pngstruct.h:181
png_byte interlaced
Definition: pngstruct.h:249
png_byte pass
Definition: pngstruct.h:250
#define PNG_PACK
Definition: pngpriv.h:562
png_byte bit_depth
Definition: png.h:899
#define png_debug2(l, m, p1, p2)
Definition: pngdebug.h:152
void png_set_flush ( png_structrp  png_ptr,
int  nrows 
)
892 {
893  png_debug(1, "in png_set_flush");
894 
895  if (png_ptr == NULL)
896  return;
897 
898  png_ptr->flush_dist = (nrows < 0 ? 0 : nrows);
899 }
#define png_debug(l, m)
Definition: pngdebug.h:146
void png_write_flush ( png_structrp  png_ptr)
904 {
905  png_debug(1, "in png_write_flush");
906 
907  if (png_ptr == NULL)
908  return;
909 
910  /* We have already written out all of the data */
911  if (png_ptr->row_number >= png_ptr->num_rows)
912  return;
913 
914  png_compress_IDAT(png_ptr, NULL, 0, Z_SYNC_FLUSH);
915  png_ptr->flush_rows = 0;
916  png_flush(png_ptr);
917 }
void png_flush(png_structrp png_ptr)
Definition: pngwio.c:71
png_uint_32 row_number
Definition: pngstruct.h:220
#define png_debug(l, m)
Definition: pngdebug.h:146
png_uint_32 num_rows
Definition: pngstruct.h:216
#define Z_SYNC_FLUSH
Definition: zlib.h:166
void png_compress_IDAT(png_structrp png_ptr, png_const_bytep row_data, png_alloc_size_t row_data_length, int flush)
Definition: pngwutil.c:1008
static void png_reset_filter_heuristics ( png_structrp  png_ptr)
static
1140 {
1141  /* Clear out any old values in the 'weights' - this must be done because if
1142  * the app calls set_filter_heuristics multiple times with different
1143  * 'num_weights' values we would otherwise potentially have wrong sized
1144  * arrays.
1145  */
1146  png_ptr->num_prev_filters = 0;
1147  png_ptr->heuristic_method = PNG_FILTER_HEURISTIC_UNWEIGHTED;
1148  if (png_ptr->prev_filters != NULL)
1149  {
1150  png_bytep old = png_ptr->prev_filters;
1151  png_ptr->prev_filters = NULL;
1152  png_free(png_ptr, old);
1153  }
1154  if (png_ptr->filter_weights != NULL)
1155  {
1156  png_uint_16p old = png_ptr->filter_weights;
1157  png_ptr->filter_weights = NULL;
1158  png_free(png_ptr, old);
1159  }
1160 
1161  if (png_ptr->inv_filter_weights != NULL)
1162  {
1163  png_uint_16p old = png_ptr->inv_filter_weights;
1164  png_ptr->inv_filter_weights = NULL;
1165  png_free(png_ptr, old);
1166  }
1167 
1168  /* Leave the filter_costs - this array is fixed size. */
1169 }
png_byte * png_bytep
Definition: pngconf.h:600
#define PNG_FILTER_HEURISTIC_UNWEIGHTED
Definition: png.h:1661
png_uint_16 * png_uint_16p
Definition: pngconf.h:606
PNG_IMPEXP void() png_free(png_const_structrp png_ptr, png_voidp ptr)
Definition: pngmem.c:229
static void png_write_destroy ( png_structrp  png_ptr)
static
927 {
928  png_debug(1, "in png_write_destroy");
929 
930  /* Free any memory zlib uses */
931  if ((png_ptr->flags & PNG_FLAG_ZSTREAM_INITIALIZED) != 0)
932  deflateEnd(&png_ptr->zstream);
933 
934  /* Free our memory. png_free checks NULL for us. */
935  png_free_buffer_list(png_ptr, &png_ptr->zbuffer_list);
936  png_free(png_ptr, png_ptr->row_buf);
937  png_ptr->row_buf = NULL;
938 #ifdef PNG_WRITE_FILTER_SUPPORTED
939  png_free(png_ptr, png_ptr->prev_row);
940  png_free(png_ptr, png_ptr->sub_row);
941  png_free(png_ptr, png_ptr->up_row);
942  png_free(png_ptr, png_ptr->avg_row);
943  png_free(png_ptr, png_ptr->paeth_row);
944  png_ptr->prev_row = NULL;
945  png_ptr->sub_row = NULL;
946  png_ptr->up_row = NULL;
947  png_ptr->avg_row = NULL;
948  png_ptr->paeth_row = NULL;
949 #endif
950 
951 #ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
952  /* Use this to save a little code space, it doesn't free the filter_costs */
954  png_free(png_ptr, png_ptr->filter_costs);
955  png_free(png_ptr, png_ptr->inv_filter_costs);
956  png_ptr->filter_costs = NULL;
957  png_ptr->inv_filter_costs = NULL;
958 #endif
959 
960 #ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
961  png_free(png_ptr, png_ptr->chunk_list);
962  png_ptr->chunk_list = NULL;
963 #endif
964 
965  /* The error handling and memory handling information is left intact at this
966  * point: the jmp_buf may still have to be freed. See png_destroy_png_struct
967  * for how this happens.
968  */
969 }
z_stream zstream
Definition: pngstruct.h:184
#define png_debug(l, m)
Definition: pngdebug.h:146
int ZEXPORT deflateEnd(z_streamp strm)
Definition: deflate.c:979
png_bytep prev_row
Definition: pngstruct.h:222
png_uint_32 flags
Definition: pngstruct.h:180
png_bytep row_buf
Definition: pngstruct.h:225
#define PNG_FLAG_ZSTREAM_INITIALIZED
Definition: pngpriv.h:602
void png_free_buffer_list(png_structrp png_ptr, png_compression_bufferp *list)
Definition: pngwutil.c:440
PNG_IMPEXP void() png_free(png_const_structrp png_ptr, png_voidp ptr)
Definition: pngmem.c:229
static void png_reset_filter_heuristics(png_structrp png_ptr)
Definition: pngwrite.c:1139
void png_destroy_write_struct ( png_structpp  png_ptr_ptr,
png_infopp  info_ptr_ptr 
)
980 {
981  png_debug(1, "in png_destroy_write_struct");
982 
983  if (png_ptr_ptr != NULL)
984  {
985  png_structrp png_ptr = *png_ptr_ptr;
986 
987  if (png_ptr != NULL) /* added in libpng 1.6.0 */
988  {
989  png_destroy_info_struct(png_ptr, info_ptr_ptr);
990 
991  *png_ptr_ptr = NULL;
992  png_write_destroy(png_ptr);
993  png_destroy_png_struct(png_ptr);
994  }
995  }
996 }
#define png_debug(l, m)
Definition: pngdebug.h:146
Definition: pngstruct.h:144
static void png_write_destroy(png_structrp png_ptr)
Definition: pngwrite.c:926
void png_destroy_png_struct(png_structrp png_ptr)
Definition: pngmem.c:25
void png_destroy_info_struct(png_const_structrp png_ptr, png_infopp info_ptr_ptr)
Definition: png.c:359
void png_set_filter ( png_structrp  png_ptr,
int  method,
int  filters 
)
1001 {
1002  png_debug(1, "in png_set_filter");
1003 
1004  if (png_ptr == NULL)
1005  return;
1006 
1007 #ifdef PNG_MNG_FEATURES_SUPPORTED
1008  if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) != 0 &&
1009  (method == PNG_INTRAPIXEL_DIFFERENCING))
1010  method = PNG_FILTER_TYPE_BASE;
1011 
1012 #endif
1013  if (method == PNG_FILTER_TYPE_BASE)
1014  {
1015  switch (filters & (PNG_ALL_FILTERS | 0x07))
1016  {
1017 #ifdef PNG_WRITE_FILTER_SUPPORTED
1018  case 5:
1019  case 6:
1020  case 7: png_app_error(png_ptr, "Unknown row filter for method 0");
1021  /* FALL THROUGH */
1022 #endif /* WRITE_FILTER */
1023  case PNG_FILTER_VALUE_NONE:
1024  png_ptr->do_filter = PNG_FILTER_NONE; break;
1025 
1026 #ifdef PNG_WRITE_FILTER_SUPPORTED
1027  case PNG_FILTER_VALUE_SUB:
1028  png_ptr->do_filter = PNG_FILTER_SUB; break;
1029 
1030  case PNG_FILTER_VALUE_UP:
1031  png_ptr->do_filter = PNG_FILTER_UP; break;
1032 
1033  case PNG_FILTER_VALUE_AVG:
1034  png_ptr->do_filter = PNG_FILTER_AVG; break;
1035 
1037  png_ptr->do_filter = PNG_FILTER_PAETH; break;
1038 
1039  default:
1040  png_ptr->do_filter = (png_byte)filters; break;
1041 #else
1042  default:
1043  png_app_error(png_ptr, "Unknown row filter for method 0");
1044 #endif /* WRITE_FILTER */
1045  }
1046 
1047  /* If we have allocated the row_buf, this means we have already started
1048  * with the image and we should have allocated all of the filter buffers
1049  * that have been selected. If prev_row isn't already allocated, then
1050  * it is too late to start using the filters that need it, since we
1051  * will be missing the data in the previous row. If an application
1052  * wants to start and stop using particular filters during compression,
1053  * it should start out with all of the filters, and then add and
1054  * remove them after the start of compression.
1055  */
1056  if (png_ptr->row_buf != NULL)
1057  {
1058 #ifdef PNG_WRITE_FILTER_SUPPORTED
1059  if ((png_ptr->do_filter & PNG_FILTER_SUB) != 0 &&
1060  png_ptr->sub_row == NULL)
1061  {
1062  png_ptr->sub_row = (png_bytep)png_malloc(png_ptr,
1063  (png_ptr->rowbytes + 1));
1064  png_ptr->sub_row[0] = PNG_FILTER_VALUE_SUB;
1065  }
1066 
1067  if ((png_ptr->do_filter & PNG_FILTER_UP) != 0 &&
1068  png_ptr->up_row == NULL)
1069  {
1070  if (png_ptr->prev_row == NULL)
1071  {
1072  png_warning(png_ptr, "Can't add Up filter after starting");
1073  png_ptr->do_filter = (png_byte)(png_ptr->do_filter &
1074  ~PNG_FILTER_UP);
1075  }
1076 
1077  else
1078  {
1079  png_ptr->up_row = (png_bytep)png_malloc(png_ptr,
1080  (png_ptr->rowbytes + 1));
1081  png_ptr->up_row[0] = PNG_FILTER_VALUE_UP;
1082  }
1083  }
1084 
1085  if ((png_ptr->do_filter & PNG_FILTER_AVG) != 0 &&
1086  png_ptr->avg_row == NULL)
1087  {
1088  if (png_ptr->prev_row == NULL)
1089  {
1090  png_warning(png_ptr, "Can't add Average filter after starting");
1091  png_ptr->do_filter = (png_byte)(png_ptr->do_filter &
1092  ~PNG_FILTER_AVG);
1093  }
1094 
1095  else
1096  {
1097  png_ptr->avg_row = (png_bytep)png_malloc(png_ptr,
1098  (png_ptr->rowbytes + 1));
1099  png_ptr->avg_row[0] = PNG_FILTER_VALUE_AVG;
1100  }
1101  }
1102 
1103  if ((png_ptr->do_filter & PNG_FILTER_PAETH) != 0 &&
1104  png_ptr->paeth_row == NULL)
1105  {
1106  if (png_ptr->prev_row == NULL)
1107  {
1108  png_warning(png_ptr, "Can't add Paeth filter after starting");
1109  png_ptr->do_filter &= (png_byte)(~PNG_FILTER_PAETH);
1110  }
1111 
1112  else
1113  {
1114  png_ptr->paeth_row = (png_bytep)png_malloc(png_ptr,
1115  (png_ptr->rowbytes + 1));
1116  png_ptr->paeth_row[0] = PNG_FILTER_VALUE_PAETH;
1117  }
1118  }
1119 
1120  if (png_ptr->do_filter == PNG_NO_FILTERS)
1121 #endif /* WRITE_FILTER */
1122  png_ptr->do_filter = PNG_FILTER_NONE;
1123  }
1124  }
1125  else
1126  png_error(png_ptr, "Unknown custom filter method");
1127 }
#define PNG_FILTER_VALUE_AVG
Definition: png.h:1615
PNG_IMPEXP png_voidp() png_malloc(png_const_structrp png_ptr, png_alloc_size_t size)
Definition: pngmem.c:169
#define PNG_FILTER_PAETH
Definition: png.h:1605
#define PNG_NO_FILTERS
Definition: png.h:1600
#define PNG_FILTER_SUB
Definition: png.h:1602
png_byte * png_bytep
Definition: pngconf.h:600
#define PNG_FILTER_VALUE_PAETH
Definition: png.h:1616
PNG_IMPEXP void() png_warning(png_const_structrp png_ptr, png_const_charp warning_message)
Definition: pngerror.c:216
#define png_debug(l, m)
Definition: pngdebug.h:146
png_byte do_filter
Definition: pngstruct.h:251
png_bytep prev_row
Definition: pngstruct.h:222
void png_app_error(png_const_structrp png_ptr, png_const_charp error_message)
Definition: pngerror.c:405
#define PNG_FILTER_VALUE_SUB
Definition: png.h:1613
png_bytep row_buf
Definition: pngstruct.h:225
#define PNG_ALL_FILTERS
Definition: png.h:1606
#define PNG_FILTER_UP
Definition: png.h:1603
#define PNG_FILTER_AVG
Definition: png.h:1604
#define PNG_FILTER_VALUE_UP
Definition: png.h:1614
#define PNG_FLAG_MNG_FILTER_64
Definition: png.h:996
#define PNG_FILTER_TYPE_BASE
Definition: png.h:823
png_size_t rowbytes
Definition: pngstruct.h:218
PNG_IMPEXP void() png_error(png_const_structrp png_ptr, png_const_charp error_message)
Definition: pngerror.c:40
#define PNG_FILTER_VALUE_NONE
Definition: png.h:1612
#define PNG_INTRAPIXEL_DIFFERENCING
Definition: png.h:824
#define PNG_FILTER_NONE
Definition: png.h:1601
static int png_init_filter_heuristics ( png_structrp  png_ptr,
int  heuristic_method,
int  num_weights 
)
static
1174 {
1175  if (png_ptr == NULL)
1176  return 0;
1177 
1178  /* Clear out the arrays */
1179  png_reset_filter_heuristics(png_ptr);
1180 
1181  /* Check arguments; the 'reset' function makes the correct settings for the
1182  * unweighted case, but we must handle the weight case by initializing the
1183  * arrays for the caller.
1184  */
1185  if (heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
1186  {
1187  int i;
1188 
1189  if (num_weights > 0)
1190  {
1191  png_ptr->prev_filters = (png_bytep)png_malloc(png_ptr,
1192  (png_uint_32)((sizeof (png_byte)) * num_weights));
1193 
1194  /* To make sure that the weighting starts out fairly */
1195  for (i = 0; i < num_weights; i++)
1196  {
1197  png_ptr->prev_filters[i] = 255;
1198  }
1199 
1200  png_ptr->filter_weights = (png_uint_16p)png_malloc(png_ptr,
1201  (png_uint_32)((sizeof (png_uint_16)) * num_weights));
1202 
1203  png_ptr->inv_filter_weights = (png_uint_16p)png_malloc(png_ptr,
1204  (png_uint_32)((sizeof (png_uint_16)) * num_weights));
1205 
1206  for (i = 0; i < num_weights; i++)
1207  {
1208  png_ptr->inv_filter_weights[i] =
1209  png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR;
1210  }
1211 
1212  /* Safe to set this now */
1213  png_ptr->num_prev_filters = (png_byte)num_weights;
1214  }
1215 
1216  /* If, in the future, there are other filter methods, this would
1217  * need to be based on png_ptr->filter.
1218  */
1219  if (png_ptr->filter_costs == NULL)
1220  {
1221  png_ptr->filter_costs = (png_uint_16p)png_malloc(png_ptr,
1222  (png_uint_32)((sizeof (png_uint_16)) * PNG_FILTER_VALUE_LAST));
1223 
1224  png_ptr->inv_filter_costs = (png_uint_16p)png_malloc(png_ptr,
1225  (png_uint_32)((sizeof (png_uint_16)) * PNG_FILTER_VALUE_LAST));
1226  }
1227 
1228  for (i = 0; i < PNG_FILTER_VALUE_LAST; i++)
1229  {
1230  png_ptr->inv_filter_costs[i] =
1231  png_ptr->filter_costs[i] = PNG_COST_FACTOR;
1232  }
1233 
1234  /* All the arrays are inited, safe to set this: */
1235  png_ptr->heuristic_method = PNG_FILTER_HEURISTIC_WEIGHTED;
1236 
1237  /* Return the 'ok' code. */
1238  return 1;
1239  }
1240  else if (heuristic_method == PNG_FILTER_HEURISTIC_DEFAULT ||
1241  heuristic_method == PNG_FILTER_HEURISTIC_UNWEIGHTED)
1242  {
1243  return 1;
1244  }
1245  else
1246  {
1247  png_warning(png_ptr, "Unknown filter heuristic method");
1248  return 0;
1249  }
1250 }
PNG_IMPEXP png_voidp() png_malloc(png_const_structrp png_ptr, png_alloc_size_t size)
Definition: pngmem.c:169
#define PNG_FILTER_VALUE_LAST
Definition: png.h:1617
#define PNG_FILTER_HEURISTIC_WEIGHTED
Definition: png.h:1662
int i
Definition: rw_test.cpp:37
png_byte * png_bytep
Definition: pngconf.h:600
PNG_IMPEXP void() png_warning(png_const_structrp png_ptr, png_const_charp warning_message)
Definition: pngerror.c:216
#define PNG_COST_FACTOR
Definition: pngpriv.h:598
#define PNG_FILTER_HEURISTIC_UNWEIGHTED
Definition: png.h:1661
#define PNG_WEIGHT_FACTOR
Definition: pngpriv.h:597
png_uint_16 * png_uint_16p
Definition: pngconf.h:606
#define PNG_FILTER_HEURISTIC_DEFAULT
Definition: png.h:1660
static void png_reset_filter_heuristics(png_structrp png_ptr)
Definition: pngwrite.c:1139
void png_set_filter_heuristics ( png_structrp  png_ptr,
int  heuristic_method,
int  num_weights,
png_const_doublep  filter_weights,
png_const_doublep  filter_costs 
)
1258 {
1259  png_debug(1, "in png_set_filter_heuristics");
1260 
1261  /* The internal API allocates all the arrays and ensures that the elements of
1262  * those arrays are set to the default value.
1263  */
1264  if (png_init_filter_heuristics(png_ptr, heuristic_method, num_weights) == 0)
1265  return;
1266 
1267  /* If using the weighted method copy in the weights. */
1268  if (heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
1269  {
1270  int i;
1271  for (i = 0; i < num_weights; i++)
1272  {
1273  if (filter_weights[i] <= 0.0)
1274  {
1275  png_ptr->inv_filter_weights[i] =
1276  png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR;
1277  }
1278 
1279  else
1280  {
1281  png_ptr->inv_filter_weights[i] =
1282  (png_uint_16)(PNG_WEIGHT_FACTOR*filter_weights[i]+.5);
1283 
1284  png_ptr->filter_weights[i] =
1285  (png_uint_16)(PNG_WEIGHT_FACTOR/filter_weights[i]+.5);
1286  }
1287  }
1288 
1289  /* Here is where we set the relative costs of the different filters. We
1290  * should take the desired compression level into account when setting
1291  * the costs, so that Paeth, for instance, has a high relative cost at low
1292  * compression levels, while it has a lower relative cost at higher
1293  * compression settings. The filter types are in order of increasing
1294  * relative cost, so it would be possible to do this with an algorithm.
1295  */
1296  for (i = 0; i < PNG_FILTER_VALUE_LAST; i++) if (filter_costs[i] >= 1.0)
1297  {
1298  png_ptr->inv_filter_costs[i] =
1299  (png_uint_16)(PNG_COST_FACTOR / filter_costs[i] + .5);
1300 
1301  png_ptr->filter_costs[i] =
1302  (png_uint_16)(PNG_COST_FACTOR * filter_costs[i] + .5);
1303  }
1304  }
1305 }
#define PNG_FILTER_HEURISTIC_WEIGHTED
Definition: png.h:1662
int i
Definition: rw_test.cpp:37
#define png_debug(l, m)
Definition: pngdebug.h:146
#define PNG_COST_FACTOR
Definition: pngpriv.h:598
#define PNG_WEIGHT_FACTOR
Definition: pngpriv.h:597
static int png_init_filter_heuristics(png_structrp png_ptr, int heuristic_method, int num_weights)
Definition: pngwrite.c:1172
void png_set_filter_heuristics_fixed ( png_structrp  png_ptr,
int  heuristic_method,
int  num_weights,
png_const_fixed_point_p  filter_weights,
png_const_fixed_point_p  filter_costs 
)
1313 {
1314  png_debug(1, "in png_set_filter_heuristics_fixed");
1315 
1316  /* The internal API allocates all the arrays and ensures that the elements of
1317  * those arrays are set to the default value.
1318  */
1319  if (png_init_filter_heuristics(png_ptr, heuristic_method, num_weights) == 0)
1320  return;
1321 
1322  /* If using the weighted method copy in the weights. */
1323  if (heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
1324  {
1325  int i;
1326  for (i = 0; i < num_weights; i++)
1327  {
1328  if (filter_weights[i] <= 0)
1329  {
1330  png_ptr->inv_filter_weights[i] =
1331  png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR;
1332  }
1333 
1334  else
1335  {
1336  png_ptr->inv_filter_weights[i] = (png_uint_16)
1337  ((PNG_WEIGHT_FACTOR*filter_weights[i]+PNG_FP_HALF)/PNG_FP_1);
1338 
1339  png_ptr->filter_weights[i] = (png_uint_16)((PNG_WEIGHT_FACTOR*
1340  PNG_FP_1+(filter_weights[i]/2))/filter_weights[i]);
1341  }
1342  }
1343 
1344  /* Here is where we set the relative costs of the different filters. We
1345  * should take the desired compression level into account when setting
1346  * the costs, so that Paeth, for instance, has a high relative cost at low
1347  * compression levels, while it has a lower relative cost at higher
1348  * compression settings. The filter types are in order of increasing
1349  * relative cost, so it would be possible to do this with an algorithm.
1350  */
1351  for (i = 0; i < PNG_FILTER_VALUE_LAST; i++)
1352  if (filter_costs[i] >= PNG_FP_1)
1353  {
1354  png_uint_32 tmp;
1355 
1356  /* Use a 32 bit unsigned temporary here because otherwise the
1357  * intermediate value will be a 32 bit *signed* integer (ANSI rules)
1358  * and this will get the wrong answer on division.
1359  */
1360  tmp = PNG_COST_FACTOR*PNG_FP_1 + (filter_costs[i]/2);
1361  tmp /= filter_costs[i];
1362 
1363  png_ptr->inv_filter_costs[i] = (png_uint_16)tmp;
1364 
1365  tmp = PNG_COST_FACTOR * filter_costs[i] + PNG_FP_HALF;
1366  tmp /= PNG_FP_1;
1367 
1368  png_ptr->filter_costs[i] = (png_uint_16)tmp;
1369  }
1370  }
1371 }
#define PNG_FILTER_VALUE_LAST
Definition: png.h:1617
#define PNG_FILTER_HEURISTIC_WEIGHTED
Definition: png.h:1662
int i
Definition: rw_test.cpp:37
#define png_debug(l, m)
Definition: pngdebug.h:146
#define PNG_FP_HALF
Definition: png.h:798
#define PNG_COST_FACTOR
Definition: pngpriv.h:598
#define PNG_WEIGHT_FACTOR
Definition: pngpriv.h:597
#define PNG_FP_1
Definition: png.h:797
static int png_init_filter_heuristics(png_structrp png_ptr, int heuristic_method, int num_weights)
Definition: pngwrite.c:1172
void png_set_compression_level ( png_structrp  png_ptr,
int  level 
)
1377 {
1378  png_debug(1, "in png_set_compression_level");
1379 
1380  if (png_ptr == NULL)
1381  return;
1382 
1383  png_ptr->zlib_level = level;
1384 }
#define png_debug(l, m)
Definition: pngdebug.h:146
void png_set_compression_mem_level ( png_structrp  png_ptr,
int  mem_level 
)
1388 {
1389  png_debug(1, "in png_set_compression_mem_level");
1390 
1391  if (png_ptr == NULL)
1392  return;
1393 
1394  png_ptr->zlib_mem_level = mem_level;
1395 }
#define png_debug(l, m)
Definition: pngdebug.h:146
void png_set_compression_strategy ( png_structrp  png_ptr,
int  strategy 
)
1399 {
1400  png_debug(1, "in png_set_compression_strategy");
1401 
1402  if (png_ptr == NULL)
1403  return;
1404 
1405  /* The flag setting here prevents the libpng dynamic selection of strategy.
1406  */
1408  png_ptr->zlib_strategy = strategy;
1409 }
#define png_debug(l, m)
Definition: pngdebug.h:146
png_uint_32 flags
Definition: pngstruct.h:180
const JsonParse strategy
Definition: json11.cpp:364
#define PNG_FLAG_ZLIB_CUSTOM_STRATEGY
Definition: pngpriv.h:601
void png_set_compression_window_bits ( png_structrp  png_ptr,
int  window_bits 
)
1416 {
1417  if (png_ptr == NULL)
1418  return;
1419 
1420  /* Prior to 1.6.0 this would warn but then set the window_bits value, this
1421  * meant that negative window bits values could be selected which would cause
1422  * libpng to write a non-standard PNG file with raw deflate or gzip
1423  * compressed IDAT or ancillary chunks. Such files can be read and there is
1424  * no warning on read, so this seems like a very bad idea.
1425  */
1426  if (window_bits > 15)
1427  {
1428  png_warning(png_ptr, "Only compression windows <= 32k supported by PNG");
1429  window_bits = 15;
1430  }
1431 
1432  else if (window_bits < 8)
1433  {
1434  png_warning(png_ptr, "Only compression windows >= 256 supported by PNG");
1435  window_bits = 8;
1436  }
1437 
1438  png_ptr->zlib_window_bits = window_bits;
1439 }
PNG_IMPEXP void() png_warning(png_const_structrp png_ptr, png_const_charp warning_message)
Definition: pngerror.c:216
void png_set_compression_method ( png_structrp  png_ptr,
int  method 
)
1443 {
1444  png_debug(1, "in png_set_compression_method");
1445 
1446  if (png_ptr == NULL)
1447  return;
1448 
1449  /* This would produce an invalid PNG file if it worked, but it doesn't and
1450  * deflate will fault it, so it is harmless to just warn here.
1451  */
1452  if (method != 8)
1453  png_warning(png_ptr, "Only compression method 8 is supported by PNG");
1454 
1455  png_ptr->zlib_method = method;
1456 }
PNG_IMPEXP void() png_warning(png_const_structrp png_ptr, png_const_charp warning_message)
Definition: pngerror.c:216
#define png_debug(l, m)
Definition: pngdebug.h:146
void png_set_text_compression_level ( png_structrp  png_ptr,
int  level 
)
1462 {
1463  png_debug(1, "in png_set_text_compression_level");
1464 
1465  if (png_ptr == NULL)
1466  return;
1467 
1468  png_ptr->zlib_text_level = level;
1469 }
#define png_debug(l, m)
Definition: pngdebug.h:146
void png_set_text_compression_mem_level ( png_structrp  png_ptr,
int  mem_level 
)
1473 {
1474  png_debug(1, "in png_set_text_compression_mem_level");
1475 
1476  if (png_ptr == NULL)
1477  return;
1478 
1479  png_ptr->zlib_text_mem_level = mem_level;
1480 }
#define png_debug(l, m)
Definition: pngdebug.h:146
void png_set_text_compression_strategy ( png_structrp  png_ptr,
int  strategy 
)
1484 {
1485  png_debug(1, "in png_set_text_compression_strategy");
1486 
1487  if (png_ptr == NULL)
1488  return;
1489 
1490  png_ptr->zlib_text_strategy = strategy;
1491 }
#define png_debug(l, m)
Definition: pngdebug.h:146
const JsonParse strategy
Definition: json11.cpp:364
void png_set_text_compression_window_bits ( png_structrp  png_ptr,
int  window_bits 
)
1498 {
1499  if (png_ptr == NULL)
1500  return;
1501 
1502  if (window_bits > 15)
1503  {
1504  png_warning(png_ptr, "Only compression windows <= 32k supported by PNG");
1505  window_bits = 15;
1506  }
1507 
1508  else if (window_bits < 8)
1509  {
1510  png_warning(png_ptr, "Only compression windows >= 256 supported by PNG");
1511  window_bits = 8;
1512  }
1513 
1514  png_ptr->zlib_text_window_bits = window_bits;
1515 }
PNG_IMPEXP void() png_warning(png_const_structrp png_ptr, png_const_charp warning_message)
Definition: pngerror.c:216
void png_set_text_compression_method ( png_structrp  png_ptr,
int  method 
)
1519 {
1520  png_debug(1, "in png_set_text_compression_method");
1521 
1522  if (png_ptr == NULL)
1523  return;
1524 
1525  if (method != 8)
1526  png_warning(png_ptr, "Only compression method 8 is supported by PNG");
1527 
1528  png_ptr->zlib_text_method = method;
1529 }
PNG_IMPEXP void() png_warning(png_const_structrp png_ptr, png_const_charp warning_message)
Definition: pngerror.c:216
#define png_debug(l, m)
Definition: pngdebug.h:146
void png_set_write_status_fn ( png_structrp  png_ptr,
png_write_status_ptr  write_row_fn 
)
1535 {
1536  if (png_ptr == NULL)
1537  return;
1538 
1539  png_ptr->write_row_fn = write_row_fn;
1540 }
png_write_status_ptr write_row_fn
Definition: pngstruct.h:316
void png_set_write_user_transform_fn ( png_structrp  png_ptr,
png_user_transform_ptr  write_user_transform_fn 
)
1546 {
1547  png_debug(1, "in png_set_write_user_transform_fn");
1548 
1549  if (png_ptr == NULL)
1550  return;
1551 
1552  png_ptr->transformations |= PNG_USER_TRANSFORM;
1553  png_ptr->write_user_transform_fn = write_user_transform_fn;
1554 }
#define png_debug(l, m)
Definition: pngdebug.h:146
#define PNG_USER_TRANSFORM
Definition: pngpriv.h:580
png_uint_32 transformations
Definition: pngstruct.h:181
void png_write_png ( png_structrp  png_ptr,
png_inforp  info_ptr,
int  transforms,
voidp  params 
)
1562 {
1563  if (png_ptr == NULL || info_ptr == NULL)
1564  return;
1565 
1566  if ((info_ptr->valid & PNG_INFO_IDAT) == 0)
1567  {
1568  png_app_error(png_ptr, "no rows for png_write_image to write");
1569  return;
1570  }
1571 
1572  /* Write the file header information. */
1573  png_write_info(png_ptr, info_ptr);
1574 
1575  /* ------ these transformations don't touch the info structure ------- */
1576 
1577  /* Invert monochrome pixels */
1578  if ((transforms & PNG_TRANSFORM_INVERT_MONO) != 0)
1579 #ifdef PNG_WRITE_INVERT_SUPPORTED
1580  png_set_invert_mono(png_ptr);
1581 #else
1582  png_app_error(png_ptr, "PNG_TRANSFORM_INVERT_MONO not supported");
1583 #endif
1584 
1585  /* Shift the pixels up to a legal bit depth and fill in
1586  * as appropriate to correctly scale the image.
1587  */
1588  if ((transforms & PNG_TRANSFORM_SHIFT) != 0)
1589 #ifdef PNG_WRITE_SHIFT_SUPPORTED
1590  if ((info_ptr->valid & PNG_INFO_sBIT) != 0)
1591  png_set_shift(png_ptr, &info_ptr->sig_bit);
1592 #else
1593  png_app_error(png_ptr, "PNG_TRANSFORM_SHIFT not supported");
1594 #endif
1595 
1596  /* Pack pixels into bytes */
1597  if ((transforms & PNG_TRANSFORM_PACKING) != 0)
1598 #ifdef PNG_WRITE_PACK_SUPPORTED
1599  png_set_packing(png_ptr);
1600 #else
1601  png_app_error(png_ptr, "PNG_TRANSFORM_PACKING not supported");
1602 #endif
1603 
1604  /* Swap location of alpha bytes from ARGB to RGBA */
1605  if ((transforms & PNG_TRANSFORM_SWAP_ALPHA) != 0)
1606 #ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED
1607  png_set_swap_alpha(png_ptr);
1608 #else
1609  png_app_error(png_ptr, "PNG_TRANSFORM_SWAP_ALPHA not supported");
1610 #endif
1611 
1612  /* Remove a filler (X) from XRGB/RGBX/AG/GA into to convert it into
1613  * RGB, note that the code expects the input color type to be G or RGB; no
1614  * alpha channel.
1615  */
1616  if ((transforms & (PNG_TRANSFORM_STRIP_FILLER_AFTER|
1618  {
1619 #ifdef PNG_WRITE_FILLER_SUPPORTED
1620  if ((transforms & PNG_TRANSFORM_STRIP_FILLER_AFTER) != 0)
1621  {
1622  if ((transforms & PNG_TRANSFORM_STRIP_FILLER_BEFORE) != 0)
1623  png_app_error(png_ptr,
1624  "PNG_TRANSFORM_STRIP_FILLER: BEFORE+AFTER not supported");
1625 
1626  /* Continue if ignored - this is the pre-1.6.10 behavior */
1627  png_set_filler(png_ptr, 0, PNG_FILLER_AFTER);
1628  }
1629 
1630  else if ((transforms & PNG_TRANSFORM_STRIP_FILLER_BEFORE) != 0)
1631  png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE);
1632 #else
1633  png_app_error(png_ptr, "PNG_TRANSFORM_STRIP_FILLER not supported");
1634 #endif
1635  }
1636 
1637  /* Flip BGR pixels to RGB */
1638  if ((transforms & PNG_TRANSFORM_BGR) != 0)
1639 #ifdef PNG_WRITE_BGR_SUPPORTED
1640  png_set_bgr(png_ptr);
1641 #else
1642  png_app_error(png_ptr, "PNG_TRANSFORM_BGR not supported");
1643 #endif
1644 
1645  /* Swap bytes of 16-bit files to most significant byte first */
1646  if ((transforms & PNG_TRANSFORM_SWAP_ENDIAN) != 0)
1647 #ifdef PNG_WRITE_SWAP_SUPPORTED
1648  png_set_swap(png_ptr);
1649 #else
1650  png_app_error(png_ptr, "PNG_TRANSFORM_SWAP_ENDIAN not supported");
1651 #endif
1652 
1653  /* Swap bits of 1, 2, 4 bit packed pixel formats */
1654  if ((transforms & PNG_TRANSFORM_PACKSWAP) != 0)
1655 #ifdef PNG_WRITE_PACKSWAP_SUPPORTED
1656  png_set_packswap(png_ptr);
1657 #else
1658  png_app_error(png_ptr, "PNG_TRANSFORM_PACKSWAP not supported");
1659 #endif
1660 
1661  /* Invert the alpha channel from opacity to transparency */
1662  if ((transforms & PNG_TRANSFORM_INVERT_ALPHA) != 0)
1663 #ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED
1664  png_set_invert_alpha(png_ptr);
1665 #else
1666  png_app_error(png_ptr, "PNG_TRANSFORM_INVERT_ALPHA not supported");
1667 #endif
1668 
1669  /* ----------------------- end of transformations ------------------- */
1670 
1671  /* Write the bits */
1672  png_write_image(png_ptr, info_ptr->row_pointers);
1673 
1674  /* It is REQUIRED to call this to finish writing the rest of the file */
1675  png_write_end(png_ptr, info_ptr);
1676 
1677  PNG_UNUSED(params)
1678 }
#define PNG_TRANSFORM_SWAP_ENDIAN
Definition: png.h:982
#define PNG_FILLER_BEFORE
Definition: png.h:1386
#define PNG_UNUSED(param)
Definition: pngpriv.h:367
PNG_IMPEXP void() png_set_swap_alpha(png_structrp png_ptr)
Definition: pngtrans.c:222
#define PNG_TRANSFORM_INVERT_MONO
Definition: png.h:978
PNG_IMPEXP void() png_set_bgr(png_structrp png_ptr)
Definition: pngtrans.c:21
#define PNG_TRANSFORM_PACKSWAP
Definition: png.h:976
#define PNG_TRANSFORM_BGR
Definition: png.h:980
PNG_IMPEXP void() png_set_swap(png_structrp png_ptr)
Definition: pngtrans.c:35
#define PNG_TRANSFORM_STRIP_FILLER_AFTER
Definition: png.h:987
void png_write_image(png_structrp png_ptr, png_bytepp image)
Definition: pngwrite.c:584
PNG_IMPEXP void() png_set_packing(png_structrp png_ptr)
Definition: pngtrans.c:50
void png_app_error(png_const_structrp png_ptr, png_const_charp error_message)
Definition: pngerror.c:405
void png_write_info(png_structrp png_ptr, png_const_inforp info_ptr)
Definition: pngwrite.c:191
#define PNG_TRANSFORM_STRIP_FILLER_BEFORE
Definition: png.h:986
PNG_IMPEXP void() png_set_invert_mono(png_structrp png_ptr)
Definition: pngtrans.c:249
#define PNG_INFO_sBIT
Definition: png.h:874
#define PNG_TRANSFORM_PACKING
Definition: png.h:975
#define PNG_TRANSFORM_INVERT_ALPHA
Definition: png.h:983
PNG_IMPEXP void() png_set_filler(png_structrp png_ptr, png_uint_32 filler, int flags)
Definition: pngtrans.c:120
#define PNG_INFO_IDAT
Definition: png.h:888
png_uint_32 valid
Definition: pnginfo.h:61
#define PNG_TRANSFORM_SWAP_ALPHA
Definition: png.h:981
#define PNG_FILLER_AFTER
Definition: png.h:1387
PNG_IMPEXP void() png_set_packswap(png_structrp png_ptr)
Definition: pngtrans.c:70
#define PNG_TRANSFORM_SHIFT
Definition: png.h:979
PNG_IMPEXP void() png_set_invert_alpha(png_structrp png_ptr)
Definition: pngtrans.c:236
PNG_IMPEXP void() png_set_shift(png_structrp png_ptr, png_const_color_8p true_bits)
Definition: pngtrans.c:84
void png_write_end(png_structrp png_ptr, png_inforp info_ptr)
Definition: pngwrite.c:347
static int png_image_write_init ( png_imagep  image)
static
1687 {
1690 
1691  if (png_ptr != NULL)
1692  {
1693  png_infop info_ptr = png_create_info_struct(png_ptr);
1694 
1695  if (info_ptr != NULL)
1696  {
1698  png_malloc_warn(png_ptr, (sizeof *control)));
1699 
1700  if (control != NULL)
1701  {
1702  memset(control, 0, (sizeof *control));
1703 
1704  control->png_ptr = png_ptr;
1705  control->info_ptr = info_ptr;
1706  control->for_write = 1;
1707 
1708  image->opaque = control;
1709  return 1;
1710  }
1711 
1712  /* Error clean up */
1713  png_destroy_info_struct(png_ptr, &info_ptr);
1714  }
1715 
1716  png_destroy_write_struct(&png_ptr, NULL);
1717  }
1718 
1719  return png_image_error(image, "png_image_write_: out of memory");
1720 }
png_controlp opaque
Definition: png.h:2809
Definition: pngpriv.h:1865
png_structp png_create_write_struct(png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn)
Definition: pngwrite.c:482
#define PNG_LIBPNG_VER_STRING
Definition: png.h:426
PNG_IMPEXP png_voidp() png_malloc_warn(png_const_structrp png_ptr, png_alloc_size_t size)
Definition: pngmem.c:210
void png_safe_warning(png_structp png_nonconst_ptr, png_const_charp warning_message)
Definition: pngerror.c:921
Definition: pngstruct.h:144
#define png_voidcast(type, value)
Definition: pngpriv.h:408
int png_image_error(png_imagep image, png_const_charp error_message)
Definition: png.c:4483
Definition: pnginfo.h:56
png_infop png_create_info_struct(png_const_structrp png_ptr)
Definition: png.c:327
png_structp png_ptr
Definition: pngpriv.h:1867
png_infop info_ptr
Definition: pngpriv.h:1868
void png_destroy_write_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr)
Definition: pngwrite.c:979
unsigned int for_write
Definition: pngpriv.h:1874
void() png_safe_error(png_structp png_nonconst_ptr, png_const_charp error_message)
Definition: pngerror.c:886
void png_destroy_info_struct(png_const_structrp png_ptr, png_infopp info_ptr_ptr)
Definition: png.c:359
static int png_write_image_16bit ( png_voidp  argument)
static
1743 {
1745  argument);
1746  png_imagep image = display->image;
1747  png_structrp png_ptr = image->opaque->png_ptr;
1748 
1750  display->first_row);
1752  png_uint_16p row_end;
1753  const int channels = (image->format & PNG_FORMAT_FLAG_COLOR) != 0 ? 3 : 1;
1754  int aindex = 0;
1755  png_uint_32 y = image->height;
1756 
1757  if ((image->format & PNG_FORMAT_FLAG_ALPHA) != 0)
1758  {
1759 # ifdef PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED
1760  if ((image->format & PNG_FORMAT_FLAG_AFIRST) != 0)
1761  {
1762  aindex = -1;
1763  ++input_row; /* To point to the first component */
1764  ++output_row;
1765  }
1766 
1767  else
1768 # endif
1769  aindex = channels;
1770  }
1771 
1772  else
1773  png_error(png_ptr, "png_write_image: internal call error");
1774 
1775  /* Work out the output row end and count over this, note that the increment
1776  * above to 'row' means that row_end can actually be beyond the end of the
1777  * row; this is correct.
1778  */
1779  row_end = output_row + image->width * (channels+1);
1780 
1781  while (y-- > 0)
1782  {
1783  png_const_uint_16p in_ptr = input_row;
1784  png_uint_16p out_ptr = output_row;
1785 
1786  while (out_ptr < row_end)
1787  {
1788  const png_uint_16 alpha = in_ptr[aindex];
1789  png_uint_32 reciprocal = 0;
1790  int c;
1791 
1792  out_ptr[aindex] = alpha;
1793 
1794  /* Calculate a reciprocal. The correct calculation is simply
1795  * component/alpha*65535 << 15. (I.e. 15 bits of precision); this
1796  * allows correct rounding by adding .5 before the shift. 'reciprocal'
1797  * is only initialized when required.
1798  */
1799  if (alpha > 0 && alpha < 65535)
1800  reciprocal = ((0xffff<<15)+(alpha>>1))/alpha;
1801 
1802  c = channels;
1803  do /* always at least one channel */
1804  {
1805  png_uint_16 component = *in_ptr++;
1806 
1807  /* The following gives 65535 for an alpha of 0, which is fine,
1808  * otherwise if 0/0 is represented as some other value there is more
1809  * likely to be a discontinuity which will probably damage
1810  * compression when moving from a fully transparent area to a
1811  * nearly transparent one. (The assumption here is that opaque
1812  * areas tend not to be 0 intensity.)
1813  */
1814  if (component >= alpha)
1815  component = 65535;
1816 
1817  /* component<alpha, so component/alpha is less than one and
1818  * component*reciprocal is less than 2^31.
1819  */
1820  else if (component > 0 && alpha < 65535)
1821  {
1822  png_uint_32 calc = component * reciprocal;
1823  calc += 16384; /* round to nearest */
1824  component = (png_uint_16)(calc >> 15);
1825  }
1826 
1827  *out_ptr++ = component;
1828  }
1829  while (--c > 0);
1830 
1831  /* Skip to next component (skip the intervening alpha channel) */
1832  ++in_ptr;
1833  ++out_ptr;
1834  }
1835 
1836  png_write_row(png_ptr, png_voidcast(png_const_bytep, display->local_row));
1837  input_row += display->row_bytes/(sizeof (png_uint_16));
1838  }
1839 
1840  return 1;
1841 }
uint8_t image[110000000]
Definition: gige_snap.cpp:38
png_uint_32 width
Definition: png.h:2811
y
Definition: inputfile.py:6
png_controlp opaque
Definition: png.h:2809
Definition: pngstruct.h:144
Definition: png.h:2807
#define png_voidcast(type, value)
Definition: pngpriv.h:408
#define PNG_FORMAT_FLAG_AFIRST
Definition: png.h:2923
void png_write_row(png_structrp png_ptr, png_const_bytep row)
Definition: pngwrite.c:681
Definition: pngwrite.c:1723
png_uint_32 format
Definition: png.h:2813
png_const_voidp first_row
Definition: pngwrite.c:1732
png_imagep image
Definition: pngwrite.c:1726
const png_byte * png_const_bytep
Definition: pngconf.h:601
const png_uint_16 * png_const_uint_16p
Definition: pngconf.h:607
JBLOCKROW output_row
Definition: jpegint.h:376
png_structp png_ptr
Definition: pngpriv.h:1867
png_voidp local_row
Definition: pngwrite.c:1734
png_uint_16 * png_uint_16p
Definition: pngconf.h:606
ptrdiff_t row_bytes
Definition: pngwrite.c:1733
PNG_IMPEXP void() png_error(png_const_structrp png_ptr, png_const_charp error_message)
Definition: pngerror.c:40
png_uint_32 height
Definition: png.h:2812
#define PNG_FORMAT_FLAG_COLOR
Definition: png.h:2914
#define PNG_FORMAT_FLAG_ALPHA
Definition: png.h:2913
static png_byte png_unpremultiply ( png_uint_32  component,
png_uint_32  alpha,
png_uint_32  reciprocal 
)
static
1856 {
1857  /* The following gives 1.0 for an alpha of 0, which is fine, otherwise if 0/0
1858  * is represented as some other value there is more likely to be a
1859  * discontinuity which will probably damage compression when moving from a
1860  * fully transparent area to a nearly transparent one. (The assumption here
1861  * is that opaque areas tend not to be 0 intensity.)
1862  *
1863  * There is a rounding problem here; if alpha is less than 128 it will end up
1864  * as 0 when scaled to 8 bits. To avoid introducing spurious colors into the
1865  * output change for this too.
1866  */
1867  if (component >= alpha || alpha < 128)
1868  return 255;
1869 
1870  /* component<alpha, so component/alpha is less than one and
1871  * component*reciprocal is less than 2^31.
1872  */
1873  else if (component > 0)
1874  {
1875  /* The test is that alpha/257 (rounded) is less than 255, the first value
1876  * that becomes 255 is 65407.
1877  * NOTE: this must agree with the PNG_DIV257 macro (which must, therefore,
1878  * be exact!) [Could also test reciprocal != 0]
1879  */
1880  if (alpha < 65407)
1881  {
1882  component *= reciprocal;
1883  component += 64; /* round to nearest */
1884  component >>= 7;
1885  }
1886 
1887  else
1888  component *= 255;
1889 
1890  /* Convert the component to sRGB. */
1891  return (png_byte)PNG_sRGB_FROM_LINEAR(component);
1892  }
1893 
1894  else
1895  return 0;
1896 }
#define PNG_sRGB_FROM_LINEAR(linear)
Definition: pngpriv.h:853
static int png_write_image_8bit ( png_voidp  argument)
static
1900 {
1902  argument);
1903  png_imagep image = display->image;
1904  png_structrp png_ptr = image->opaque->png_ptr;
1905 
1907  display->first_row);
1909  png_uint_32 y = image->height;
1910  const int channels = (image->format & PNG_FORMAT_FLAG_COLOR) != 0 ? 3 : 1;
1911 
1912  if ((image->format & PNG_FORMAT_FLAG_ALPHA) != 0)
1913  {
1914  png_bytep row_end;
1915  int aindex;
1916 
1917 # ifdef PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED
1918  if ((image->format & PNG_FORMAT_FLAG_AFIRST) != 0)
1919  {
1920  aindex = -1;
1921  ++input_row; /* To point to the first component */
1922  ++output_row;
1923  }
1924 
1925  else
1926 # endif
1927  aindex = channels;
1928 
1929  /* Use row_end in place of a loop counter: */
1930  row_end = output_row + image->width * (channels+1);
1931 
1932  while (y-- > 0)
1933  {
1934  png_const_uint_16p in_ptr = input_row;
1935  png_bytep out_ptr = output_row;
1936 
1937  while (out_ptr < row_end)
1938  {
1939  png_uint_16 alpha = in_ptr[aindex];
1940  png_byte alphabyte = (png_byte)PNG_DIV257(alpha);
1941  png_uint_32 reciprocal = 0;
1942  int c;
1943 
1944  /* Scale and write the alpha channel. */
1945  out_ptr[aindex] = alphabyte;
1946 
1947  if (alphabyte > 0 && alphabyte < 255)
1948  reciprocal = UNP_RECIPROCAL(alpha);
1949 
1950  c = channels;
1951  do /* always at least one channel */
1952  *out_ptr++ = png_unpremultiply(*in_ptr++, alpha, reciprocal);
1953  while (--c > 0);
1954 
1955  /* Skip to next component (skip the intervening alpha channel) */
1956  ++in_ptr;
1957  ++out_ptr;
1958  } /* while out_ptr < row_end */
1959 
1961  display->local_row));
1962  input_row += display->row_bytes/(sizeof (png_uint_16));
1963  } /* while y */
1964  }
1965 
1966  else
1967  {
1968  /* No alpha channel, so the row_end really is the end of the row and it
1969  * is sufficient to loop over the components one by one.
1970  */
1971  png_bytep row_end = output_row + image->width * channels;
1972 
1973  while (y-- > 0)
1974  {
1975  png_const_uint_16p in_ptr = input_row;
1976  png_bytep out_ptr = output_row;
1977 
1978  while (out_ptr < row_end)
1979  {
1980  png_uint_32 component = *in_ptr++;
1981 
1982  component *= 255;
1983  *out_ptr++ = (png_byte)PNG_sRGB_FROM_LINEAR(component);
1984  }
1985 
1986  png_write_row(png_ptr, output_row);
1987  input_row += display->row_bytes/(sizeof (png_uint_16));
1988  }
1989  }
1990 
1991  return 1;
1992 }
#define PNG_sRGB_FROM_LINEAR(linear)
Definition: pngpriv.h:853
uint8_t image[110000000]
Definition: gige_snap.cpp:38
png_uint_32 width
Definition: png.h:2811
y
Definition: inputfile.py:6
png_controlp opaque
Definition: png.h:2809
png_byte * png_bytep
Definition: pngconf.h:600
Definition: pngstruct.h:144
Definition: png.h:2807
#define png_voidcast(type, value)
Definition: pngpriv.h:408
#define PNG_FORMAT_FLAG_AFIRST
Definition: png.h:2923
void png_write_row(png_structrp png_ptr, png_const_bytep row)
Definition: pngwrite.c:681
Definition: pngwrite.c:1723
png_uint_32 format
Definition: png.h:2813
png_const_voidp first_row
Definition: pngwrite.c:1732
png_imagep image
Definition: pngwrite.c:1726
const png_byte * png_const_bytep
Definition: pngconf.h:601
const png_uint_16 * png_const_uint_16p
Definition: pngconf.h:607
JBLOCKROW output_row
Definition: jpegint.h:376
png_structp png_ptr
Definition: pngpriv.h:1867
png_voidp local_row
Definition: pngwrite.c:1734
ptrdiff_t row_bytes
Definition: pngwrite.c:1733
#define PNG_DIV257(v16)
Definition: pngpriv.h:657
png_uint_32 height
Definition: png.h:2812
#define PNG_FORMAT_FLAG_COLOR
Definition: png.h:2914
#define UNP_RECIPROCAL(alpha)
Definition: pngwrite.c:1851
static png_byte png_unpremultiply(png_uint_32 component, png_uint_32 alpha, png_uint_32 reciprocal)
Definition: pngwrite.c:1854
#define PNG_FORMAT_FLAG_ALPHA
Definition: png.h:2913
static void png_image_set_PLTE ( png_image_write_control display)
static
1996 {
1997  const png_imagep image = display->image;
1998  const void *cmap = display->colormap;
1999  const int entries = image->colormap_entries > 256 ? 256 :
2000  (int)image->colormap_entries;
2001 
2002  /* NOTE: the caller must check for cmap != NULL and entries != 0 */
2003  const png_uint_32 format = image->format;
2004  const int channels = PNG_IMAGE_SAMPLE_CHANNELS(format);
2005 
2006 # if defined(PNG_FORMAT_BGR_SUPPORTED) &&\
2007  defined(PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED)
2008  const int afirst = (format & PNG_FORMAT_FLAG_AFIRST) != 0 &&
2009  (format & PNG_FORMAT_FLAG_ALPHA) != 0;
2010 # else
2011 # define afirst 0
2012 # endif
2013 
2014 # ifdef PNG_FORMAT_BGR_SUPPORTED
2015  const int bgr = (format & PNG_FORMAT_FLAG_BGR) != 0 ? 2 : 0;
2016 # else
2017 # define bgr 0
2018 # endif
2019 
2020  int i, num_trans;
2021  png_color palette[256];
2022  png_byte tRNS[256];
2023 
2024  memset(tRNS, 255, (sizeof tRNS));
2025  memset(palette, 0, (sizeof palette));
2026 
2027  for (i=num_trans=0; i<entries; ++i)
2028  {
2029  /* This gets automatically converted to sRGB with reversal of the
2030  * pre-multiplication if the color-map has an alpha channel.
2031  */
2032  if ((format & PNG_FORMAT_FLAG_LINEAR) != 0)
2033  {
2035 
2036  entry += i * channels;
2037 
2038  if ((channels & 1) != 0) /* no alpha */
2039  {
2040  if (channels >= 3) /* RGB */
2041  {
2042  palette[i].blue = (png_byte)PNG_sRGB_FROM_LINEAR(255 *
2043  entry[(2 ^ bgr)]);
2044  palette[i].green = (png_byte)PNG_sRGB_FROM_LINEAR(255 *
2045  entry[1]);
2046  palette[i].red = (png_byte)PNG_sRGB_FROM_LINEAR(255 *
2047  entry[bgr]);
2048  }
2049 
2050  else /* Gray */
2051  palette[i].blue = palette[i].red = palette[i].green =
2052  (png_byte)PNG_sRGB_FROM_LINEAR(255 * *entry);
2053  }
2054 
2055  else /* alpha */
2056  {
2057  png_uint_16 alpha = entry[afirst ? 0 : channels-1];
2058  png_byte alphabyte = (png_byte)PNG_DIV257(alpha);
2059  png_uint_32 reciprocal = 0;
2060 
2061  /* Calculate a reciprocal, as in the png_write_image_8bit code above
2062  * this is designed to produce a value scaled to 255*65535 when
2063  * divided by 128 (i.e. asr 7).
2064  */
2065  if (alphabyte > 0 && alphabyte < 255)
2066  reciprocal = (((0xffff*0xff)<<7)+(alpha>>1))/alpha;
2067 
2068  tRNS[i] = alphabyte;
2069  if (alphabyte < 255)
2070  num_trans = i+1;
2071 
2072  if (channels >= 3) /* RGB */
2073  {
2074  palette[i].blue = png_unpremultiply(entry[afirst + (2 ^ bgr)],
2075  alpha, reciprocal);
2076  palette[i].green = png_unpremultiply(entry[afirst + 1], alpha,
2077  reciprocal);
2078  palette[i].red = png_unpremultiply(entry[afirst + bgr], alpha,
2079  reciprocal);
2080  }
2081 
2082  else /* gray */
2083  palette[i].blue = palette[i].red = palette[i].green =
2084  png_unpremultiply(entry[afirst], alpha, reciprocal);
2085  }
2086  }
2087 
2088  else /* Color-map has sRGB values */
2089  {
2091 
2092  entry += i * channels;
2093 
2094  switch (channels)
2095  {
2096  case 4:
2097  tRNS[i] = entry[afirst ? 0 : 3];
2098  if (tRNS[i] < 255)
2099  num_trans = i+1;
2100  /* FALL THROUGH */
2101  case 3:
2102  palette[i].blue = entry[afirst + (2 ^ bgr)];
2103  palette[i].green = entry[afirst + 1];
2104  palette[i].red = entry[afirst + bgr];
2105  break;
2106 
2107  case 2:
2108  tRNS[i] = entry[1 ^ afirst];
2109  if (tRNS[i] < 255)
2110  num_trans = i+1;
2111  /* FALL THROUGH */
2112  case 1:
2113  palette[i].blue = palette[i].red = palette[i].green =
2114  entry[afirst];
2115  break;
2116 
2117  default:
2118  break;
2119  }
2120  }
2121  }
2122 
2123 # ifdef afirst
2124 # undef afirst
2125 # endif
2126 # ifdef bgr
2127 # undef bgr
2128 # endif
2129 
2130  png_set_PLTE(image->opaque->png_ptr, image->opaque->info_ptr, palette,
2131  entries);
2132 
2133  if (num_trans > 0)
2134  png_set_tRNS(image->opaque->png_ptr, image->opaque->info_ptr, tRNS,
2135  num_trans, NULL);
2136 
2137  image->colormap_entries = entries;
2138 }
#define PNG_sRGB_FROM_LINEAR(linear)
Definition: pngpriv.h:853
uint8_t image[110000000]
Definition: gige_snap.cpp:38
#define PNG_FORMAT_FLAG_BGR
Definition: png.h:2919
png_controlp opaque
Definition: png.h:2809
int i
Definition: rw_test.cpp:37
PNG_IMPEXP void() png_set_PLTE(png_structrp png_ptr, png_inforp info_ptr, png_const_colorp palette, int num_palette)
Definition: pngset.c:505
png_byte red
Definition: png.h:621
PNG_IMPEXP void() png_set_tRNS(png_structrp png_ptr, png_inforp info_ptr, png_const_bytep trans_alpha, int num_trans, png_const_color_16p trans_color)
Definition: pngset.c:917
Definition: png.h:2807
#define png_voidcast(type, value)
Definition: pngpriv.h:408
#define PNG_FORMAT_FLAG_AFIRST
Definition: png.h:2923
png_const_voidp colormap
Definition: pngwrite.c:1729
png_uint_32 format
Definition: png.h:2813
png_imagep image
Definition: pngwrite.c:1726
const png_byte * png_const_bytep
Definition: pngconf.h:601
const png_uint_16 * png_const_uint_16p
Definition: pngconf.h:607
Definition: png.h:619
png_structp png_ptr
Definition: pngpriv.h:1867
#define PNG_IMAGE_SAMPLE_CHANNELS(fmt)
Definition: png.h:2979
png_infop info_ptr
Definition: pngpriv.h:1868
#define PNG_DIV257(v16)
Definition: pngpriv.h:657
#define PNG_FORMAT_FLAG_LINEAR
Definition: png.h:2915
png_uint_32 colormap_entries
Definition: png.h:2815
static png_byte png_unpremultiply(png_uint_32 component, png_uint_32 alpha, png_uint_32 reciprocal)
Definition: pngwrite.c:1854
#define PNG_FORMAT_FLAG_ALPHA
Definition: png.h:2913
png_byte green
Definition: png.h:622
png_byte blue
Definition: png.h:623
static int png_image_write_main ( png_voidp  argument)
static
2142 {
2144  argument);
2145  png_imagep image = display->image;
2146  png_structrp png_ptr = image->opaque->png_ptr;
2147  png_inforp info_ptr = image->opaque->info_ptr;
2148  png_uint_32 format = image->format;
2149 
2150  /* The following four ints are actually booleans */
2151  int colormap = (format & PNG_FORMAT_FLAG_COLORMAP);
2152  int linear = !colormap && (format & PNG_FORMAT_FLAG_LINEAR); /* input */
2153  int alpha = !colormap && (format & PNG_FORMAT_FLAG_ALPHA);
2154  int write_16bit = linear && !colormap && (display->convert_to_8bit == 0);
2155 
2156 # ifdef PNG_BENIGN_ERRORS_SUPPORTED
2157  /* Make sure we error out on any bad situation */
2158  png_set_benign_errors(png_ptr, 0/*error*/);
2159 # endif
2160 
2161  /* Default the 'row_stride' parameter if required. */
2162  if (display->row_stride == 0)
2163  display->row_stride = PNG_IMAGE_ROW_STRIDE(*image);
2164 
2165  /* Set the required transforms then write the rows in the correct order. */
2166  if ((format & PNG_FORMAT_FLAG_COLORMAP) != 0)
2167  {
2168  if (display->colormap != NULL && image->colormap_entries > 0)
2169  {
2170  png_uint_32 entries = image->colormap_entries;
2171 
2172  png_set_IHDR(png_ptr, info_ptr, image->width, image->height,
2173  entries > 16 ? 8 : (entries > 4 ? 4 : (entries > 2 ? 2 : 1)),
2176 
2177  png_image_set_PLTE(display);
2178  }
2179 
2180  else
2181  png_error(image->opaque->png_ptr,
2182  "no color-map for color-mapped image");
2183  }
2184 
2185  else
2186  png_set_IHDR(png_ptr, info_ptr, image->width, image->height,
2187  write_16bit ? 16 : 8,
2188  ((format & PNG_FORMAT_FLAG_COLOR) ? PNG_COLOR_MASK_COLOR : 0) +
2189  ((format & PNG_FORMAT_FLAG_ALPHA) ? PNG_COLOR_MASK_ALPHA : 0),
2191 
2192  /* Counter-intuitively the data transformations must be called *after*
2193  * png_write_info, not before as in the read code, but the 'set' functions
2194  * must still be called before. Just set the color space information, never
2195  * write an interlaced image.
2196  */
2197 
2198  if (write_16bit != 0)
2199  {
2200  /* The gamma here is 1.0 (linear) and the cHRM chunk matches sRGB. */
2201  png_set_gAMA_fixed(png_ptr, info_ptr, PNG_GAMMA_LINEAR);
2202 
2203  if ((image->flags & PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB) == 0)
2204  png_set_cHRM_fixed(png_ptr, info_ptr,
2205  /* color x y */
2206  /* white */ 31270, 32900,
2207  /* red */ 64000, 33000,
2208  /* green */ 30000, 60000,
2209  /* blue */ 15000, 6000
2210  );
2211  }
2212 
2213  else if ((image->flags & PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB) == 0)
2214  png_set_sRGB(png_ptr, info_ptr, PNG_sRGB_INTENT_PERCEPTUAL);
2215 
2216  /* Else writing an 8-bit file and the *colors* aren't sRGB, but the 8-bit
2217  * space must still be gamma encoded.
2218  */
2219  else
2220  png_set_gAMA_fixed(png_ptr, info_ptr, PNG_GAMMA_sRGB_INVERSE);
2221 
2222  /* Write the file header. */
2223  png_write_info(png_ptr, info_ptr);
2224 
2225  /* Now set up the data transformations (*after* the header is written),
2226  * remove the handled transformations from the 'format' flags for checking.
2227  *
2228  * First check for a little endian system if writing 16 bit files.
2229  */
2230  if (write_16bit != 0)
2231  {
2232  PNG_CONST png_uint_16 le = 0x0001;
2233 
2234  if ((*(png_const_bytep) & le) != 0)
2235  png_set_swap(png_ptr);
2236  }
2237 
2238 # ifdef PNG_SIMPLIFIED_WRITE_BGR_SUPPORTED
2239  if ((format & PNG_FORMAT_FLAG_BGR) != 0)
2240  {
2241  if (colormap == 0 && (format & PNG_FORMAT_FLAG_COLOR) != 0)
2242  png_set_bgr(png_ptr);
2243  format &= ~PNG_FORMAT_FLAG_BGR;
2244  }
2245 # endif
2246 
2247 # ifdef PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED
2248  if ((format & PNG_FORMAT_FLAG_AFIRST) != 0)
2249  {
2250  if (colormap == 0 && (format & PNG_FORMAT_FLAG_ALPHA) != 0)
2251  png_set_swap_alpha(png_ptr);
2252  format &= ~PNG_FORMAT_FLAG_AFIRST;
2253  }
2254 # endif
2255 
2256  /* If there are 16 or fewer color-map entries we wrote a lower bit depth
2257  * above, but the application data is still byte packed.
2258  */
2259  if (colormap != 0 && image->colormap_entries <= 16)
2260  png_set_packing(png_ptr);
2261 
2262  /* That should have handled all (both) the transforms. */
2263  if ((format & ~(png_uint_32)(PNG_FORMAT_FLAG_COLOR | PNG_FORMAT_FLAG_LINEAR |
2264  PNG_FORMAT_FLAG_ALPHA | PNG_FORMAT_FLAG_COLORMAP)) != 0)
2265  png_error(png_ptr, "png_write_image: unsupported transformation");
2266 
2267  {
2269  ptrdiff_t row_bytes = display->row_stride;
2270 
2271  if (linear != 0)
2272  row_bytes *= (sizeof (png_uint_16));
2273 
2274  if (row_bytes < 0)
2275  row += (image->height-1) * (-row_bytes);
2276 
2277  display->first_row = row;
2278  display->row_bytes = row_bytes;
2279  }
2280 
2281  /* Apply 'fast' options if the flag is set. */
2282  if ((image->flags & PNG_IMAGE_FLAG_FAST) != 0)
2283  {
2285  /* NOTE: determined by experiment using pngstest, this reflects some
2286  * balance between the time to write the image once and the time to read
2287  * it about 50 times. The speed-up in pngstest was about 10-20% of the
2288  * total (user) time on a heavily loaded system.
2289  */
2290  png_set_compression_level(png_ptr, 3);
2291  }
2292 
2293  /* Check for the cases that currently require a pre-transform on the row
2294  * before it is written. This only applies when the input is 16-bit and
2295  * either there is an alpha channel or it is converted to 8-bit.
2296  */
2297  if ((linear != 0 && alpha != 0 ) ||
2298  (colormap == 0 && display->convert_to_8bit != 0))
2299  {
2300  png_bytep row = png_voidcast(png_bytep, png_malloc(png_ptr,
2301  png_get_rowbytes(png_ptr, info_ptr)));
2302  int result;
2303 
2304  display->local_row = row;
2305  if (write_16bit != 0)
2306  result = png_safe_execute(image, png_write_image_16bit, display);
2307  else
2308  result = png_safe_execute(image, png_write_image_8bit, display);
2309  display->local_row = NULL;
2310 
2311  png_free(png_ptr, row);
2312 
2313  /* Skip the 'write_end' on error: */
2314  if (result == 0)
2315  return 0;
2316  }
2317 
2318  /* Otherwise this is the case where the input is in a format currently
2319  * supported by the rest of the libpng write code; call it directly.
2320  */
2321  else
2322  {
2324  ptrdiff_t row_bytes = display->row_bytes;
2325  png_uint_32 y = image->height;
2326 
2327  while (y-- > 0)
2328  {
2329  png_write_row(png_ptr, row);
2330  row += row_bytes;
2331  }
2332  }
2333 
2334  png_write_end(png_ptr, info_ptr);
2335  return 1;
2336 }
PNG_IMPEXP png_voidp() png_malloc(png_const_structrp png_ptr, png_alloc_size_t size)
Definition: pngmem.c:169
png_const_voidp buffer
Definition: pngwrite.c:1727
uint8_t image[110000000]
Definition: gige_snap.cpp:38
#define PNG_FORMAT_FLAG_BGR
Definition: png.h:2919
png_uint_32 width
Definition: png.h:2811
PNG_IMPEXP void() png_set_gAMA_fixed(png_const_structrp png_ptr, png_inforp info_ptr, png_fixed_point int_file_gamma)
Definition: pngset.c:139
#define PNG_NO_FILTERS
Definition: png.h:1600
PNG_IMPEXP void() png_set_swap_alpha(png_structrp png_ptr)
Definition: pngtrans.c:222
y
Definition: inputfile.py:6
png_controlp opaque
Definition: png.h:2809
PNG_IMPEXP void() png_set_sRGB(png_const_structrp png_ptr, png_inforp info_ptr, int srgb_intent)
Definition: pngset.c:580
PNG_IMPEXP void() png_set_cHRM_fixed(png_const_structrp png_ptr, png_inforp info_ptr, png_fixed_point int_white_x, png_fixed_point int_white_y, png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x, png_fixed_point int_blue_y)
Definition: pngset.c:40
#define PNG_INTERLACE_NONE
Definition: png.h:828
PNG_IMPEXP void() png_set_bgr(png_structrp png_ptr)
Definition: pngtrans.c:21
PNG_IMPEXP void() png_set_IHDR(png_const_structrp png_ptr, png_inforp info_ptr, png_uint_32 width, png_uint_32 height, int bit_depth, int color_type, int interlace_method, int compression_method, int filter_method)
Definition: pngset.c:206
#define PNG_COLOR_TYPE_PALETTE
Definition: png.h:810
png_byte * png_bytep
Definition: pngconf.h:600
#define PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB
Definition: png.h:3064
png_uint_32 flags
Definition: png.h:2814
Definition: pngstruct.h:144
PNG_IMPEXP void() png_set_swap(png_structrp png_ptr)
Definition: pngtrans.c:35
Definition: png.h:2807
static int png_write_image_16bit(png_voidp argument)
Definition: pngwrite.c:1742
#define png_voidcast(type, value)
Definition: pngpriv.h:408
#define PNG_FORMAT_FLAG_AFIRST
Definition: png.h:2923
void png_write_row(png_structrp png_ptr, png_const_bytep row)
Definition: pngwrite.c:681
png_const_voidp colormap
Definition: pngwrite.c:1729
Definition: pnginfo.h:56
static void png_image_set_PLTE(png_image_write_control *display)
Definition: pngwrite.c:1995
int png_safe_execute(png_imagep image_in, int(*function)(png_voidp), png_voidp arg)
Definition: pngerror.c:936
PNG_IMPEXP void() png_set_packing(png_structrp png_ptr)
Definition: pngtrans.c:50
Definition: pngwrite.c:1723
png_uint_32 format
Definition: png.h:2813
png_const_voidp first_row
Definition: pngwrite.c:1732
void png_write_info(png_structrp png_ptr, png_const_inforp info_ptr)
Definition: pngwrite.c:191
#define PNG_COLOR_MASK_COLOR
Definition: png.h:805
png_imagep image
Definition: pngwrite.c:1726
#define PNG_CONST
Definition: pngconf.h:86
png_int_32 row_stride
Definition: pngwrite.c:1728
int convert_to_8bit
Definition: pngwrite.c:1730
const png_byte * png_const_bytep
Definition: pngconf.h:601
#define PNG_IMAGE_ROW_STRIDE(image)
Definition: png.h:3031
PNG_IMPEXP png_size_t() png_get_rowbytes(png_const_structrp png_ptr, png_const_inforp info_ptr)
Definition: pngget.c:30
png_structp png_ptr
Definition: pngpriv.h:1867
void png_set_compression_level(png_structrp png_ptr, int level)
Definition: pngwrite.c:1376
PNG_IMPEXP void() png_set_benign_errors(png_structrp png_ptr, int allowed)
Definition: pngset.c:1570
#define PNG_FORMAT_FLAG_COLORMAP
Definition: png.h:2916
png_voidp local_row
Definition: pngwrite.c:1734
#define PNG_FILTER_TYPE_BASE
Definition: png.h:823
#define PNG_COLOR_MASK_ALPHA
Definition: png.h:806
#define PNG_IMAGE_FLAG_FAST
Definition: png.h:3069
#define PNG_COMPRESSION_TYPE_BASE
Definition: png.h:819
ptrdiff_t row_bytes
Definition: pngwrite.c:1733
static int png_write_image_8bit(png_voidp argument)
Definition: pngwrite.c:1899
png_infop info_ptr
Definition: pngpriv.h:1868
PNG_IMPEXP void() png_free(png_const_structrp png_ptr, png_voidp ptr)
Definition: pngmem.c:229
PNG_IMPEXP void() png_error(png_const_structrp png_ptr, png_const_charp error_message)
Definition: pngerror.c:40
png_uint_32 height
Definition: png.h:2812
#define PNG_GAMMA_LINEAR
Definition: png.h:1288
#define PNG_FORMAT_FLAG_LINEAR
Definition: png.h:2915
#define PNG_FORMAT_FLAG_COLOR
Definition: png.h:2914
png_uint_32 colormap_entries
Definition: png.h:2815
void png_set_filter(png_structrp png_ptr, int method, int filters)
Definition: pngwrite.c:1000
#define PNG_FORMAT_FLAG_ALPHA
Definition: png.h:2913
#define PNG_GAMMA_sRGB_INVERSE
Definition: pngpriv.h:807
#define PNG_sRGB_INTENT_PERCEPTUAL
Definition: png.h:856
void png_write_end(png_structrp png_ptr, png_inforp info_ptr)
Definition: pngwrite.c:347
int png_image_write_to_stdio ( png_imagep  image,
FILE *  file,
int  convert_to_8bit,
const void *  buffer,
png_int_32  row_stride,
const void *  colormap 
)
2341 {
2342  /* Write the image to the given (FILE*). */
2343  if (image != NULL && image->version == PNG_IMAGE_VERSION)
2344  {
2345  if (file != NULL)
2346  {
2347  if (png_image_write_init(image) != 0)
2348  {
2349  png_image_write_control display;
2350  int result;
2351 
2352  /* This is slightly evil, but png_init_io doesn't do anything other
2353  * than this and we haven't changed the standard IO functions so
2354  * this saves a 'safe' function.
2355  */
2356  image->opaque->png_ptr->io_ptr = file;
2357 
2358  memset(&display, 0, (sizeof display));
2359  display.image = image;
2360  display.buffer = buffer;
2361  display.row_stride = row_stride;
2362  display.colormap = colormap;
2363  display.convert_to_8bit = convert_to_8bit;
2364 
2365  result = png_safe_execute(image, png_image_write_main, &display);
2366  png_image_free(image);
2367  return result;
2368  }
2369 
2370  else
2371  return 0;
2372  }
2373 
2374  else
2375  return png_image_error(image,
2376  "png_image_write_to_stdio: invalid argument");
2377  }
2378 
2379  else if (image != NULL)
2380  return png_image_error(image,
2381  "png_image_write_to_stdio: incorrect PNG_IMAGE_VERSION");
2382 
2383  else
2384  return 0;
2385 }
png_const_voidp buffer
Definition: pngwrite.c:1727
uint8_t image[110000000]
Definition: gige_snap.cpp:38
png_controlp opaque
Definition: png.h:2809
int png_image_error(png_imagep image, png_const_charp error_message)
Definition: png.c:4483
png_const_voidp colormap
Definition: pngwrite.c:1729
int png_safe_execute(png_imagep image_in, int(*function)(png_voidp), png_voidp arg)
Definition: pngerror.c:936
static int png_image_write_init(png_imagep image)
Definition: pngwrite.c:1686
Definition: pngwrite.c:1723
static char buffer[255]
Definition: propagator_simple.cpp:60
png_imagep image
Definition: pngwrite.c:1726
png_int_32 row_stride
Definition: pngwrite.c:1728
int convert_to_8bit
Definition: pngwrite.c:1730
png_uint_32 version
Definition: png.h:2810
png_structp png_ptr
Definition: pngpriv.h:1867
png_voidp io_ptr
Definition: pngstruct.h:159
void png_image_free(png_imagep image)
Definition: png.c:4467
#define PNG_IMAGE_VERSION
Definition: png.h:2804
static int png_image_write_main(png_voidp argument)
Definition: pngwrite.c:2141
int png_image_write_to_file ( png_imagep  image,
const char *  file_name,
int  convert_to_8bit,
const void *  buffer,
png_int_32  row_stride,
const void *  colormap 
)
2391 {
2392  /* Write the image to the named file. */
2393  if (image != NULL && image->version == PNG_IMAGE_VERSION)
2394  {
2395  if (file_name != NULL)
2396  {
2397  FILE *fp = fopen(file_name, "wb");
2398 
2399  if (fp != NULL)
2400  {
2401  if (png_image_write_to_stdio(image, fp, convert_to_8bit, buffer,
2402  row_stride, colormap) != 0)
2403  {
2404  int error; /* from fflush/fclose */
2405 
2406  /* Make sure the file is flushed correctly. */
2407  if (fflush(fp) == 0 && ferror(fp) == 0)
2408  {
2409  if (fclose(fp) == 0)
2410  return 1;
2411 
2412  error = errno; /* from fclose */
2413  }
2414 
2415  else
2416  {
2417  error = errno; /* from fflush or ferror */
2418  (void)fclose(fp);
2419  }
2420 
2421  (void)remove(file_name);
2422  /* The image has already been cleaned up; this is just used to
2423  * set the error (because the original write succeeded).
2424  */
2425  return png_image_error(image, strerror(error));
2426  }
2427 
2428  else
2429  {
2430  /* Clean up: just the opened file. */
2431  (void)fclose(fp);
2432  (void)remove(file_name);
2433  return 0;
2434  }
2435  }
2436 
2437  else
2438  return png_image_error(image, strerror(errno));
2439  }
2440 
2441  else
2442  return png_image_error(image,
2443  "png_image_write_to_file: invalid argument");
2444  }
2445 
2446  else if (image != NULL)
2447  return png_image_error(image,
2448  "png_image_write_to_file: incorrect PNG_IMAGE_VERSION");
2449 
2450  else
2451  return 0;
2452 }
int png_image_write_to_stdio(png_imagep image, FILE *file, int convert_to_8bit, const void *buffer, png_int_32 row_stride, const void *colormap)
Definition: pngwrite.c:2339
int png_image_error(png_imagep image, png_const_charp error_message)
Definition: png.c:4483
static char buffer[255]
Definition: propagator_simple.cpp:60
png_uint_32 version
Definition: png.h:2810
#define PNG_IMAGE_VERSION
Definition: png.h:2804
FILE * fp
Definition: rw_test.cpp:38