pngset.c 32.6 KB
Newer Older
A
Andreas Dilger 已提交
1 2

/* pngset.c - storage of image information into info struct
3
 *
4
 * Last changed in libpng 1.5.0 [August 11, 2010]
5
 * Copyright (c) 1998-2010 Glenn Randers-Pehrson
6 7
 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
 * (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 14 15 16 17
 * The functions here are used during reads to store data from the file
 * into the info struct, and during writes to store application data
 * into the info struct for writing into the file.  This abstracts the
 * info struct and allows us to change the structure in the future.
 */
A
Andreas Dilger 已提交
18

19
#include "pngpriv.h"
20

21 22
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)

23
#ifdef PNG_bKGD_SUPPORTED
24
void PNGAPI
25 26
png_set_bKGD(png_structp png_ptr, png_infop info_ptr,
    png_const_color_16p background)
A
Andreas Dilger 已提交
27
{
28
   png_debug1(1, "in %s storage function", "bKGD");
29

30
   if (png_ptr == NULL || info_ptr == NULL)
A
Andreas Dilger 已提交
31 32
      return;

33
   png_memcpy(&(info_ptr->background), background, png_sizeof(png_color_16));
A
Andreas Dilger 已提交
34 35 36 37
   info_ptr->valid |= PNG_INFO_bKGD;
}
#endif

38
#ifdef PNG_cHRM_SUPPORTED
G
[devel]  
Glenn Randers-Pehrson 已提交
39
void PNGFAPI
40
png_set_cHRM_fixed(png_structp png_ptr, png_infop info_ptr,
41 42 43
    png_fixed_point white_x, png_fixed_point white_y, png_fixed_point red_x,
    png_fixed_point red_y, png_fixed_point green_x, png_fixed_point green_y,
    png_fixed_point blue_x, png_fixed_point blue_y)
44
{
45
   png_debug1(1, "in %s storage function", "cHRM fixed");
46

47 48
   if (png_ptr == NULL || info_ptr == NULL)
      return;
A
Andreas Dilger 已提交
49

50
#ifdef PNG_CHECK_cHRM_SUPPORTED
51
   if (png_check_cHRM_fixed(png_ptr,
52
       white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y))
53
#endif
54
   {
G
[devel]  
Glenn Randers-Pehrson 已提交
55 56 57 58 59 60 61 62
      info_ptr->x_white = white_x;
      info_ptr->y_white = white_y;
      info_ptr->x_red   = red_x;
      info_ptr->y_red   = red_y;
      info_ptr->x_green = green_x;
      info_ptr->y_green = green_y;
      info_ptr->x_blue  = blue_x;
      info_ptr->y_blue  = blue_y;
63
      info_ptr->valid |= PNG_INFO_cHRM;
64
   }
65 66 67
}

#ifdef PNG_FLOATING_POINT_SUPPORTED
68
void PNGAPI
G
[devel]  
Glenn Randers-Pehrson 已提交
69 70 71
png_set_cHRM(png_structp png_ptr, png_infop info_ptr,
    double white_x, double white_y, double red_x, double red_y,
    double green_x, double green_y, double blue_x, double blue_y)
A
Andreas Dilger 已提交
72
{
G
[devel]  
Glenn Randers-Pehrson 已提交
73 74 75 76 77 78 79 80 81 82 83
   png_set_cHRM_fixed(png_ptr, info_ptr,
      png_fixed(png_ptr, white_x, "cHRM White X"),
      png_fixed(png_ptr, white_y, "cHRM White Y"),
      png_fixed(png_ptr, red_x, "cHRM Red X"),
      png_fixed(png_ptr, red_y, "cHRM Red Y"),
      png_fixed(png_ptr, green_x, "cHRM Green X"),
      png_fixed(png_ptr, green_y, "cHRM Green Y"),
      png_fixed(png_ptr, blue_x, "cHRM Blue X"),
      png_fixed(png_ptr, blue_y, "cHRM Blue Y"));
}
#endif /* PNG_FLOATING_POINT_SUPPORTED */
84

G
[devel]  
Glenn Randers-Pehrson 已提交
85
#endif /* PNG_cHRM_SUPPORTED */
86

G
[devel]  
Glenn Randers-Pehrson 已提交
87 88
#ifdef PNG_gAMA_SUPPORTED
void PNGFAPI
89
png_set_gAMA_fixed(png_structp png_ptr, png_infop info_ptr, png_fixed_point
G
[devel]  
Glenn Randers-Pehrson 已提交
90
    gamma)
91
{
92
   png_debug1(1, "in %s storage function", "gAMA");
93

94 95 96
   if (png_ptr == NULL || info_ptr == NULL)
      return;

G
[devel]  
Glenn Randers-Pehrson 已提交
97
   /* Previously these values were limited, however they must be
98
    * wrong, therefore storing them (and setting PNG_INFO_gAMA)
G
[devel]  
Glenn Randers-Pehrson 已提交
99 100 101 102 103 104
    * must be wrong too.
    */
   if (gamma > (png_fixed_point)PNG_UINT_31_MAX)
      png_warning(png_ptr, "Gamma too large, ignored");

   else if (gamma <= 0)
105
      png_warning(png_ptr, "Negative or zero gamma ignored");
106

107 108
   else
   {
G
[devel]  
Glenn Randers-Pehrson 已提交
109 110
      info_ptr->gamma = gamma;
      info_ptr->valid |= PNG_INFO_gAMA;
111
   }
G
[devel]  
Glenn Randers-Pehrson 已提交
112
}
113

G
[devel]  
Glenn Randers-Pehrson 已提交
114 115 116 117 118 119
#ifdef PNG_FLOATING_POINT_SUPPORTED
void PNGAPI
png_set_gAMA(png_structp png_ptr, png_infop info_ptr, double file_gamma)
{
   png_set_gAMA_fixed(png_ptr, info_ptr, png_fixed(png_ptr, file_gamma,
      "png_set_gAMA"));
A
Andreas Dilger 已提交
120
}
121
#endif
122
#endif
A
Andreas Dilger 已提交
123

124
#ifdef PNG_hIST_SUPPORTED
125
void PNGAPI
126
png_set_hIST(png_structp png_ptr, png_infop info_ptr, png_const_uint_16p hist)
A
Andreas Dilger 已提交
127
{
128
   int i;
129

130
   png_debug1(1, "in %s storage function", "hIST");
131

132
   if (png_ptr == NULL || info_ptr == NULL)
A
Andreas Dilger 已提交
133
      return;
134

135
   if (info_ptr->num_palette == 0 || info_ptr->num_palette
136
       > PNG_MAX_PALETTE_LENGTH)
137
   {
138
      png_warning(png_ptr,
139
          "Invalid palette size, hIST allocation skipped");
140

141
      return;
142
   }
143 144

   png_free_data(png_ptr, info_ptr, PNG_FREE_HIST, 0);
145 146 147
   /* Changed from info->num_palette to PNG_MAX_PALETTE_LENGTH in
    * version 1.2.1
    */
148
   png_ptr->hist = (png_uint_16p)png_malloc_warn(png_ptr,
149
       PNG_MAX_PALETTE_LENGTH * png_sizeof(png_uint_16));
150
   if (png_ptr->hist == NULL)
151 152 153 154
   {
      png_warning(png_ptr, "Insufficient memory for hIST chunk data");
      return;
   }
A
Andreas Dilger 已提交
155

156
   for (i = 0; i < info_ptr->num_palette; i++)
157
      png_ptr->hist[i] = hist[i];
158

159
   info_ptr->hist = png_ptr->hist;
A
Andreas Dilger 已提交
160
   info_ptr->valid |= PNG_INFO_hIST;
161 162

   info_ptr->free_me |= PNG_FREE_HIST;
A
Andreas Dilger 已提交
163 164 165
}
#endif

166
void PNGAPI
A
Andreas Dilger 已提交
167 168 169 170 171
png_set_IHDR(png_structp png_ptr, png_infop info_ptr,
   png_uint_32 width, png_uint_32 height, int bit_depth,
   int color_type, int interlace_type, int compression_type,
   int filter_type)
{
172
   png_debug1(1, "in %s storage function", "IHDR");
173

174
   if (png_ptr == NULL || info_ptr == NULL)
A
Andreas Dilger 已提交
175 176 177 178 179
      return;

   info_ptr->width = width;
   info_ptr->height = height;
   info_ptr->bit_depth = (png_byte)bit_depth;
180
   info_ptr->color_type = (png_byte)color_type;
A
Andreas Dilger 已提交
181 182 183
   info_ptr->compression_type = (png_byte)compression_type;
   info_ptr->filter_type = (png_byte)filter_type;
   info_ptr->interlace_type = (png_byte)interlace_type;
184 185 186 187 188

   png_check_IHDR (png_ptr, info_ptr->width, info_ptr->height,
       info_ptr->bit_depth, info_ptr->color_type, info_ptr->interlace_type,
       info_ptr->compression_type, info_ptr->filter_type);

189 190
   if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
      info_ptr->channels = 1;
191

192
   else if (info_ptr->color_type & PNG_COLOR_MASK_COLOR)
A
Andreas Dilger 已提交
193
      info_ptr->channels = 3;
194

A
Andreas Dilger 已提交
195 196
   else
      info_ptr->channels = 1;
197

A
Andreas Dilger 已提交
198 199
   if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA)
      info_ptr->channels++;
200

A
Andreas Dilger 已提交
201
   info_ptr->pixel_depth = (png_byte)(info_ptr->channels * info_ptr->bit_depth);
202

203
   /* Check for potential overflow */
204
   if (width > (PNG_UINT_32_MAX
205
                 >> 3)      /* 8-byte RRGGBBAA pixels */
206 207 208 209
                 - 64       /* bigrowbuf hack */
                 - 1        /* filter byte */
                 - 7*8      /* rounding of width to multiple of 8 pixels */
                 - 8)       /* extra max_pixel_depth pad */
210
      info_ptr->rowbytes = 0;
211
   else
212
      info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, width);
A
Andreas Dilger 已提交
213 214
}

215
#ifdef PNG_oFFs_SUPPORTED
216
void PNGAPI
A
Andreas Dilger 已提交
217
png_set_oFFs(png_structp png_ptr, png_infop info_ptr,
218
    png_int_32 offset_x, png_int_32 offset_y, int unit_type)
A
Andreas Dilger 已提交
219
{
220
   png_debug1(1, "in %s storage function", "oFFs");
221

222
   if (png_ptr == NULL || info_ptr == NULL)
A
Andreas Dilger 已提交
223 224 225 226 227 228 229 230 231
      return;

   info_ptr->x_offset = offset_x;
   info_ptr->y_offset = offset_y;
   info_ptr->offset_unit_type = (png_byte)unit_type;
   info_ptr->valid |= PNG_INFO_oFFs;
}
#endif

232
#ifdef PNG_pCAL_SUPPORTED
233
void PNGAPI
A
Andreas Dilger 已提交
234
png_set_pCAL(png_structp png_ptr, png_infop info_ptr,
235 236
    png_const_charp purpose, png_int_32 X0, png_int_32 X1, int type,
    int nparams, png_const_charp units, png_charpp params)
A
Andreas Dilger 已提交
237
{
238
   png_size_t length;
239
   int i;
A
Andreas Dilger 已提交
240

241
   png_debug1(1, "in %s storage function", "pCAL");
242

243
   if (png_ptr == NULL || info_ptr == NULL)
A
Andreas Dilger 已提交
244 245 246
      return;

   length = png_strlen(purpose) + 1;
247
   png_debug1(3, "allocating purpose for info (%lu bytes)",
248
       (unsigned long)length);
249

G
[devel]  
Glenn Randers-Pehrson 已提交
250 251 252 253 254 255 256 257 258 259 260
   /* TODO: validate format of calibration name and unit name */

   /* Check that the type matches the specification. */
   if (type < 0 || type > 3)
      png_error(png_ptr, "Invalid pCAL equation type");

   /* Validate params[nparams] */
   for (i=0; i<nparams; ++i)
      if (!png_check_fp_string(params[i], png_strlen(params[i])))
         png_error(png_ptr, "Invalid format for pCAL parameter");

261 262
   info_ptr->pcal_purpose = (png_charp)png_malloc_warn(png_ptr, length);
   if (info_ptr->pcal_purpose == NULL)
263
   {
264
      png_warning(png_ptr, "Insufficient memory for pCAL purpose");
265 266
      return;
   }
267

268
   png_memcpy(info_ptr->pcal_purpose, purpose, length);
A
Andreas Dilger 已提交
269

270
   png_debug(3, "storing X0, X1, type, and nparams in info");
A
Andreas Dilger 已提交
271 272 273 274 275 276
   info_ptr->pcal_X0 = X0;
   info_ptr->pcal_X1 = X1;
   info_ptr->pcal_type = (png_byte)type;
   info_ptr->pcal_nparams = (png_byte)nparams;

   length = png_strlen(units) + 1;
277
   png_debug1(3, "allocating units for info (%lu bytes)",
278
     (unsigned long)length);
279

280 281
   info_ptr->pcal_units = (png_charp)png_malloc_warn(png_ptr, length);
   if (info_ptr->pcal_units == NULL)
282
   {
283
      png_warning(png_ptr, "Insufficient memory for pCAL units");
284 285 286
      return;
   }
   png_memcpy(info_ptr->pcal_units, units, length);
A
Andreas Dilger 已提交
287

288
   info_ptr->pcal_params = (png_charpp)png_malloc_warn(png_ptr,
289
      (png_size_t)((nparams + 1) * png_sizeof(png_charp)));
290

291
   if (info_ptr->pcal_params == NULL)
292
   {
293
      png_warning(png_ptr, "Insufficient memory for pCAL params");
294 295
      return;
   }
296

297
   png_memset(info_ptr->pcal_params, 0, (nparams + 1) * png_sizeof(png_charp));
A
Andreas Dilger 已提交
298 299 300 301

   for (i = 0; i < nparams; i++)
   {
      length = png_strlen(params[i]) + 1;
302
      png_debug2(3, "allocating parameter %d for info (%lu bytes)", i,
303
        (unsigned long)length);
304

305
      info_ptr->pcal_params[i] = (png_charp)png_malloc_warn(png_ptr, length);
306

307
      if (info_ptr->pcal_params[i] == NULL)
308
      {
309 310
         png_warning(png_ptr, "Insufficient memory for pCAL parameter");
         return;
311
      }
312

313
      png_memcpy(info_ptr->pcal_params[i], params[i], length);
A
Andreas Dilger 已提交
314 315 316
   }

   info_ptr->valid |= PNG_INFO_pCAL;
317
   info_ptr->free_me |= PNG_FREE_PCAL;
A
Andreas Dilger 已提交
318 319 320
}
#endif

321
#ifdef PNG_sCAL_SUPPORTED
322
void PNGAPI
323
png_set_sCAL_s(png_structp png_ptr, png_infop info_ptr,
324
    int unit, png_const_charp swidth, png_const_charp sheight)
325
{
326
   png_size_t lengthw = 0, lengthh = 0;
327

328
   png_debug1(1, "in %s storage function", "sCAL");
329

330 331 332
   if (png_ptr == NULL || info_ptr == NULL)
      return;

G
[devel]  
Glenn Randers-Pehrson 已提交
333 334 335 336 337 338 339 340 341 342 343 344 345 346
   /* Double check the unit (should never get here with an invalid
    * unit unless this is an API call.)
    */
   if (unit != 1 && unit != 2)
      png_error(png_ptr, "Invalid sCAL unit");

   if (swidth == NULL || (lengthw = png_strlen(swidth)) <= 0 ||
       swidth[0] == 45 /*'-'*/ || !png_check_fp_string(swidth, lengthw))
      png_error(png_ptr, "Invalid sCAL width");

   if (sheight == NULL || (lengthh = png_strlen(sheight)) <= 0 ||
       sheight[0] == 45 /*'-'*/ || !png_check_fp_string(sheight, lengthh))
      png_error(png_ptr, "Invalid sCAL height");

347
   info_ptr->scal_unit = (png_byte)unit;
348

G
[devel]  
Glenn Randers-Pehrson 已提交
349
   ++lengthw;
350

G
[devel]  
Glenn Randers-Pehrson 已提交
351
   png_debug1(3, "allocating unit for info (%u bytes)", lengthw);
352

G
[devel]  
Glenn Randers-Pehrson 已提交
353
   info_ptr->scal_s_width = (png_charp)png_malloc_warn(png_ptr, lengthw);
354

355 356
   if (info_ptr->scal_s_width == NULL)
   {
G
[devel]  
Glenn Randers-Pehrson 已提交
357
      png_warning(png_ptr, "Memory allocation failed while processing sCAL");
358
      return;
359
   }
360

G
[devel]  
Glenn Randers-Pehrson 已提交
361
   png_memcpy(info_ptr->scal_s_width, swidth, lengthw);
362

G
[devel]  
Glenn Randers-Pehrson 已提交
363
   ++lengthh;
364

G
[devel]  
Glenn Randers-Pehrson 已提交
365
   png_debug1(3, "allocating unit for info (%u bytes)", lengthh);
366

G
[devel]  
Glenn Randers-Pehrson 已提交
367
   info_ptr->scal_s_height = (png_charp)png_malloc_warn(png_ptr, lengthh);
368

369 370 371
   if (info_ptr->scal_s_height == NULL)
   {
      png_free (png_ptr, info_ptr->scal_s_width);
372
      info_ptr->scal_s_width = NULL;
373

G
[devel]  
Glenn Randers-Pehrson 已提交
374
      png_warning(png_ptr, "Memory allocation failed while processing sCAL");
375
      return;
376
   }
377

G
[devel]  
Glenn Randers-Pehrson 已提交
378 379
   png_memcpy(info_ptr->scal_s_height, sheight, lengthh);

380
   info_ptr->valid |= PNG_INFO_sCAL;
381
   info_ptr->free_me |= PNG_FREE_SCAL;
382
}
G
[devel]  
Glenn Randers-Pehrson 已提交
383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409

#ifdef PNG_FLOATING_POINT_SUPPORTED
void PNGAPI
png_set_sCAL(png_structp png_ptr, png_infop info_ptr, int unit, double width,
   double height)
{
   png_debug1(1, "in %s storage function", "sCAL");

   /* Check the arguments. */
   if (width <= 0)
      png_warning(png_ptr, "Invalid sCAL width ignored");
   else if (height <= 0)
      png_warning(png_ptr, "Invalid sCAL height ignored");
   else
   {
      /* Convert 'width' and 'height' to ASCII. */
      char swidth[PNG_sCAL_MAX_DIGITS+1];
      char sheight[PNG_sCAL_MAX_DIGITS+1];

      png_ascii_from_fp(png_ptr, swidth, sizeof swidth, width,
         PNG_sCAL_PRECISION);
      png_ascii_from_fp(png_ptr, sheight, sizeof sheight, height,
         PNG_sCAL_PRECISION);

      png_set_sCAL_s(png_ptr, info_ptr, unit, swidth, sheight);
   }
}
410
#endif
411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436

#ifdef PNG_FIXED_POINT_SUPPORTED
void PNGAPI
png_set_sCAL_fixed(png_structp png_ptr, png_infop info_ptr, int unit,
   png_fixed_point width, png_fixed_point height)
{
   png_debug1(1, "in %s storage function", "sCAL");

   /* Check the arguments. */
   if (width <= 0)
      png_warning(png_ptr, "Invalid sCAL width ignored");
   else if (height <= 0)
      png_warning(png_ptr, "Invalid sCAL height ignored");
   else
   {
      /* Convert 'width' and 'height' to ASCII. */
      char swidth[PNG_sCAL_MAX_DIGITS+1];
      char sheight[PNG_sCAL_MAX_DIGITS+1];

      png_ascii_from_fixed(png_ptr, swidth, sizeof swidth, width);
      png_ascii_from_fixed(png_ptr, sheight, sizeof sheight, height);

      png_set_sCAL_s(png_ptr, info_ptr, unit, swidth, sheight);
   }
}
#endif
437
#endif
438

439
#ifdef PNG_pHYs_SUPPORTED
440
void PNGAPI
A
Andreas Dilger 已提交
441
png_set_pHYs(png_structp png_ptr, png_infop info_ptr,
442
    png_uint_32 res_x, png_uint_32 res_y, int unit_type)
A
Andreas Dilger 已提交
443
{
444
   png_debug1(1, "in %s storage function", "pHYs");
445

446
   if (png_ptr == NULL || info_ptr == NULL)
A
Andreas Dilger 已提交
447 448 449 450 451 452 453 454 455
      return;

   info_ptr->x_pixels_per_unit = res_x;
   info_ptr->y_pixels_per_unit = res_y;
   info_ptr->phys_unit_type = (png_byte)unit_type;
   info_ptr->valid |= PNG_INFO_pHYs;
}
#endif

456
void PNGAPI
A
Andreas Dilger 已提交
457
png_set_PLTE(png_structp png_ptr, png_infop info_ptr,
458
    png_const_colorp palette, int num_palette)
A
Andreas Dilger 已提交
459
{
460

461
   png_debug1(1, "in %s storage function", "PLTE");
462

463
   if (png_ptr == NULL || info_ptr == NULL)
A
Andreas Dilger 已提交
464 465
      return;

466
   if (num_palette < 0 || num_palette > PNG_MAX_PALETTE_LENGTH)
467 468
   {
      if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
469
         png_error(png_ptr, "Invalid palette length");
470

471 472
      else
      {
473 474
         png_warning(png_ptr, "Invalid palette length");
         return;
475 476
      }
   }
477

478
   /* It may not actually be necessary to set png_ptr->palette here;
479 480 481 482
    * we do it for backward compatibility with the way the png_handle_tRNS
    * function used to do the allocation.
    */
   png_free_data(png_ptr, info_ptr, PNG_FREE_PLTE, 0);
483

484
   /* Changed in libpng-1.2.1 to allocate PNG_MAX_PALETTE_LENGTH instead
485 486 487
    * of num_palette entries, in case of an invalid PNG file that has
    * too-large sample values.
    */
488
   png_ptr->palette = (png_colorp)png_calloc(png_ptr,
489
       PNG_MAX_PALETTE_LENGTH * png_sizeof(png_color));
490

491
   png_memcpy(png_ptr->palette, palette, num_palette * png_sizeof(png_color));
492 493 494 495
   info_ptr->palette = png_ptr->palette;
   info_ptr->num_palette = png_ptr->num_palette = (png_uint_16)num_palette;

   info_ptr->free_me |= PNG_FREE_PLTE;
496

497
   info_ptr->valid |= PNG_INFO_PLTE;
A
Andreas Dilger 已提交
498 499
}

500
#ifdef PNG_sBIT_SUPPORTED
501
void PNGAPI
A
Andreas Dilger 已提交
502
png_set_sBIT(png_structp png_ptr, png_infop info_ptr,
503
    png_const_color_8p sig_bit)
A
Andreas Dilger 已提交
504
{
505
   png_debug1(1, "in %s storage function", "sBIT");
506

507
   if (png_ptr == NULL || info_ptr == NULL)
A
Andreas Dilger 已提交
508 509
      return;

510
   png_memcpy(&(info_ptr->sig_bit), sig_bit, png_sizeof(png_color_8));
A
Andreas Dilger 已提交
511 512 513 514
   info_ptr->valid |= PNG_INFO_sBIT;
}
#endif

515
#ifdef PNG_sRGB_SUPPORTED
516
void PNGAPI
517
png_set_sRGB(png_structp png_ptr, png_infop info_ptr, int intent)
518
{
519
   png_debug1(1, "in %s storage function", "sRGB");
520

521
   if (png_ptr == NULL || info_ptr == NULL)
522 523
      return;

524
   info_ptr->srgb_intent = (png_byte)intent;
525 526
   info_ptr->valid |= PNG_INFO_sRGB;
}
527

528
void PNGAPI
529
png_set_sRGB_gAMA_and_cHRM(png_structp png_ptr, png_infop info_ptr,
530
    int intent)
531
{
532
   png_debug1(1, "in %s storage function", "sRGB_gAMA_and_cHRM");
533

534
   if (png_ptr == NULL || info_ptr == NULL)
535 536 537 538
      return;

   png_set_sRGB(png_ptr, info_ptr, intent);

539
#ifdef PNG_gAMA_SUPPORTED
540
   png_set_gAMA_fixed(png_ptr, info_ptr, 45455L);
541
#endif
542

543
#ifdef PNG_cHRM_SUPPORTED
544
   png_set_cHRM_fixed(png_ptr, info_ptr,
545 546 547 548 549 550
      /* color      x       y */
      /* white */ 31270L, 32900L,
      /* red   */ 64000L, 33000L,
      /* green */ 30000L, 60000L,
      /* blue  */ 15000L,  6000L
   );
551
#endif /* cHRM */
552
}
553
#endif /* sRGB */
554

555

556
#ifdef PNG_iCCP_SUPPORTED
557
void PNGAPI
558
png_set_iCCP(png_structp png_ptr, png_infop info_ptr,
559 560
    png_const_charp name, int compression_type,
    png_const_bytep profile, png_uint_32 proflen)
561
{
562
   png_charp new_iccp_name;
G
[devel]  
Glenn Randers-Pehrson 已提交
563
   png_bytep new_iccp_profile;
564
   png_uint_32 length;
565

566
   png_debug1(1, "in %s storage function", "iCCP");
567

568 569 570
   if (png_ptr == NULL || info_ptr == NULL || name == NULL || profile == NULL)
      return;

571 572
   length = png_strlen(name)+1;
   new_iccp_name = (png_charp)png_malloc_warn(png_ptr, length);
573 574
   if (new_iccp_name == NULL)
   {
575
        png_warning(png_ptr, "Insufficient memory to process iCCP chunk");
576 577
      return;
   }
578
   png_memcpy(new_iccp_name, name, length);
G
[devel]  
Glenn Randers-Pehrson 已提交
579
   new_iccp_profile = (png_bytep)png_malloc_warn(png_ptr, proflen);
580

581 582 583
   if (new_iccp_profile == NULL)
   {
      png_free (png_ptr, new_iccp_name);
584
      png_warning(png_ptr,
585
          "Insufficient memory to process iCCP profile");
586 587
      return;
   }
588

589 590
   png_memcpy(new_iccp_profile, profile, (png_size_t)proflen);

591
   png_free_data(png_ptr, info_ptr, PNG_FREE_ICCP, 0);
592

593
   info_ptr->iccp_proflen = proflen;
594 595
   info_ptr->iccp_name = new_iccp_name;
   info_ptr->iccp_profile = new_iccp_profile;
596
   /* Compression is always zero but is here so the API and info structure
597 598
    * does not have to change if we introduce multiple compression types
    */
599
   info_ptr->iccp_compression = (png_byte)compression_type;
600
   info_ptr->free_me |= PNG_FREE_ICCP;
601 602 603 604
   info_ptr->valid |= PNG_INFO_iCCP;
}
#endif

605
#ifdef PNG_TEXT_SUPPORTED
606
void PNGAPI
607
png_set_text(png_structp png_ptr, png_infop info_ptr, png_const_textp text_ptr,
608
    int num_text)
609 610
{
   int ret;
611
   ret = png_set_text_2(png_ptr, info_ptr, text_ptr, num_text);
612

613
   if (ret)
614
      png_error(png_ptr, "Insufficient memory to store text");
615 616 617
}

int /* PRIVATE */
618 619
png_set_text_2(png_structp png_ptr, png_infop info_ptr,
    png_const_textp text_ptr, int num_text)
A
Andreas Dilger 已提交
620 621 622
{
   int i;

623 624
   png_debug1(1, "in %s storage function", ((png_ptr == NULL ||
      png_ptr->chunk_name[0] == '\0') ?
625
      "text" : (png_const_charp)png_ptr->chunk_name));
A
Andreas Dilger 已提交
626

627
   if (png_ptr == NULL || info_ptr == NULL || num_text == 0)
628
      return(0);
A
Andreas Dilger 已提交
629 630 631 632 633 634 635 636 637 638 639 640 641 642

   /* Make sure we have enough space in the "text" array in info_struct
    * to hold all of the incoming text_ptr objects.
    */
   if (info_ptr->num_text + num_text > info_ptr->max_text)
   {
      if (info_ptr->text != NULL)
      {
         png_textp old_text;
         int old_max;

         old_max = info_ptr->max_text;
         info_ptr->max_text = info_ptr->num_text + num_text + 8;
         old_text = info_ptr->text;
643
         info_ptr->text = (png_textp)png_malloc_warn(png_ptr,
644
            (png_size_t)(info_ptr->max_text * png_sizeof(png_text)));
645

646
         if (info_ptr->text == NULL)
647 648 649 650
         {
            png_free(png_ptr, old_text);
            return(1);
         }
651

652
         png_memcpy(info_ptr->text, old_text, (png_size_t)(old_max *
653
             png_sizeof(png_text)));
A
Andreas Dilger 已提交
654 655
         png_free(png_ptr, old_text);
      }
656

A
Andreas Dilger 已提交
657 658 659 660
      else
      {
         info_ptr->max_text = num_text + 8;
         info_ptr->num_text = 0;
661
         info_ptr->text = (png_textp)png_malloc_warn(png_ptr,
662
             (png_size_t)(info_ptr->max_text * png_sizeof(png_text)));
663
         if (info_ptr->text == NULL)
664
            return(1);
665
         info_ptr->free_me |= PNG_FREE_TEXT;
A
Andreas Dilger 已提交
666
      }
667

668
      png_debug1(3, "allocated %d entries for info_ptr->text",
669
          info_ptr->max_text);
A
Andreas Dilger 已提交
670 671 672
   }
   for (i = 0; i < num_text; i++)
   {
673 674
      png_size_t text_length, key_len;
      png_size_t lang_len, lang_key_len;
A
Andreas Dilger 已提交
675 676
      png_textp textp = &(info_ptr->text[info_ptr->num_text]);

677
      if (text_ptr[i].key == NULL)
678 679
          continue;

680 681
      key_len = png_strlen(text_ptr[i].key);

682
      if (text_ptr[i].compression <= 0)
683
      {
684 685
         lang_len = 0;
         lang_key_len = 0;
686
      }
687

688
      else
689
#ifdef PNG_iTXt_SUPPORTED
690
      {
691
         /* Set iTXt data */
692

693 694
         if (text_ptr[i].lang != NULL)
            lang_len = png_strlen(text_ptr[i].lang);
695

696 697
         else
            lang_len = 0;
698

699 700
         if (text_ptr[i].lang_key != NULL)
            lang_key_len = png_strlen(text_ptr[i].lang_key);
701

702 703
         else
            lang_key_len = 0;
704
      }
705
#else /* PNG_iTXt_SUPPORTED */
706
      {
707 708
         png_warning(png_ptr, "iTXt chunk not supported");
         continue;
709 710
      }
#endif
A
Andreas Dilger 已提交
711

712
      if (text_ptr[i].text == NULL || text_ptr[i].text[0] == '\0')
A
Andreas Dilger 已提交
713
      {
714
         text_length = 0;
715
#ifdef PNG_iTXt_SUPPORTED
716
         if (text_ptr[i].compression > 0)
717
            textp->compression = PNG_ITXT_COMPRESSION_NONE;
718

719
         else
720
#endif
721
            textp->compression = PNG_TEXT_COMPRESSION_NONE;
A
Andreas Dilger 已提交
722
      }
723

A
Andreas Dilger 已提交
724 725
      else
      {
726
         text_length = png_strlen(text_ptr[i].text);
A
Andreas Dilger 已提交
727 728
         textp->compression = text_ptr[i].compression;
      }
729

730
      textp->key = (png_charp)png_malloc_warn(png_ptr,
731 732
          (png_size_t)
          (key_len + text_length + lang_len + lang_key_len + 4));
733

734
      if (textp->key == NULL)
735
         return(1);
736

737
      png_debug2(2, "Allocated %lu bytes at %x in png_set_text",
738 739 740
          (unsigned long)(png_uint_32)
          (key_len + lang_len + lang_key_len + text_length + 4),
          (int)textp->key);
741

742
      png_memcpy(textp->key, text_ptr[i].key,(png_size_t)(key_len));
743
      *(textp->key + key_len) = '\0';
744

745 746
      if (text_ptr[i].compression > 0)
      {
747
         textp->lang = textp->key + key_len + 1;
748
         png_memcpy(textp->lang, text_ptr[i].lang, lang_len);
749
         *(textp->lang + lang_len) = '\0';
750
         textp->lang_key = textp->lang + lang_len + 1;
751
         png_memcpy(textp->lang_key, text_ptr[i].lang_key, lang_key_len);
752
         *(textp->lang_key + lang_key_len) = '\0';
753
         textp->text = textp->lang_key + lang_key_len + 1;
754
      }
755

756 757
      else
      {
758 759
         textp->lang=NULL;
         textp->lang_key=NULL;
760
         textp->text = textp->key + key_len + 1;
761
      }
762

763
      if (text_length)
764
         png_memcpy(textp->text, text_ptr[i].text,
765
             (png_size_t)(text_length));
766

767
      *(textp->text + text_length) = '\0';
768

769
#ifdef PNG_iTXt_SUPPORTED
770
      if (textp->compression > 0)
771 772 773 774
      {
         textp->text_length = 0;
         textp->itxt_length = text_length;
      }
775

776
      else
777
#endif
778 779 780 781
      {
         textp->text_length = text_length;
         textp->itxt_length = 0;
      }
782

A
Andreas Dilger 已提交
783
      info_ptr->num_text++;
784
      png_debug1(3, "transferred text chunk %d", info_ptr->num_text);
A
Andreas Dilger 已提交
785
   }
786
   return(0);
A
Andreas Dilger 已提交
787 788 789
}
#endif

790
#ifdef PNG_tIME_SUPPORTED
791
void PNGAPI
792
png_set_tIME(png_structp png_ptr, png_infop info_ptr, png_const_timep mod_time)
A
Andreas Dilger 已提交
793
{
794
   png_debug1(1, "in %s storage function", "tIME");
795

796
   if (png_ptr == NULL || info_ptr == NULL ||
797
       (png_ptr->mode & PNG_WROTE_tIME))
A
Andreas Dilger 已提交
798 799
      return;

800
   png_memcpy(&(info_ptr->mod_time), mod_time, png_sizeof(png_time));
A
Andreas Dilger 已提交
801 802 803 804
   info_ptr->valid |= PNG_INFO_tIME;
}
#endif

805
#ifdef PNG_tRNS_SUPPORTED
806
void PNGAPI
A
Andreas Dilger 已提交
807
png_set_tRNS(png_structp png_ptr, png_infop info_ptr,
808
    png_const_bytep trans_alpha, int num_trans, png_const_color_16p trans_color)
A
Andreas Dilger 已提交
809
{
810
   png_debug1(1, "in %s storage function", "tRNS");
811

812
   if (png_ptr == NULL || info_ptr == NULL)
A
Andreas Dilger 已提交
813 814
      return;

815
   if (trans_alpha != NULL)
816
   {
817
       /* It may not actually be necessary to set png_ptr->trans_alpha here;
818 819 820
        * we do it for backward compatibility with the way the png_handle_tRNS
        * function used to do the allocation.
        */
821

822
       png_free_data(png_ptr, info_ptr, PNG_FREE_TRNS, 0);
823

824
       /* Changed from num_trans to PNG_MAX_PALETTE_LENGTH in version 1.2.1 */
G
[devel]  
Glenn Randers-Pehrson 已提交
825 826
       png_ptr->trans_alpha = info_ptr->trans_alpha =
          (png_bytep)png_malloc(png_ptr, (png_size_t)PNG_MAX_PALETTE_LENGTH);
827

828
       if (num_trans > 0 && num_trans <= PNG_MAX_PALETTE_LENGTH)
829
          png_memcpy(info_ptr->trans_alpha, trans_alpha, (png_size_t)num_trans);
830
   }
A
Andreas Dilger 已提交
831

832
   if (trans_color != NULL)
A
Andreas Dilger 已提交
833
   {
834
      int sample_max = (1 << info_ptr->bit_depth);
835

836
      if ((info_ptr->color_type == PNG_COLOR_TYPE_GRAY &&
837
          (int)trans_color->gray > sample_max) ||
838
          (info_ptr->color_type == PNG_COLOR_TYPE_RGB &&
839 840 841
          ((int)trans_color->red > sample_max ||
          (int)trans_color->green > sample_max ||
          (int)trans_color->blue > sample_max)))
842 843
         png_warning(png_ptr,
            "tRNS chunk has out-of-range samples for bit_depth");
844

G
[devel]  
Glenn Randers-Pehrson 已提交
845 846
      png_memcpy(&(info_ptr->trans_color), trans_color,
         png_sizeof(png_color_16));
847

848
      if (num_trans == 0)
849
         num_trans = 1;
A
Andreas Dilger 已提交
850
   }
851

A
Andreas Dilger 已提交
852
   info_ptr->num_trans = (png_uint_16)num_trans;
853

854 855 856 857 858
   if (num_trans != 0)
   {
      info_ptr->valid |= PNG_INFO_tRNS;
      info_ptr->free_me |= PNG_FREE_TRNS;
   }
A
Andreas Dilger 已提交
859 860 861
}
#endif

862
#ifdef PNG_sPLT_SUPPORTED
863
void PNGAPI
864
png_set_sPLT(png_structp png_ptr,
865
    png_infop info_ptr, png_const_sPLT_tp entries, int nentries)
866 867 868 869 870 871 872
/*
 *  entries        - array of png_sPLT_t structures
 *                   to be added to the list of palettes
 *                   in the info structure.
 *  nentries       - number of palette structures to be
 *                   added.
 */
873
{
874 875
   png_sPLT_tp np;
   int i;
876

877 878
   if (png_ptr == NULL || info_ptr == NULL)
      return;
879

880 881
   np = (png_sPLT_tp)png_malloc_warn(png_ptr,
       (info_ptr->splt_palettes_num + nentries) *
882
        (png_size_t)png_sizeof(png_sPLT_t));
883

884 885
   if (np == NULL)
   {
886
      png_warning(png_ptr, "No memory for sPLT palettes");
887
      return;
888
   }
889

890
   png_memcpy(np, info_ptr->splt_palettes,
891
       info_ptr->splt_palettes_num * png_sizeof(png_sPLT_t));
892

893 894
   png_free(png_ptr, info_ptr->splt_palettes);
   info_ptr->splt_palettes=NULL;
895

896 897 898
   for (i = 0; i < nentries; i++)
   {
      png_sPLT_tp to = np + info_ptr->splt_palettes_num + i;
899
      png_const_sPLT_tp from = entries + i;
900
      png_uint_32 length;
901

902
      length = png_strlen(from->name) + 1;
903
      to->name = (png_charp)png_malloc_warn(png_ptr, (png_size_t)length);
904

905 906 907
      if (to->name == NULL)
      {
         png_warning(png_ptr,
908
             "Out of memory while processing sPLT chunk");
909 910
         continue;
      }
911

912 913
      png_memcpy(to->name, from->name, length);
      to->entries = (png_sPLT_entryp)png_malloc_warn(png_ptr,
914
          (png_size_t)(from->nentries * png_sizeof(png_sPLT_entry)));
915

916 917 918
      if (to->entries == NULL)
      {
         png_warning(png_ptr,
919
             "Out of memory while processing sPLT chunk");
920 921 922 923
         png_free(png_ptr, to->name);
         to->name = NULL;
         continue;
      }
924

925 926
      png_memcpy(to->entries, from->entries,
          from->nentries * png_sizeof(png_sPLT_entry));
927

928 929 930 931 932 933 934 935
      to->nentries = from->nentries;
      to->depth = from->depth;
   }

   info_ptr->splt_palettes = np;
   info_ptr->splt_palettes_num += nentries;
   info_ptr->valid |= PNG_INFO_sPLT;
   info_ptr->free_me |= PNG_FREE_SPLT;
936 937 938
}
#endif /* PNG_sPLT_SUPPORTED */

939
#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED
940
void PNGAPI
941
png_set_unknown_chunks(png_structp png_ptr,
942
   png_infop info_ptr, png_const_unknown_chunkp unknowns, int num_unknowns)
943
{
944 945 946 947
   png_unknown_chunkp np;
   int i;

   if (png_ptr == NULL || info_ptr == NULL || num_unknowns == 0)
948
      return;
949 950

   np = (png_unknown_chunkp)png_malloc_warn(png_ptr,
951 952
       (png_size_t)(info_ptr->unknown_chunks_num + num_unknowns) *
       png_sizeof(png_unknown_chunk));
953

954 955 956
   if (np == NULL)
   {
      png_warning(png_ptr,
957
          "Out of memory while processing unknown chunk");
958 959 960 961
      return;
   }

   png_memcpy(np, info_ptr->unknown_chunks,
962 963
       (png_size_t)info_ptr->unknown_chunks_num *
       png_sizeof(png_unknown_chunk));
964

965
   png_free(png_ptr, info_ptr->unknown_chunks);
966
   info_ptr->unknown_chunks = NULL;
967 968 969 970

   for (i = 0; i < num_unknowns; i++)
   {
      png_unknown_chunkp to = np + info_ptr->unknown_chunks_num + i;
971
      png_const_unknown_chunkp from = unknowns + i;
972

973
      png_memcpy(to->name, from->name, png_sizeof(from->name));
974 975
      to->name[png_sizeof(to->name)-1] = '\0';
      to->size = from->size;
976
      /* Note our location in the read or write sequence */
977 978 979 980
      to->location = (png_byte)(png_ptr->mode & 0xff);

      if (from->size == 0)
         to->data=NULL;
981

982 983 984
      else
      {
         to->data = (png_bytep)png_malloc_warn(png_ptr,
985
             (png_size_t)from->size);
986

987 988 989
         if (to->data == NULL)
         {
            png_warning(png_ptr,
990
                "Out of memory while processing unknown chunk");
991 992
            to->size = 0;
         }
993

994 995 996 997 998 999 1000 1001
         else
            png_memcpy(to->data, from->data, from->size);
      }
   }

   info_ptr->unknown_chunks = np;
   info_ptr->unknown_chunks_num += num_unknowns;
   info_ptr->free_me |= PNG_FREE_UNKN;
1002
}
1003

1004
void PNGAPI
1005
png_set_unknown_chunk_location(png_structp png_ptr, png_infop info_ptr,
1006
    int chunk, int location)
1007
{
1008
   if (png_ptr != NULL && info_ptr != NULL && chunk >= 0 && chunk <
1009
       info_ptr->unknown_chunks_num)
1010 1011
      info_ptr->unknown_chunks[chunk].location = (png_byte)location;
}
1012 1013
#endif

1014

1015
#ifdef PNG_MNG_FEATURES_SUPPORTED
1016 1017 1018
png_uint_32 PNGAPI
png_permit_mng_features (png_structp png_ptr, png_uint_32 mng_features)
{
1019
   png_debug(1, "in png_permit_mng_features");
1020

1021 1022
   if (png_ptr == NULL)
      return (png_uint_32)0;
1023

1024
   png_ptr->mng_features_permitted =
1025
       (png_byte)(mng_features & PNG_ALL_MNG_FEATURES);
1026

1027
   return (png_uint_32)png_ptr->mng_features_permitted;
1028 1029
}
#endif
1030

1031
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
1032
void PNGAPI
1033
png_set_keep_unknown_chunks(png_structp png_ptr, int keep, png_const_bytep
1034
    chunk_list, int num_chunks)
1035
{
1036 1037 1038 1039
   png_bytep new_list, p;
   int i, old_num_chunks;
   if (png_ptr == NULL)
      return;
1040

1041 1042
   if (num_chunks == 0)
   {
1043
      if (keep == PNG_HANDLE_CHUNK_ALWAYS || keep == PNG_HANDLE_CHUNK_IF_SAFE)
1044
         png_ptr->flags |= PNG_FLAG_KEEP_UNKNOWN_CHUNKS;
1045

1046
      else
1047
         png_ptr->flags &= ~PNG_FLAG_KEEP_UNKNOWN_CHUNKS;
1048

1049
      if (keep == PNG_HANDLE_CHUNK_ALWAYS)
1050
         png_ptr->flags |= PNG_FLAG_KEEP_UNSAFE_CHUNKS;
1051

1052
      else
1053
         png_ptr->flags &= ~PNG_FLAG_KEEP_UNSAFE_CHUNKS;
1054

1055
      return;
1056 1057
   }
   if (chunk_list == NULL)
1058
      return;
1059 1060
   old_num_chunks = png_ptr->num_chunk_list;
   new_list=(png_bytep)png_malloc(png_ptr,
1061
       (png_size_t)
1062
       (5*(num_chunks + old_num_chunks)));
1063

1064 1065 1066
   if (png_ptr->chunk_list != NULL)
   {
      png_memcpy(new_list, png_ptr->chunk_list,
1067
          (png_size_t)(5*old_num_chunks));
1068 1069 1070
      png_free(png_ptr, png_ptr->chunk_list);
      png_ptr->chunk_list=NULL;
   }
1071

1072
   png_memcpy(new_list + 5*old_num_chunks, chunk_list,
1073
       (png_size_t)(5*num_chunks));
1074

1075 1076
   for (p = new_list + 5*old_num_chunks + 4, i = 0; i<num_chunks; i++, p += 5)
      *p=(png_byte)keep;
1077

1078 1079 1080
   png_ptr->num_chunk_list = old_num_chunks + num_chunks;
   png_ptr->chunk_list = new_list;
   png_ptr->free_me |= PNG_FREE_LIST;
1081 1082
}
#endif
1083

1084
#ifdef PNG_READ_USER_CHUNKS_SUPPORTED
1085
void PNGAPI
1086
png_set_read_user_chunk_fn(png_structp png_ptr, png_voidp user_chunk_ptr,
1087
    png_user_chunk_ptr read_user_chunk_fn)
1088
{
1089
   png_debug(1, "in png_set_read_user_chunk_fn");
1090

1091 1092
   if (png_ptr == NULL)
      return;
1093

1094 1095 1096 1097
   png_ptr->read_user_chunk_fn = read_user_chunk_fn;
   png_ptr->user_chunk_ptr = user_chunk_ptr;
}
#endif
1098

1099
#ifdef PNG_INFO_IMAGE_SUPPORTED
1100
void PNGAPI
1101 1102
png_set_rows(png_structp png_ptr, png_infop info_ptr, png_bytepp row_pointers)
{
1103
   png_debug1(1, "in %s storage function", "rows");
1104

1105 1106 1107
   if (png_ptr == NULL || info_ptr == NULL)
      return;

1108
   if (info_ptr->row_pointers && (info_ptr->row_pointers != row_pointers))
1109
      png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0);
1110

1111
   info_ptr->row_pointers = row_pointers;
1112

1113
   if (row_pointers)
1114
      info_ptr->valid |= PNG_INFO_IDAT;
1115 1116 1117
}
#endif

1118
void PNGAPI
1119 1120
png_set_compression_buffer_size(png_structp png_ptr,
    png_size_t size)
1121
{
1122 1123
    if (png_ptr == NULL)
       return;
1124

1125
    png_free(png_ptr, png_ptr->zbuf);
1126
    png_ptr->zbuf_size = size;
1127 1128 1129 1130
    png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, size);
    png_ptr->zstream.next_out = png_ptr->zbuf;
    png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
}
1131 1132 1133 1134 1135

void PNGAPI
png_set_invalid(png_structp png_ptr, png_infop info_ptr, int mask)
{
   if (png_ptr && info_ptr)
1136
      info_ptr->valid &= ~mask;
1137
}
1138

1139

1140 1141

#ifdef PNG_SET_USER_LIMITS_SUPPORTED
1142
/* This function was added to libpng 1.2.6 */
1143 1144 1145 1146
void PNGAPI
png_set_user_limits (png_structp png_ptr, png_uint_32 user_width_max,
    png_uint_32 user_height_max)
{
1147 1148 1149 1150 1151 1152
   /* Images with dimensions larger than these limits will be
    * rejected by png_set_IHDR().  To accept any PNG datastream
    * regardless of dimensions, set both limits to 0x7ffffffL.
    */
   if (png_ptr == NULL)
      return;
1153

1154 1155
   png_ptr->user_width_max = user_width_max;
   png_ptr->user_height_max = user_height_max;
1156
}
1157

1158
/* This function was added to libpng 1.4.0 */
1159 1160 1161 1162
void PNGAPI
png_set_chunk_cache_max (png_structp png_ptr,
   png_uint_32 user_chunk_cache_max)
{
1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174
    if (png_ptr)
       png_ptr->user_chunk_cache_max = user_chunk_cache_max;
}

/* This function was added to libpng 1.4.1 */
void PNGAPI
png_set_chunk_malloc_max (png_structp png_ptr,
   png_alloc_size_t user_chunk_malloc_max)
{
    if (png_ptr)
       png_ptr->user_chunk_malloc_max =
          (png_size_t)user_chunk_malloc_max;
1175
}
1176 1177
#endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */

1178

1179
#ifdef PNG_BENIGN_ERRORS_SUPPORTED
1180 1181 1182
void PNGAPI
png_set_benign_errors(png_structp png_ptr, int allowed)
{
1183
   png_debug(1, "in png_set_benign_errors");
1184

1185
   if (allowed)
1186
      png_ptr->flags |= PNG_FLAG_BENIGN_ERRORS_WARN;
1187

1188
   else
1189
      png_ptr->flags &= ~PNG_FLAG_BENIGN_ERRORS_WARN;
1190 1191
}
#endif /* PNG_BENIGN_ERRORS_SUPPORTED */
1192
#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */