source: trunk/src/3rdparty/libpng/pngset.c@ 689

Last change on this file since 689 was 561, checked in by Dmitry A. Kuminov, 16 years ago

trunk: Merged in qt 4.6.1 sources.

File size: 38.4 KB
Line 
1
2/* pngset.c - storage of image information into info struct
3 *
4 * Last changed in libpng 1.2.40 [September 10, 2009]
5 * Copyright (c) 1998-2009 Glenn Randers-Pehrson
6 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
7 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
8 *
9 * This code is released under the libpng license.
10 * For conditions of distribution and use, see the disclaimer
11 * and license in png.h
12 *
13 * The functions here are used during reads to store data from the file
14 * into the info struct, and during writes to store application data
15 * into the info struct for writing into the file. This abstracts the
16 * info struct and allows us to change the structure in the future.
17 */
18
19#define PNG_INTERNAL
20#include "png.h"
21#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
22
23#if defined(PNG_bKGD_SUPPORTED)
24void PNGAPI
25png_set_bKGD(png_structp png_ptr, png_infop info_ptr, png_color_16p background)
26{
27 png_debug1(1, "in %s storage function", "bKGD");
28
29 if (png_ptr == NULL || info_ptr == NULL)
30 return;
31
32 png_memcpy(&(info_ptr->background), background, png_sizeof(png_color_16));
33 info_ptr->valid |= PNG_INFO_bKGD;
34}
35#endif
36
37#if defined(PNG_cHRM_SUPPORTED)
38#ifdef PNG_FLOATING_POINT_SUPPORTED
39void PNGAPI
40png_set_cHRM(png_structp png_ptr, png_infop info_ptr,
41 double white_x, double white_y, double red_x, double red_y,
42 double green_x, double green_y, double blue_x, double blue_y)
43{
44 png_debug1(1, "in %s storage function", "cHRM");
45
46 if (png_ptr == NULL || info_ptr == NULL)
47 return;
48
49 info_ptr->x_white = (float)white_x;
50 info_ptr->y_white = (float)white_y;
51 info_ptr->x_red = (float)red_x;
52 info_ptr->y_red = (float)red_y;
53 info_ptr->x_green = (float)green_x;
54 info_ptr->y_green = (float)green_y;
55 info_ptr->x_blue = (float)blue_x;
56 info_ptr->y_blue = (float)blue_y;
57#ifdef PNG_FIXED_POINT_SUPPORTED
58 info_ptr->int_x_white = (png_fixed_point)(white_x*100000.+0.5);
59 info_ptr->int_y_white = (png_fixed_point)(white_y*100000.+0.5);
60 info_ptr->int_x_red = (png_fixed_point)( red_x*100000.+0.5);
61 info_ptr->int_y_red = (png_fixed_point)( red_y*100000.+0.5);
62 info_ptr->int_x_green = (png_fixed_point)(green_x*100000.+0.5);
63 info_ptr->int_y_green = (png_fixed_point)(green_y*100000.+0.5);
64 info_ptr->int_x_blue = (png_fixed_point)( blue_x*100000.+0.5);
65 info_ptr->int_y_blue = (png_fixed_point)( blue_y*100000.+0.5);
66#endif
67 info_ptr->valid |= PNG_INFO_cHRM;
68}
69#endif /* PNG_FLOATING_POINT_SUPPORTED */
70
71#ifdef PNG_FIXED_POINT_SUPPORTED
72void PNGAPI
73png_set_cHRM_fixed(png_structp png_ptr, png_infop info_ptr,
74 png_fixed_point white_x, png_fixed_point white_y, png_fixed_point red_x,
75 png_fixed_point red_y, png_fixed_point green_x, png_fixed_point green_y,
76 png_fixed_point blue_x, png_fixed_point blue_y)
77{
78 png_debug1(1, "in %s storage function", "cHRM fixed");
79
80 if (png_ptr == NULL || info_ptr == NULL)
81 return;
82
83#if !defined(PNG_NO_CHECK_cHRM)
84 if (png_check_cHRM_fixed(png_ptr,
85 white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y))
86#endif
87 {
88 info_ptr->int_x_white = white_x;
89 info_ptr->int_y_white = white_y;
90 info_ptr->int_x_red = red_x;
91 info_ptr->int_y_red = red_y;
92 info_ptr->int_x_green = green_x;
93 info_ptr->int_y_green = green_y;
94 info_ptr->int_x_blue = blue_x;
95 info_ptr->int_y_blue = blue_y;
96#ifdef PNG_FLOATING_POINT_SUPPORTED
97 info_ptr->x_white = (float)(white_x/100000.);
98 info_ptr->y_white = (float)(white_y/100000.);
99 info_ptr->x_red = (float)( red_x/100000.);
100 info_ptr->y_red = (float)( red_y/100000.);
101 info_ptr->x_green = (float)(green_x/100000.);
102 info_ptr->y_green = (float)(green_y/100000.);
103 info_ptr->x_blue = (float)( blue_x/100000.);
104 info_ptr->y_blue = (float)( blue_y/100000.);
105#endif
106 info_ptr->valid |= PNG_INFO_cHRM;
107 }
108}
109#endif /* PNG_FIXED_POINT_SUPPORTED */
110#endif /* PNG_cHRM_SUPPORTED */
111
112#if defined(PNG_gAMA_SUPPORTED)
113#ifdef PNG_FLOATING_POINT_SUPPORTED
114void PNGAPI
115png_set_gAMA(png_structp png_ptr, png_infop info_ptr, double file_gamma)
116{
117 double png_gamma;
118
119 png_debug1(1, "in %s storage function", "gAMA");
120
121 if (png_ptr == NULL || info_ptr == NULL)
122 return;
123
124 /* Check for overflow */
125 if (file_gamma > 21474.83)
126 {
127 png_warning(png_ptr, "Limiting gamma to 21474.83");
128 png_gamma=21474.83;
129 }
130 else
131 png_gamma = file_gamma;
132 info_ptr->gamma = (float)png_gamma;
133#ifdef PNG_FIXED_POINT_SUPPORTED
134 info_ptr->int_gamma = (int)(png_gamma*100000.+.5);
135#endif
136 info_ptr->valid |= PNG_INFO_gAMA;
137 if (png_gamma == 0.0)
138 png_warning(png_ptr, "Setting gamma=0");
139}
140#endif
141void PNGAPI
142png_set_gAMA_fixed(png_structp png_ptr, png_infop info_ptr, png_fixed_point
143 int_gamma)
144{
145 png_fixed_point png_gamma;
146
147 png_debug1(1, "in %s storage function", "gAMA");
148
149 if (png_ptr == NULL || info_ptr == NULL)
150 return;
151
152 if (int_gamma > (png_fixed_point)PNG_UINT_31_MAX)
153 {
154 png_warning(png_ptr, "Limiting gamma to 21474.83");
155 png_gamma=PNG_UINT_31_MAX;
156 }
157 else
158 {
159 if (int_gamma < 0)
160 {
161 png_warning(png_ptr, "Setting negative gamma to zero");
162 png_gamma = 0;
163 }
164 else
165 png_gamma = int_gamma;
166 }
167#ifdef PNG_FLOATING_POINT_SUPPORTED
168 info_ptr->gamma = (float)(png_gamma/100000.);
169#endif
170#ifdef PNG_FIXED_POINT_SUPPORTED
171 info_ptr->int_gamma = png_gamma;
172#endif
173 info_ptr->valid |= PNG_INFO_gAMA;
174 if (png_gamma == 0)
175 png_warning(png_ptr, "Setting gamma=0");
176}
177#endif
178
179#if defined(PNG_hIST_SUPPORTED)
180void PNGAPI
181png_set_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_16p hist)
182{
183 int i;
184
185 png_debug1(1, "in %s storage function", "hIST");
186
187 if (png_ptr == NULL || info_ptr == NULL)
188 return;
189
190 if (info_ptr->num_palette == 0 || info_ptr->num_palette
191 > PNG_MAX_PALETTE_LENGTH)
192 {
193 png_warning(png_ptr,
194 "Invalid palette size, hIST allocation skipped.");
195 return;
196 }
197
198#ifdef PNG_FREE_ME_SUPPORTED
199 png_free_data(png_ptr, info_ptr, PNG_FREE_HIST, 0);
200#endif
201 /* Changed from info->num_palette to PNG_MAX_PALETTE_LENGTH in
202 * version 1.2.1
203 */
204 png_ptr->hist = (png_uint_16p)png_malloc_warn(png_ptr,
205 (png_uint_32)(PNG_MAX_PALETTE_LENGTH * png_sizeof(png_uint_16)));
206 if (png_ptr->hist == NULL)
207 {
208 png_warning(png_ptr, "Insufficient memory for hIST chunk data.");
209 return;
210 }
211
212 for (i = 0; i < info_ptr->num_palette; i++)
213 png_ptr->hist[i] = hist[i];
214 info_ptr->hist = png_ptr->hist;
215 info_ptr->valid |= PNG_INFO_hIST;
216
217#ifdef PNG_FREE_ME_SUPPORTED
218 info_ptr->free_me |= PNG_FREE_HIST;
219#else
220 png_ptr->flags |= PNG_FLAG_FREE_HIST;
221#endif
222}
223#endif
224
225void PNGAPI
226png_set_IHDR(png_structp png_ptr, png_infop info_ptr,
227 png_uint_32 width, png_uint_32 height, int bit_depth,
228 int color_type, int interlace_type, int compression_type,
229 int filter_type)
230{
231 png_debug1(1, "in %s storage function", "IHDR");
232
233 if (png_ptr == NULL || info_ptr == NULL)
234 return;
235
236 /* Check for width and height valid values */
237 if (width == 0 || height == 0)
238 png_error(png_ptr, "Image width or height is zero in IHDR");
239#ifdef PNG_SET_USER_LIMITS_SUPPORTED
240 if (width > png_ptr->user_width_max || height > png_ptr->user_height_max)
241 png_error(png_ptr, "image size exceeds user limits in IHDR");
242#else
243 if (width > PNG_USER_WIDTH_MAX || height > PNG_USER_HEIGHT_MAX)
244 png_error(png_ptr, "image size exceeds user limits in IHDR");
245#endif
246 if (width > PNG_UINT_31_MAX || height > PNG_UINT_31_MAX)
247 png_error(png_ptr, "Invalid image size in IHDR");
248 if ( width > (PNG_UINT_32_MAX
249 >> 3) /* 8-byte RGBA pixels */
250 - 64 /* bigrowbuf hack */
251 - 1 /* filter byte */
252 - 7*8 /* rounding of width to multiple of 8 pixels */
253 - 8) /* extra max_pixel_depth pad */
254 png_warning(png_ptr, "Width is too large for libpng to process pixels");
255
256 /* Check other values */
257 if (bit_depth != 1 && bit_depth != 2 && bit_depth != 4 &&
258 bit_depth != 8 && bit_depth != 16)
259 png_error(png_ptr, "Invalid bit depth in IHDR");
260
261 if (color_type < 0 || color_type == 1 ||
262 color_type == 5 || color_type > 6)
263 png_error(png_ptr, "Invalid color type in IHDR");
264
265 if (((color_type == PNG_COLOR_TYPE_PALETTE) && bit_depth > 8) ||
266 ((color_type == PNG_COLOR_TYPE_RGB ||
267 color_type == PNG_COLOR_TYPE_GRAY_ALPHA ||
268 color_type == PNG_COLOR_TYPE_RGB_ALPHA) && bit_depth < 8))
269 png_error(png_ptr, "Invalid color type/bit depth combination in IHDR");
270
271 if (interlace_type >= PNG_INTERLACE_LAST)
272 png_error(png_ptr, "Unknown interlace method in IHDR");
273
274 if (compression_type != PNG_COMPRESSION_TYPE_BASE)
275 png_error(png_ptr, "Unknown compression method in IHDR");
276
277#if defined(PNG_MNG_FEATURES_SUPPORTED)
278 /* Accept filter_method 64 (intrapixel differencing) only if
279 * 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and
280 * 2. Libpng did not read a PNG signature (this filter_method is only
281 * used in PNG datastreams that are embedded in MNG datastreams) and
282 * 3. The application called png_permit_mng_features with a mask that
283 * included PNG_FLAG_MNG_FILTER_64 and
284 * 4. The filter_method is 64 and
285 * 5. The color_type is RGB or RGBA
286 */
287 if ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE)&&png_ptr->mng_features_permitted)
288 png_warning(png_ptr, "MNG features are not allowed in a PNG datastream");
289 if (filter_type != PNG_FILTER_TYPE_BASE)
290 {
291 if (!((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) &&
292 (filter_type == PNG_INTRAPIXEL_DIFFERENCING) &&
293 ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE) == 0) &&
294 (color_type == PNG_COLOR_TYPE_RGB ||
295 color_type == PNG_COLOR_TYPE_RGB_ALPHA)))
296 png_error(png_ptr, "Unknown filter method in IHDR");
297 if (png_ptr->mode&PNG_HAVE_PNG_SIGNATURE)
298 png_warning(png_ptr, "Invalid filter method in IHDR");
299 }
300#else
301 if (filter_type != PNG_FILTER_TYPE_BASE)
302 png_error(png_ptr, "Unknown filter method in IHDR");
303#endif
304
305 info_ptr->width = width;
306 info_ptr->height = height;
307 info_ptr->bit_depth = (png_byte)bit_depth;
308 info_ptr->color_type =(png_byte) color_type;
309 info_ptr->compression_type = (png_byte)compression_type;
310 info_ptr->filter_type = (png_byte)filter_type;
311 info_ptr->interlace_type = (png_byte)interlace_type;
312 if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
313 info_ptr->channels = 1;
314 else if (info_ptr->color_type & PNG_COLOR_MASK_COLOR)
315 info_ptr->channels = 3;
316 else
317 info_ptr->channels = 1;
318 if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA)
319 info_ptr->channels++;
320 info_ptr->pixel_depth = (png_byte)(info_ptr->channels * info_ptr->bit_depth);
321
322 /* Check for potential overflow */
323 if (width > (PNG_UINT_32_MAX
324 >> 3) /* 8-byte RGBA pixels */
325 - 64 /* bigrowbuf hack */
326 - 1 /* filter byte */
327 - 7*8 /* rounding of width to multiple of 8 pixels */
328 - 8) /* extra max_pixel_depth pad */
329 info_ptr->rowbytes = (png_size_t)0;
330 else
331 info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, width);
332}
333
334#if defined(PNG_oFFs_SUPPORTED)
335void PNGAPI
336png_set_oFFs(png_structp png_ptr, png_infop info_ptr,
337 png_int_32 offset_x, png_int_32 offset_y, int unit_type)
338{
339 png_debug1(1, "in %s storage function", "oFFs");
340
341 if (png_ptr == NULL || info_ptr == NULL)
342 return;
343
344 info_ptr->x_offset = offset_x;
345 info_ptr->y_offset = offset_y;
346 info_ptr->offset_unit_type = (png_byte)unit_type;
347 info_ptr->valid |= PNG_INFO_oFFs;
348}
349#endif
350
351#if defined(PNG_pCAL_SUPPORTED)
352void PNGAPI
353png_set_pCAL(png_structp png_ptr, png_infop info_ptr,
354 png_charp purpose, png_int_32 X0, png_int_32 X1, int type, int nparams,
355 png_charp units, png_charpp params)
356{
357 png_uint_32 length;
358 int i;
359
360 png_debug1(1, "in %s storage function", "pCAL");
361
362 if (png_ptr == NULL || info_ptr == NULL)
363 return;
364
365 length = png_strlen(purpose) + 1;
366 png_debug1(3, "allocating purpose for info (%lu bytes)",
367 (unsigned long)length);
368 info_ptr->pcal_purpose = (png_charp)png_malloc_warn(png_ptr, length);
369 if (info_ptr->pcal_purpose == NULL)
370 {
371 png_warning(png_ptr, "Insufficient memory for pCAL purpose.");
372 return;
373 }
374 png_memcpy(info_ptr->pcal_purpose, purpose, (png_size_t)length);
375
376 png_debug(3, "storing X0, X1, type, and nparams in info");
377 info_ptr->pcal_X0 = X0;
378 info_ptr->pcal_X1 = X1;
379 info_ptr->pcal_type = (png_byte)type;
380 info_ptr->pcal_nparams = (png_byte)nparams;
381
382 length = png_strlen(units) + 1;
383 png_debug1(3, "allocating units for info (%lu bytes)",
384 (unsigned long)length);
385 info_ptr->pcal_units = (png_charp)png_malloc_warn(png_ptr, length);
386 if (info_ptr->pcal_units == NULL)
387 {
388 png_warning(png_ptr, "Insufficient memory for pCAL units.");
389 return;
390 }
391 png_memcpy(info_ptr->pcal_units, units, (png_size_t)length);
392
393 info_ptr->pcal_params = (png_charpp)png_malloc_warn(png_ptr,
394 (png_uint_32)((nparams + 1) * png_sizeof(png_charp)));
395 if (info_ptr->pcal_params == NULL)
396 {
397 png_warning(png_ptr, "Insufficient memory for pCAL params.");
398 return;
399 }
400
401 png_memset(info_ptr->pcal_params, 0, (nparams + 1) * png_sizeof(png_charp));
402
403 for (i = 0; i < nparams; i++)
404 {
405 length = png_strlen(params[i]) + 1;
406 png_debug2(3, "allocating parameter %d for info (%lu bytes)", i,
407 (unsigned long)length);
408 info_ptr->pcal_params[i] = (png_charp)png_malloc_warn(png_ptr, length);
409 if (info_ptr->pcal_params[i] == NULL)
410 {
411 png_warning(png_ptr, "Insufficient memory for pCAL parameter.");
412 return;
413 }
414 png_memcpy(info_ptr->pcal_params[i], params[i], (png_size_t)length);
415 }
416
417 info_ptr->valid |= PNG_INFO_pCAL;
418#ifdef PNG_FREE_ME_SUPPORTED
419 info_ptr->free_me |= PNG_FREE_PCAL;
420#endif
421}
422#endif
423
424#if defined(PNG_READ_sCAL_SUPPORTED) || defined(PNG_WRITE_sCAL_SUPPORTED)
425#ifdef PNG_FLOATING_POINT_SUPPORTED
426void PNGAPI
427png_set_sCAL(png_structp png_ptr, png_infop info_ptr,
428 int unit, double width, double height)
429{
430 png_debug1(1, "in %s storage function", "sCAL");
431
432 if (png_ptr == NULL || info_ptr == NULL)
433 return;
434
435 info_ptr->scal_unit = (png_byte)unit;
436 info_ptr->scal_pixel_width = width;
437 info_ptr->scal_pixel_height = height;
438
439 info_ptr->valid |= PNG_INFO_sCAL;
440}
441#else
442#ifdef PNG_FIXED_POINT_SUPPORTED
443void PNGAPI
444png_set_sCAL_s(png_structp png_ptr, png_infop info_ptr,
445 int unit, png_charp swidth, png_charp sheight)
446{
447 png_uint_32 length;
448
449 png_debug1(1, "in %s storage function", "sCAL");
450
451 if (png_ptr == NULL || info_ptr == NULL)
452 return;
453
454 info_ptr->scal_unit = (png_byte)unit;
455
456 length = png_strlen(swidth) + 1;
457 png_debug1(3, "allocating unit for info (%u bytes)",
458 (unsigned int)length);
459 info_ptr->scal_s_width = (png_charp)png_malloc_warn(png_ptr, length);
460 if (info_ptr->scal_s_width == NULL)
461 {
462 png_warning(png_ptr,
463 "Memory allocation failed while processing sCAL.");
464 return;
465 }
466 png_memcpy(info_ptr->scal_s_width, swidth, (png_size_t)length);
467
468 length = png_strlen(sheight) + 1;
469 png_debug1(3, "allocating unit for info (%u bytes)",
470 (unsigned int)length);
471 info_ptr->scal_s_height = (png_charp)png_malloc_warn(png_ptr, length);
472 if (info_ptr->scal_s_height == NULL)
473 {
474 png_free (png_ptr, info_ptr->scal_s_width);
475 info_ptr->scal_s_width = NULL;
476 png_warning(png_ptr,
477 "Memory allocation failed while processing sCAL.");
478 return;
479 }
480 png_memcpy(info_ptr->scal_s_height, sheight, (png_size_t)length);
481 info_ptr->valid |= PNG_INFO_sCAL;
482#ifdef PNG_FREE_ME_SUPPORTED
483 info_ptr->free_me |= PNG_FREE_SCAL;
484#endif
485}
486#endif
487#endif
488#endif
489
490#if defined(PNG_pHYs_SUPPORTED)
491void PNGAPI
492png_set_pHYs(png_structp png_ptr, png_infop info_ptr,
493 png_uint_32 res_x, png_uint_32 res_y, int unit_type)
494{
495 png_debug1(1, "in %s storage function", "pHYs");
496
497 if (png_ptr == NULL || info_ptr == NULL)
498 return;
499
500 info_ptr->x_pixels_per_unit = res_x;
501 info_ptr->y_pixels_per_unit = res_y;
502 info_ptr->phys_unit_type = (png_byte)unit_type;
503 info_ptr->valid |= PNG_INFO_pHYs;
504}
505#endif
506
507void PNGAPI
508png_set_PLTE(png_structp png_ptr, png_infop info_ptr,
509 png_colorp palette, int num_palette)
510{
511
512 png_debug1(1, "in %s storage function", "PLTE");
513
514 if (png_ptr == NULL || info_ptr == NULL)
515 return;
516
517 if (num_palette < 0 || num_palette > PNG_MAX_PALETTE_LENGTH)
518 {
519 if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
520 png_error(png_ptr, "Invalid palette length");
521 else
522 {
523 png_warning(png_ptr, "Invalid palette length");
524 return;
525 }
526 }
527
528 /*
529 * It may not actually be necessary to set png_ptr->palette here;
530 * we do it for backward compatibility with the way the png_handle_tRNS
531 * function used to do the allocation.
532 */
533#ifdef PNG_FREE_ME_SUPPORTED
534 png_free_data(png_ptr, info_ptr, PNG_FREE_PLTE, 0);
535#endif
536
537 /* Changed in libpng-1.2.1 to allocate PNG_MAX_PALETTE_LENGTH instead
538 * of num_palette entries, in case of an invalid PNG file that has
539 * too-large sample values.
540 */
541 png_ptr->palette = (png_colorp)png_malloc(png_ptr,
542 PNG_MAX_PALETTE_LENGTH * png_sizeof(png_color));
543 png_memset(png_ptr->palette, 0, PNG_MAX_PALETTE_LENGTH *
544 png_sizeof(png_color));
545 png_memcpy(png_ptr->palette, palette, num_palette * png_sizeof(png_color));
546 info_ptr->palette = png_ptr->palette;
547 info_ptr->num_palette = png_ptr->num_palette = (png_uint_16)num_palette;
548
549#ifdef PNG_FREE_ME_SUPPORTED
550 info_ptr->free_me |= PNG_FREE_PLTE;
551#else
552 png_ptr->flags |= PNG_FLAG_FREE_PLTE;
553#endif
554
555 info_ptr->valid |= PNG_INFO_PLTE;
556}
557
558#if defined(PNG_sBIT_SUPPORTED)
559void PNGAPI
560png_set_sBIT(png_structp png_ptr, png_infop info_ptr,
561 png_color_8p sig_bit)
562{
563 png_debug1(1, "in %s storage function", "sBIT");
564
565 if (png_ptr == NULL || info_ptr == NULL)
566 return;
567
568 png_memcpy(&(info_ptr->sig_bit), sig_bit, png_sizeof(png_color_8));
569 info_ptr->valid |= PNG_INFO_sBIT;
570}
571#endif
572
573#if defined(PNG_sRGB_SUPPORTED)
574void PNGAPI
575png_set_sRGB(png_structp png_ptr, png_infop info_ptr, int intent)
576{
577 png_debug1(1, "in %s storage function", "sRGB");
578
579 if (png_ptr == NULL || info_ptr == NULL)
580 return;
581
582 info_ptr->srgb_intent = (png_byte)intent;
583 info_ptr->valid |= PNG_INFO_sRGB;
584}
585
586void PNGAPI
587png_set_sRGB_gAMA_and_cHRM(png_structp png_ptr, png_infop info_ptr,
588 int intent)
589{
590#if defined(PNG_gAMA_SUPPORTED)
591#ifdef PNG_FLOATING_POINT_SUPPORTED
592 float file_gamma;
593#endif
594#ifdef PNG_FIXED_POINT_SUPPORTED
595 png_fixed_point int_file_gamma;
596#endif
597#endif
598#if defined(PNG_cHRM_SUPPORTED)
599#ifdef PNG_FLOATING_POINT_SUPPORTED
600 float white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y;
601#endif
602 png_fixed_point int_white_x, int_white_y, int_red_x, int_red_y, int_green_x,
603 int_green_y, int_blue_x, int_blue_y;
604#endif
605 png_debug1(1, "in %s storage function", "sRGB_gAMA_and_cHRM");
606
607 if (png_ptr == NULL || info_ptr == NULL)
608 return;
609
610 png_set_sRGB(png_ptr, info_ptr, intent);
611
612#if defined(PNG_gAMA_SUPPORTED)
613#ifdef PNG_FLOATING_POINT_SUPPORTED
614 file_gamma = (float).45455;
615 png_set_gAMA(png_ptr, info_ptr, file_gamma);
616#endif
617#ifdef PNG_FIXED_POINT_SUPPORTED
618 int_file_gamma = 45455L;
619 png_set_gAMA_fixed(png_ptr, info_ptr, int_file_gamma);
620#endif
621#endif
622
623#if defined(PNG_cHRM_SUPPORTED)
624 int_white_x = 31270L;
625 int_white_y = 32900L;
626 int_red_x = 64000L;
627 int_red_y = 33000L;
628 int_green_x = 30000L;
629 int_green_y = 60000L;
630 int_blue_x = 15000L;
631 int_blue_y = 6000L;
632
633#ifdef PNG_FLOATING_POINT_SUPPORTED
634 white_x = (float).3127;
635 white_y = (float).3290;
636 red_x = (float).64;
637 red_y = (float).33;
638 green_x = (float).30;
639 green_y = (float).60;
640 blue_x = (float).15;
641 blue_y = (float).06;
642#endif
643
644#if !defined(PNG_NO_CHECK_cHRM)
645 if (png_check_cHRM_fixed(png_ptr,
646 int_white_x, int_white_y, int_red_x, int_red_y, int_green_x,
647 int_green_y, int_blue_x, int_blue_y))
648#endif
649 {
650#ifdef PNG_FIXED_POINT_SUPPORTED
651 png_set_cHRM_fixed(png_ptr, info_ptr,
652 int_white_x, int_white_y, int_red_x, int_red_y, int_green_x,
653 int_green_y, int_blue_x, int_blue_y);
654#endif
655#ifdef PNG_FLOATING_POINT_SUPPORTED
656 png_set_cHRM(png_ptr, info_ptr,
657 white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y);
658#endif
659 }
660#endif /* cHRM */
661}
662#endif /* sRGB */
663
664
665#if defined(PNG_iCCP_SUPPORTED)
666void PNGAPI
667png_set_iCCP(png_structp png_ptr, png_infop info_ptr,
668 png_charp name, int compression_type,
669 png_charp profile, png_uint_32 proflen)
670{
671 png_charp new_iccp_name;
672 png_charp new_iccp_profile;
673 png_uint_32 length;
674
675 png_debug1(1, "in %s storage function", "iCCP");
676
677 if (png_ptr == NULL || info_ptr == NULL || name == NULL || profile == NULL)
678 return;
679
680 length = png_strlen(name)+1;
681 new_iccp_name = (png_charp)png_malloc_warn(png_ptr, length);
682 if (new_iccp_name == NULL)
683 {
684 png_warning(png_ptr, "Insufficient memory to process iCCP chunk.");
685 return;
686 }
687 png_memcpy(new_iccp_name, name, length);
688 new_iccp_profile = (png_charp)png_malloc_warn(png_ptr, proflen);
689 if (new_iccp_profile == NULL)
690 {
691 png_free (png_ptr, new_iccp_name);
692 png_warning(png_ptr,
693 "Insufficient memory to process iCCP profile.");
694 return;
695 }
696 png_memcpy(new_iccp_profile, profile, (png_size_t)proflen);
697
698 png_free_data(png_ptr, info_ptr, PNG_FREE_ICCP, 0);
699
700 info_ptr->iccp_proflen = proflen;
701 info_ptr->iccp_name = new_iccp_name;
702 info_ptr->iccp_profile = new_iccp_profile;
703 /* Compression is always zero but is here so the API and info structure
704 * does not have to change if we introduce multiple compression types */
705 info_ptr->iccp_compression = (png_byte)compression_type;
706#ifdef PNG_FREE_ME_SUPPORTED
707 info_ptr->free_me |= PNG_FREE_ICCP;
708#endif
709 info_ptr->valid |= PNG_INFO_iCCP;
710}
711#endif
712
713#if defined(PNG_TEXT_SUPPORTED)
714void PNGAPI
715png_set_text(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr,
716 int num_text)
717{
718 int ret;
719 ret = png_set_text_2(png_ptr, info_ptr, text_ptr, num_text);
720 if (ret)
721 png_error(png_ptr, "Insufficient memory to store text");
722}
723
724int /* PRIVATE */
725png_set_text_2(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr,
726 int num_text)
727{
728 int i;
729
730 png_debug1(1, "in %s storage function", ((png_ptr == NULL ||
731 png_ptr->chunk_name[0] == '\0') ?
732 "text" : (png_const_charp)png_ptr->chunk_name));
733
734 if (png_ptr == NULL || info_ptr == NULL || num_text == 0)
735 return(0);
736
737 /* Make sure we have enough space in the "text" array in info_struct
738 * to hold all of the incoming text_ptr objects.
739 */
740 if (info_ptr->num_text + num_text > info_ptr->max_text)
741 {
742 if (info_ptr->text != NULL)
743 {
744 png_textp old_text;
745 int old_max;
746
747 old_max = info_ptr->max_text;
748 info_ptr->max_text = info_ptr->num_text + num_text + 8;
749 old_text = info_ptr->text;
750 info_ptr->text = (png_textp)png_malloc_warn(png_ptr,
751 (png_uint_32)(info_ptr->max_text * png_sizeof(png_text)));
752 if (info_ptr->text == NULL)
753 {
754 png_free(png_ptr, old_text);
755 return(1);
756 }
757 png_memcpy(info_ptr->text, old_text, (png_size_t)(old_max *
758 png_sizeof(png_text)));
759 png_free(png_ptr, old_text);
760 }
761 else
762 {
763 info_ptr->max_text = num_text + 8;
764 info_ptr->num_text = 0;
765 info_ptr->text = (png_textp)png_malloc_warn(png_ptr,
766 (png_uint_32)(info_ptr->max_text * png_sizeof(png_text)));
767 if (info_ptr->text == NULL)
768 return(1);
769#ifdef PNG_FREE_ME_SUPPORTED
770 info_ptr->free_me |= PNG_FREE_TEXT;
771#endif
772 }
773 png_debug1(3, "allocated %d entries for info_ptr->text",
774 info_ptr->max_text);
775 }
776 for (i = 0; i < num_text; i++)
777 {
778 png_size_t text_length, key_len;
779 png_size_t lang_len, lang_key_len;
780 png_textp textp = &(info_ptr->text[info_ptr->num_text]);
781
782 if (text_ptr[i].key == NULL)
783 continue;
784
785 key_len = png_strlen(text_ptr[i].key);
786
787 if (text_ptr[i].compression <= 0)
788 {
789 lang_len = 0;
790 lang_key_len = 0;
791 }
792 else
793#ifdef PNG_iTXt_SUPPORTED
794 {
795 /* Set iTXt data */
796 if (text_ptr[i].lang != NULL)
797 lang_len = png_strlen(text_ptr[i].lang);
798 else
799 lang_len = 0;
800 if (text_ptr[i].lang_key != NULL)
801 lang_key_len = png_strlen(text_ptr[i].lang_key);
802 else
803 lang_key_len = 0;
804 }
805#else
806 {
807 png_warning(png_ptr, "iTXt chunk not supported.");
808 continue;
809 }
810#endif
811
812 if (text_ptr[i].text == NULL || text_ptr[i].text[0] == '\0')
813 {
814 text_length = 0;
815#ifdef PNG_iTXt_SUPPORTED
816 if (text_ptr[i].compression > 0)
817 textp->compression = PNG_ITXT_COMPRESSION_NONE;
818 else
819#endif
820 textp->compression = PNG_TEXT_COMPRESSION_NONE;
821 }
822 else
823 {
824 text_length = png_strlen(text_ptr[i].text);
825 textp->compression = text_ptr[i].compression;
826 }
827
828 textp->key = (png_charp)png_malloc_warn(png_ptr,
829 (png_uint_32)
830 (key_len + text_length + lang_len + lang_key_len + 4));
831 if (textp->key == NULL)
832 return(1);
833 png_debug2(2, "Allocated %lu bytes at %x in png_set_text",
834 (png_uint_32)
835 (key_len + lang_len + lang_key_len + text_length + 4),
836 (int)textp->key);
837
838 png_memcpy(textp->key, text_ptr[i].key,(png_size_t)(key_len));
839 *(textp->key + key_len) = '\0';
840#ifdef PNG_iTXt_SUPPORTED
841 if (text_ptr[i].compression > 0)
842 {
843 textp->lang = textp->key + key_len + 1;
844 png_memcpy(textp->lang, text_ptr[i].lang, lang_len);
845 *(textp->lang + lang_len) = '\0';
846 textp->lang_key = textp->lang + lang_len + 1;
847 png_memcpy(textp->lang_key, text_ptr[i].lang_key, lang_key_len);
848 *(textp->lang_key + lang_key_len) = '\0';
849 textp->text = textp->lang_key + lang_key_len + 1;
850 }
851 else
852#endif
853 {
854#ifdef PNG_iTXt_SUPPORTED
855 textp->lang=NULL;
856 textp->lang_key=NULL;
857#endif
858 textp->text = textp->key + key_len + 1;
859 }
860 if (text_length)
861 png_memcpy(textp->text, text_ptr[i].text,
862 (png_size_t)(text_length));
863 *(textp->text + text_length) = '\0';
864
865#ifdef PNG_iTXt_SUPPORTED
866 if (textp->compression > 0)
867 {
868 textp->text_length = 0;
869 textp->itxt_length = text_length;
870 }
871 else
872#endif
873 {
874 textp->text_length = text_length;
875#ifdef PNG_iTXt_SUPPORTED
876 textp->itxt_length = 0;
877#endif
878 }
879 info_ptr->num_text++;
880 png_debug1(3, "transferred text chunk %d", info_ptr->num_text);
881 }
882 return(0);
883}
884#endif
885
886#if defined(PNG_tIME_SUPPORTED)
887void PNGAPI
888png_set_tIME(png_structp png_ptr, png_infop info_ptr, png_timep mod_time)
889{
890 png_debug1(1, "in %s storage function", "tIME");
891
892 if (png_ptr == NULL || info_ptr == NULL ||
893 (png_ptr->mode & PNG_WROTE_tIME))
894 return;
895
896 png_memcpy(&(info_ptr->mod_time), mod_time, png_sizeof(png_time));
897 info_ptr->valid |= PNG_INFO_tIME;
898}
899#endif
900
901#if defined(PNG_tRNS_SUPPORTED)
902void PNGAPI
903png_set_tRNS(png_structp png_ptr, png_infop info_ptr,
904 png_bytep trans, int num_trans, png_color_16p trans_values)
905{
906 png_debug1(1, "in %s storage function", "tRNS");
907
908 if (png_ptr == NULL || info_ptr == NULL)
909 return;
910
911 if (trans != NULL)
912 {
913 /*
914 * It may not actually be necessary to set png_ptr->trans here;
915 * we do it for backward compatibility with the way the png_handle_tRNS
916 * function used to do the allocation.
917 */
918
919#ifdef PNG_FREE_ME_SUPPORTED
920 png_free_data(png_ptr, info_ptr, PNG_FREE_TRNS, 0);
921#endif
922
923 /* Changed from num_trans to PNG_MAX_PALETTE_LENGTH in version 1.2.1 */
924 png_ptr->trans = info_ptr->trans = (png_bytep)png_malloc(png_ptr,
925 (png_uint_32)PNG_MAX_PALETTE_LENGTH);
926 if (num_trans > 0 && num_trans <= PNG_MAX_PALETTE_LENGTH)
927 png_memcpy(info_ptr->trans, trans, (png_size_t)num_trans);
928 }
929
930 if (trans_values != NULL)
931 {
932 int sample_max = (1 << info_ptr->bit_depth);
933 if ((info_ptr->color_type == PNG_COLOR_TYPE_GRAY &&
934 (int)trans_values->gray > sample_max) ||
935 (info_ptr->color_type == PNG_COLOR_TYPE_RGB &&
936 ((int)trans_values->red > sample_max ||
937 (int)trans_values->green > sample_max ||
938 (int)trans_values->blue > sample_max)))
939 png_warning(png_ptr,
940 "tRNS chunk has out-of-range samples for bit_depth");
941 png_memcpy(&(info_ptr->trans_values), trans_values,
942 png_sizeof(png_color_16));
943 if (num_trans == 0)
944 num_trans = 1;
945 }
946
947 info_ptr->num_trans = (png_uint_16)num_trans;
948 if (num_trans != 0)
949 {
950 info_ptr->valid |= PNG_INFO_tRNS;
951#ifdef PNG_FREE_ME_SUPPORTED
952 info_ptr->free_me |= PNG_FREE_TRNS;
953#else
954 png_ptr->flags |= PNG_FLAG_FREE_TRNS;
955#endif
956 }
957}
958#endif
959
960#if defined(PNG_sPLT_SUPPORTED)
961void PNGAPI
962png_set_sPLT(png_structp png_ptr,
963 png_infop info_ptr, png_sPLT_tp entries, int nentries)
964/*
965 * entries - array of png_sPLT_t structures
966 * to be added to the list of palettes
967 * in the info structure.
968 * nentries - number of palette structures to be
969 * added.
970 */
971{
972 png_sPLT_tp np;
973 int i;
974
975 if (png_ptr == NULL || info_ptr == NULL)
976 return;
977
978 np = (png_sPLT_tp)png_malloc_warn(png_ptr,
979 (info_ptr->splt_palettes_num + nentries) *
980 (png_uint_32)png_sizeof(png_sPLT_t));
981 if (np == NULL)
982 {
983 png_warning(png_ptr, "No memory for sPLT palettes.");
984 return;
985 }
986
987 png_memcpy(np, info_ptr->splt_palettes,
988 info_ptr->splt_palettes_num * png_sizeof(png_sPLT_t));
989 png_free(png_ptr, info_ptr->splt_palettes);
990 info_ptr->splt_palettes=NULL;
991
992 for (i = 0; i < nentries; i++)
993 {
994 png_sPLT_tp to = np + info_ptr->splt_palettes_num + i;
995 png_sPLT_tp from = entries + i;
996 png_uint_32 length;
997
998 length = png_strlen(from->name) + 1;
999 to->name = (png_charp)png_malloc_warn(png_ptr, length);
1000 if (to->name == NULL)
1001 {
1002 png_warning(png_ptr,
1003 "Out of memory while processing sPLT chunk");
1004 continue;
1005 }
1006 png_memcpy(to->name, from->name, length);
1007 to->entries = (png_sPLT_entryp)png_malloc_warn(png_ptr,
1008 (png_uint_32)(from->nentries * png_sizeof(png_sPLT_entry)));
1009 if (to->entries == NULL)
1010 {
1011 png_warning(png_ptr,
1012 "Out of memory while processing sPLT chunk");
1013 png_free(png_ptr, to->name);
1014 to->name = NULL;
1015 continue;
1016 }
1017 png_memcpy(to->entries, from->entries,
1018 from->nentries * png_sizeof(png_sPLT_entry));
1019 to->nentries = from->nentries;
1020 to->depth = from->depth;
1021 }
1022
1023 info_ptr->splt_palettes = np;
1024 info_ptr->splt_palettes_num += nentries;
1025 info_ptr->valid |= PNG_INFO_sPLT;
1026#ifdef PNG_FREE_ME_SUPPORTED
1027 info_ptr->free_me |= PNG_FREE_SPLT;
1028#endif
1029}
1030#endif /* PNG_sPLT_SUPPORTED */
1031
1032#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
1033void PNGAPI
1034png_set_unknown_chunks(png_structp png_ptr,
1035 png_infop info_ptr, png_unknown_chunkp unknowns, int num_unknowns)
1036{
1037 png_unknown_chunkp np;
1038 int i;
1039
1040 if (png_ptr == NULL || info_ptr == NULL || num_unknowns == 0)
1041 return;
1042
1043 np = (png_unknown_chunkp)png_malloc_warn(png_ptr,
1044 (png_uint_32)((info_ptr->unknown_chunks_num + num_unknowns) *
1045 png_sizeof(png_unknown_chunk)));
1046 if (np == NULL)
1047 {
1048 png_warning(png_ptr,
1049 "Out of memory while processing unknown chunk.");
1050 return;
1051 }
1052
1053 png_memcpy(np, info_ptr->unknown_chunks,
1054 info_ptr->unknown_chunks_num * png_sizeof(png_unknown_chunk));
1055 png_free(png_ptr, info_ptr->unknown_chunks);
1056 info_ptr->unknown_chunks=NULL;
1057
1058 for (i = 0; i < num_unknowns; i++)
1059 {
1060 png_unknown_chunkp to = np + info_ptr->unknown_chunks_num + i;
1061 png_unknown_chunkp from = unknowns + i;
1062
1063 png_memcpy((png_charp)to->name,
1064 (png_charp)from->name,
1065 png_sizeof(from->name));
1066 to->name[png_sizeof(to->name)-1] = '\0';
1067 to->size = from->size;
1068 /* Note our location in the read or write sequence */
1069 to->location = (png_byte)(png_ptr->mode & 0xff);
1070
1071 if (from->size == 0)
1072 to->data=NULL;
1073 else
1074 {
1075 to->data = (png_bytep)png_malloc_warn(png_ptr,
1076 (png_uint_32)from->size);
1077 if (to->data == NULL)
1078 {
1079 png_warning(png_ptr,
1080 "Out of memory while processing unknown chunk.");
1081 to->size = 0;
1082 }
1083 else
1084 png_memcpy(to->data, from->data, from->size);
1085 }
1086 }
1087
1088 info_ptr->unknown_chunks = np;
1089 info_ptr->unknown_chunks_num += num_unknowns;
1090#ifdef PNG_FREE_ME_SUPPORTED
1091 info_ptr->free_me |= PNG_FREE_UNKN;
1092#endif
1093}
1094void PNGAPI
1095png_set_unknown_chunk_location(png_structp png_ptr, png_infop info_ptr,
1096 int chunk, int location)
1097{
1098 if (png_ptr != NULL && info_ptr != NULL && chunk >= 0 && chunk <
1099 (int)info_ptr->unknown_chunks_num)
1100 info_ptr->unknown_chunks[chunk].location = (png_byte)location;
1101}
1102#endif
1103
1104#if defined(PNG_1_0_X) || defined(PNG_1_2_X)
1105#if defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \
1106 defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED)
1107void PNGAPI
1108png_permit_empty_plte (png_structp png_ptr, int empty_plte_permitted)
1109{
1110 /* This function is deprecated in favor of png_permit_mng_features()
1111 and will be removed from libpng-1.3.0 */
1112
1113 png_debug(1, "in png_permit_empty_plte, DEPRECATED.");
1114
1115 if (png_ptr == NULL)
1116 return;
1117 png_ptr->mng_features_permitted = (png_byte)
1118 ((png_ptr->mng_features_permitted & (~PNG_FLAG_MNG_EMPTY_PLTE)) |
1119 ((empty_plte_permitted & PNG_FLAG_MNG_EMPTY_PLTE)));
1120}
1121#endif
1122#endif
1123
1124#if defined(PNG_MNG_FEATURES_SUPPORTED)
1125png_uint_32 PNGAPI
1126png_permit_mng_features (png_structp png_ptr, png_uint_32 mng_features)
1127{
1128 png_debug(1, "in png_permit_mng_features");
1129
1130 if (png_ptr == NULL)
1131 return (png_uint_32)0;
1132 png_ptr->mng_features_permitted =
1133 (png_byte)(mng_features & PNG_ALL_MNG_FEATURES);
1134 return (png_uint_32)png_ptr->mng_features_permitted;
1135}
1136#endif
1137
1138#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
1139void PNGAPI
1140png_set_keep_unknown_chunks(png_structp png_ptr, int keep, png_bytep
1141 chunk_list, int num_chunks)
1142{
1143 png_bytep new_list, p;
1144 int i, old_num_chunks;
1145 if (png_ptr == NULL)
1146 return;
1147 if (num_chunks == 0)
1148 {
1149 if (keep == PNG_HANDLE_CHUNK_ALWAYS || keep == PNG_HANDLE_CHUNK_IF_SAFE)
1150 png_ptr->flags |= PNG_FLAG_KEEP_UNKNOWN_CHUNKS;
1151 else
1152 png_ptr->flags &= ~PNG_FLAG_KEEP_UNKNOWN_CHUNKS;
1153
1154 if (keep == PNG_HANDLE_CHUNK_ALWAYS)
1155 png_ptr->flags |= PNG_FLAG_KEEP_UNSAFE_CHUNKS;
1156 else
1157 png_ptr->flags &= ~PNG_FLAG_KEEP_UNSAFE_CHUNKS;
1158 return;
1159 }
1160 if (chunk_list == NULL)
1161 return;
1162 old_num_chunks = png_ptr->num_chunk_list;
1163 new_list=(png_bytep)png_malloc(png_ptr,
1164 (png_uint_32)
1165 (5*(num_chunks + old_num_chunks)));
1166 if (png_ptr->chunk_list != NULL)
1167 {
1168 png_memcpy(new_list, png_ptr->chunk_list,
1169 (png_size_t)(5*old_num_chunks));
1170 png_free(png_ptr, png_ptr->chunk_list);
1171 png_ptr->chunk_list=NULL;
1172 }
1173 png_memcpy(new_list + 5*old_num_chunks, chunk_list,
1174 (png_size_t)(5*num_chunks));
1175 for (p = new_list + 5*old_num_chunks + 4, i = 0; i<num_chunks; i++, p += 5)
1176 *p=(png_byte)keep;
1177 png_ptr->num_chunk_list = old_num_chunks + num_chunks;
1178 png_ptr->chunk_list = new_list;
1179#ifdef PNG_FREE_ME_SUPPORTED
1180 png_ptr->free_me |= PNG_FREE_LIST;
1181#endif
1182}
1183#endif
1184
1185#if defined(PNG_READ_USER_CHUNKS_SUPPORTED)
1186void PNGAPI
1187png_set_read_user_chunk_fn(png_structp png_ptr, png_voidp user_chunk_ptr,
1188 png_user_chunk_ptr read_user_chunk_fn)
1189{
1190 png_debug(1, "in png_set_read_user_chunk_fn");
1191
1192 if (png_ptr == NULL)
1193 return;
1194
1195 png_ptr->read_user_chunk_fn = read_user_chunk_fn;
1196 png_ptr->user_chunk_ptr = user_chunk_ptr;
1197}
1198#endif
1199
1200#if defined(PNG_INFO_IMAGE_SUPPORTED)
1201void PNGAPI
1202png_set_rows(png_structp png_ptr, png_infop info_ptr, png_bytepp row_pointers)
1203{
1204 png_debug1(1, "in %s storage function", "rows");
1205
1206 if (png_ptr == NULL || info_ptr == NULL)
1207 return;
1208
1209 if (info_ptr->row_pointers && (info_ptr->row_pointers != row_pointers))
1210 png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0);
1211 info_ptr->row_pointers = row_pointers;
1212 if (row_pointers)
1213 info_ptr->valid |= PNG_INFO_IDAT;
1214}
1215#endif
1216
1217#ifdef PNG_WRITE_SUPPORTED
1218void PNGAPI
1219png_set_compression_buffer_size(png_structp png_ptr,
1220 png_uint_32 size)
1221{
1222 if (png_ptr == NULL)
1223 return;
1224 png_free(png_ptr, png_ptr->zbuf);
1225 png_ptr->zbuf_size = (png_size_t)size;
1226 png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, size);
1227 png_ptr->zstream.next_out = png_ptr->zbuf;
1228 png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
1229}
1230#endif
1231
1232void PNGAPI
1233png_set_invalid(png_structp png_ptr, png_infop info_ptr, int mask)
1234{
1235 if (png_ptr && info_ptr)
1236 info_ptr->valid &= ~mask;
1237}
1238
1239
1240#ifndef PNG_1_0_X
1241#ifdef PNG_ASSEMBLER_CODE_SUPPORTED
1242/* Function was added to libpng 1.2.0 and should always exist by default */
1243void PNGAPI
1244png_set_asm_flags (png_structp png_ptr, png_uint_32 asm_flags)
1245{
1246/* Obsolete as of libpng-1.2.20 and will be removed from libpng-1.4.0 */
1247 if (png_ptr != NULL)
1248 png_ptr->asm_flags = 0;
1249 asm_flags = asm_flags; /* Quiet the compiler */
1250}
1251
1252/* This function was added to libpng 1.2.0 */
1253void PNGAPI
1254png_set_mmx_thresholds (png_structp png_ptr,
1255 png_byte mmx_bitdepth_threshold,
1256 png_uint_32 mmx_rowbytes_threshold)
1257{
1258/* Obsolete as of libpng-1.2.20 and will be removed from libpng-1.4.0 */
1259 if (png_ptr == NULL)
1260 return;
1261 /* Quiet the compiler */
1262 mmx_bitdepth_threshold = mmx_bitdepth_threshold;
1263 mmx_rowbytes_threshold = mmx_rowbytes_threshold;
1264}
1265#endif /* ?PNG_ASSEMBLER_CODE_SUPPORTED */
1266
1267#ifdef PNG_SET_USER_LIMITS_SUPPORTED
1268/* This function was added to libpng 1.2.6 */
1269void PNGAPI
1270png_set_user_limits (png_structp png_ptr, png_uint_32 user_width_max,
1271 png_uint_32 user_height_max)
1272{
1273 /* Images with dimensions larger than these limits will be
1274 * rejected by png_set_IHDR(). To accept any PNG datastream
1275 * regardless of dimensions, set both limits to 0x7ffffffL.
1276 */
1277 if (png_ptr == NULL)
1278 return;
1279 png_ptr->user_width_max = user_width_max;
1280 png_ptr->user_height_max = user_height_max;
1281}
1282#endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */
1283
1284#endif /* ?PNG_1_0_X */
1285#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */
Note: See TracBrowser for help on using the repository browser.