pngset.c 33.2 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 [October 14, 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
      if (text_ptr[i].compression < PNG_TEXT_COMPRESSION_NONE ||
          text_ptr[i].compression >= PNG_TEXT_COMPRESSION_LAST)
682 683 684 685 686
      {
         png_warning(png_ptr, "text compression mode is out of range");
         continue;
      }

687 688
      key_len = png_strlen(text_ptr[i].key);

689
      if (text_ptr[i].compression <= 0)
690
      {
691 692
         lang_len = 0;
         lang_key_len = 0;
693
      }
694

695
      else
696
#ifdef PNG_iTXt_SUPPORTED
697
      {
698
         /* Set iTXt data */
699

700 701
         if (text_ptr[i].lang != NULL)
            lang_len = png_strlen(text_ptr[i].lang);
702

703 704
         else
            lang_len = 0;
705

706 707
         if (text_ptr[i].lang_key != NULL)
            lang_key_len = png_strlen(text_ptr[i].lang_key);
708

709 710
         else
            lang_key_len = 0;
711
      }
712
#else /* PNG_iTXt_SUPPORTED */
713
      {
714 715
         png_warning(png_ptr, "iTXt chunk not supported");
         continue;
716 717
      }
#endif
A
Andreas Dilger 已提交
718

719
      if (text_ptr[i].text == NULL || text_ptr[i].text[0] == '\0')
A
Andreas Dilger 已提交
720
      {
721
         text_length = 0;
722
#ifdef PNG_iTXt_SUPPORTED
723
         if (text_ptr[i].compression > 0)
724
            textp->compression = PNG_ITXT_COMPRESSION_NONE;
725

726
         else
727
#endif
728
            textp->compression = PNG_TEXT_COMPRESSION_NONE;
A
Andreas Dilger 已提交
729
      }
730

A
Andreas Dilger 已提交
731 732
      else
      {
733
         text_length = png_strlen(text_ptr[i].text);
A
Andreas Dilger 已提交
734 735
         textp->compression = text_ptr[i].compression;
      }
736

737
      textp->key = (png_charp)png_malloc_warn(png_ptr,
738 739
          (png_size_t)
          (key_len + text_length + lang_len + lang_key_len + 4));
740

741
      if (textp->key == NULL)
742
         return(1);
743

744
      png_debug2(2, "Allocated %lu bytes at %x in png_set_text",
745 746 747
          (unsigned long)(png_uint_32)
          (key_len + lang_len + lang_key_len + text_length + 4),
          (int)textp->key);
748

749
      png_memcpy(textp->key, text_ptr[i].key,(png_size_t)(key_len));
750
      *(textp->key + key_len) = '\0';
751

752 753
      if (text_ptr[i].compression > 0)
      {
754
         textp->lang = textp->key + key_len + 1;
755
         png_memcpy(textp->lang, text_ptr[i].lang, lang_len);
756
         *(textp->lang + lang_len) = '\0';
757
         textp->lang_key = textp->lang + lang_len + 1;
758
         png_memcpy(textp->lang_key, text_ptr[i].lang_key, lang_key_len);
759
         *(textp->lang_key + lang_key_len) = '\0';
760
         textp->text = textp->lang_key + lang_key_len + 1;
761
      }
762

763 764
      else
      {
765 766
         textp->lang=NULL;
         textp->lang_key=NULL;
767
         textp->text = textp->key + key_len + 1;
768
      }
769

770
      if (text_length)
771
         png_memcpy(textp->text, text_ptr[i].text,
772
             (png_size_t)(text_length));
773

774
      *(textp->text + text_length) = '\0';
775

776
#ifdef PNG_iTXt_SUPPORTED
777
      if (textp->compression > 0)
778 779 780 781
      {
         textp->text_length = 0;
         textp->itxt_length = text_length;
      }
782

783
      else
784
#endif
785 786 787 788
      {
         textp->text_length = text_length;
         textp->itxt_length = 0;
      }
789

A
Andreas Dilger 已提交
790
      info_ptr->num_text++;
791
      png_debug1(3, "transferred text chunk %d", info_ptr->num_text);
A
Andreas Dilger 已提交
792
   }
793
   return(0);
A
Andreas Dilger 已提交
794 795 796
}
#endif

797
#ifdef PNG_tIME_SUPPORTED
798
void PNGAPI
799
png_set_tIME(png_structp png_ptr, png_infop info_ptr, png_const_timep mod_time)
A
Andreas Dilger 已提交
800
{
801
   png_debug1(1, "in %s storage function", "tIME");
802

803
   if (png_ptr == NULL || info_ptr == NULL ||
804
       (png_ptr->mode & PNG_WROTE_tIME))
A
Andreas Dilger 已提交
805 806
      return;

807
   png_memcpy(&(info_ptr->mod_time), mod_time, png_sizeof(png_time));
A
Andreas Dilger 已提交
808 809 810 811
   info_ptr->valid |= PNG_INFO_tIME;
}
#endif

812
#ifdef PNG_tRNS_SUPPORTED
813
void PNGAPI
A
Andreas Dilger 已提交
814
png_set_tRNS(png_structp png_ptr, png_infop info_ptr,
815
    png_const_bytep trans_alpha, int num_trans, png_const_color_16p trans_color)
A
Andreas Dilger 已提交
816
{
817
   png_debug1(1, "in %s storage function", "tRNS");
818

819
   if (png_ptr == NULL || info_ptr == NULL)
A
Andreas Dilger 已提交
820 821
      return;

822
   if (trans_alpha != NULL)
823
   {
824
       /* It may not actually be necessary to set png_ptr->trans_alpha here;
825 826 827
        * we do it for backward compatibility with the way the png_handle_tRNS
        * function used to do the allocation.
        */
828

829
       png_free_data(png_ptr, info_ptr, PNG_FREE_TRNS, 0);
830

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

835
       if (num_trans > 0 && num_trans <= PNG_MAX_PALETTE_LENGTH)
836
          png_memcpy(info_ptr->trans_alpha, trans_alpha, (png_size_t)num_trans);
837
   }
A
Andreas Dilger 已提交
838

839
   if (trans_color != NULL)
A
Andreas Dilger 已提交
840
   {
841
      int sample_max = (1 << info_ptr->bit_depth);
842

843
      if ((info_ptr->color_type == PNG_COLOR_TYPE_GRAY &&
844
          (int)trans_color->gray > sample_max) ||
845
          (info_ptr->color_type == PNG_COLOR_TYPE_RGB &&
846 847 848
          ((int)trans_color->red > sample_max ||
          (int)trans_color->green > sample_max ||
          (int)trans_color->blue > sample_max)))
849 850
         png_warning(png_ptr,
            "tRNS chunk has out-of-range samples for bit_depth");
851

G
[devel]  
Glenn Randers-Pehrson 已提交
852 853
      png_memcpy(&(info_ptr->trans_color), trans_color,
         png_sizeof(png_color_16));
854

855
      if (num_trans == 0)
856
         num_trans = 1;
A
Andreas Dilger 已提交
857
   }
858

A
Andreas Dilger 已提交
859
   info_ptr->num_trans = (png_uint_16)num_trans;
860

861 862 863 864 865
   if (num_trans != 0)
   {
      info_ptr->valid |= PNG_INFO_tRNS;
      info_ptr->free_me |= PNG_FREE_TRNS;
   }
A
Andreas Dilger 已提交
866 867 868
}
#endif

869
#ifdef PNG_sPLT_SUPPORTED
870
void PNGAPI
871
png_set_sPLT(png_structp png_ptr,
872
    png_infop info_ptr, png_const_sPLT_tp entries, int nentries)
873 874 875 876 877 878 879
/*
 *  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.
 */
880
{
881 882
   png_sPLT_tp np;
   int i;
883

884 885
   if (png_ptr == NULL || info_ptr == NULL)
      return;
886

887 888
   np = (png_sPLT_tp)png_malloc_warn(png_ptr,
       (info_ptr->splt_palettes_num + nentries) *
889
        (png_size_t)png_sizeof(png_sPLT_t));
890

891 892
   if (np == NULL)
   {
893
      png_warning(png_ptr, "No memory for sPLT palettes");
894
      return;
895
   }
896

897
   png_memcpy(np, info_ptr->splt_palettes,
898
       info_ptr->splt_palettes_num * png_sizeof(png_sPLT_t));
899

900 901
   png_free(png_ptr, info_ptr->splt_palettes);
   info_ptr->splt_palettes=NULL;
902

903 904 905
   for (i = 0; i < nentries; i++)
   {
      png_sPLT_tp to = np + info_ptr->splt_palettes_num + i;
906
      png_const_sPLT_tp from = entries + i;
907
      png_uint_32 length;
908

909
      length = png_strlen(from->name) + 1;
910
      to->name = (png_charp)png_malloc_warn(png_ptr, (png_size_t)length);
911

912 913 914
      if (to->name == NULL)
      {
         png_warning(png_ptr,
915
             "Out of memory while processing sPLT chunk");
916 917
         continue;
      }
918

919 920
      png_memcpy(to->name, from->name, length);
      to->entries = (png_sPLT_entryp)png_malloc_warn(png_ptr,
921
          (png_size_t)(from->nentries * png_sizeof(png_sPLT_entry)));
922

923 924 925
      if (to->entries == NULL)
      {
         png_warning(png_ptr,
926
             "Out of memory while processing sPLT chunk");
927 928 929 930
         png_free(png_ptr, to->name);
         to->name = NULL;
         continue;
      }
931

932 933
      png_memcpy(to->entries, from->entries,
          from->nentries * png_sizeof(png_sPLT_entry));
934

935 936 937 938 939 940 941 942
      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;
943 944 945
}
#endif /* PNG_sPLT_SUPPORTED */

946
#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED
947
void PNGAPI
948
png_set_unknown_chunks(png_structp png_ptr,
949
   png_infop info_ptr, png_const_unknown_chunkp unknowns, int num_unknowns)
950
{
951 952 953 954
   png_unknown_chunkp np;
   int i;

   if (png_ptr == NULL || info_ptr == NULL || num_unknowns == 0)
955
      return;
956 957

   np = (png_unknown_chunkp)png_malloc_warn(png_ptr,
958 959
       (png_size_t)(info_ptr->unknown_chunks_num + num_unknowns) *
       png_sizeof(png_unknown_chunk));
960

961 962 963
   if (np == NULL)
   {
      png_warning(png_ptr,
964
          "Out of memory while processing unknown chunk");
965 966 967 968
      return;
   }

   png_memcpy(np, info_ptr->unknown_chunks,
969 970
       (png_size_t)info_ptr->unknown_chunks_num *
       png_sizeof(png_unknown_chunk));
971

972
   png_free(png_ptr, info_ptr->unknown_chunks);
973
   info_ptr->unknown_chunks = NULL;
974 975 976 977

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

980
      png_memcpy(to->name, from->name, png_sizeof(from->name));
981 982
      to->name[png_sizeof(to->name)-1] = '\0';
      to->size = from->size;
983
      /* Note our location in the read or write sequence */
984 985 986 987
      to->location = (png_byte)(png_ptr->mode & 0xff);

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

989 990 991
      else
      {
         to->data = (png_bytep)png_malloc_warn(png_ptr,
992
             (png_size_t)from->size);
993

994 995 996
         if (to->data == NULL)
         {
            png_warning(png_ptr,
997
                "Out of memory while processing unknown chunk");
998 999
            to->size = 0;
         }
1000

1001 1002 1003 1004 1005 1006 1007 1008
         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;
1009
}
1010

1011
void PNGAPI
1012
png_set_unknown_chunk_location(png_structp png_ptr, png_infop info_ptr,
1013
    int chunk, int location)
1014
{
1015
   if (png_ptr != NULL && info_ptr != NULL && chunk >= 0 && chunk <
1016
       info_ptr->unknown_chunks_num)
1017 1018
      info_ptr->unknown_chunks[chunk].location = (png_byte)location;
}
1019 1020
#endif

1021

1022
#ifdef PNG_MNG_FEATURES_SUPPORTED
1023 1024 1025
png_uint_32 PNGAPI
png_permit_mng_features (png_structp png_ptr, png_uint_32 mng_features)
{
1026
   png_debug(1, "in png_permit_mng_features");
1027

1028 1029
   if (png_ptr == NULL)
      return (png_uint_32)0;
1030

1031
   png_ptr->mng_features_permitted =
1032
       (png_byte)(mng_features & PNG_ALL_MNG_FEATURES);
1033

1034
   return (png_uint_32)png_ptr->mng_features_permitted;
1035 1036
}
#endif
1037

1038
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
1039
void PNGAPI
1040
png_set_keep_unknown_chunks(png_structp png_ptr, int keep, png_const_bytep
1041
    chunk_list, int num_chunks)
1042
{
1043 1044 1045 1046
   png_bytep new_list, p;
   int i, old_num_chunks;
   if (png_ptr == NULL)
      return;
1047

1048 1049
   if (num_chunks == 0)
   {
1050
      if (keep == PNG_HANDLE_CHUNK_ALWAYS || keep == PNG_HANDLE_CHUNK_IF_SAFE)
1051
         png_ptr->flags |= PNG_FLAG_KEEP_UNKNOWN_CHUNKS;
1052

1053
      else
1054
         png_ptr->flags &= ~PNG_FLAG_KEEP_UNKNOWN_CHUNKS;
1055

1056
      if (keep == PNG_HANDLE_CHUNK_ALWAYS)
1057
         png_ptr->flags |= PNG_FLAG_KEEP_UNSAFE_CHUNKS;
1058

1059
      else
1060
         png_ptr->flags &= ~PNG_FLAG_KEEP_UNSAFE_CHUNKS;
1061

1062
      return;
1063 1064
   }
   if (chunk_list == NULL)
1065
      return;
1066 1067
   old_num_chunks = png_ptr->num_chunk_list;
   new_list=(png_bytep)png_malloc(png_ptr,
1068
       (png_size_t)
1069
       (5*(num_chunks + old_num_chunks)));
1070

1071 1072 1073
   if (png_ptr->chunk_list != NULL)
   {
      png_memcpy(new_list, png_ptr->chunk_list,
1074
          (png_size_t)(5*old_num_chunks));
1075 1076 1077
      png_free(png_ptr, png_ptr->chunk_list);
      png_ptr->chunk_list=NULL;
   }
1078

1079
   png_memcpy(new_list + 5*old_num_chunks, chunk_list,
1080
       (png_size_t)(5*num_chunks));
1081

1082 1083
   for (p = new_list + 5*old_num_chunks + 4, i = 0; i<num_chunks; i++, p += 5)
      *p=(png_byte)keep;
1084

1085 1086 1087
   png_ptr->num_chunk_list = old_num_chunks + num_chunks;
   png_ptr->chunk_list = new_list;
   png_ptr->free_me |= PNG_FREE_LIST;
1088 1089
}
#endif
1090

1091
#ifdef PNG_READ_USER_CHUNKS_SUPPORTED
1092
void PNGAPI
1093
png_set_read_user_chunk_fn(png_structp png_ptr, png_voidp user_chunk_ptr,
1094
    png_user_chunk_ptr read_user_chunk_fn)
1095
{
1096
   png_debug(1, "in png_set_read_user_chunk_fn");
1097

1098 1099
   if (png_ptr == NULL)
      return;
1100

1101 1102 1103 1104
   png_ptr->read_user_chunk_fn = read_user_chunk_fn;
   png_ptr->user_chunk_ptr = user_chunk_ptr;
}
#endif
1105

1106
#ifdef PNG_INFO_IMAGE_SUPPORTED
1107
void PNGAPI
1108 1109
png_set_rows(png_structp png_ptr, png_infop info_ptr, png_bytepp row_pointers)
{
1110
   png_debug1(1, "in %s storage function", "rows");
1111

1112 1113 1114
   if (png_ptr == NULL || info_ptr == NULL)
      return;

1115
   if (info_ptr->row_pointers && (info_ptr->row_pointers != row_pointers))
1116
      png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0);
1117

1118
   info_ptr->row_pointers = row_pointers;
1119

1120
   if (row_pointers)
1121
      info_ptr->valid |= PNG_INFO_IDAT;
1122 1123 1124
}
#endif

1125
void PNGAPI
1126
png_set_compression_buffer_size(png_structp png_ptr, png_size_t size)
1127
{
1128 1129
    if (png_ptr == NULL)
       return;
1130

1131
    png_free(png_ptr, png_ptr->zbuf);
1132 1133 1134 1135 1136 1137 1138 1139 1140
    if (size > ZLIB_IO_MAX)
    {
        png_warning(png_ptr, "Attempt to set buffer size beyond max ignored");
        png_ptr->zbuf_size = ZLIB_IO_MAX;
        size = ZLIB_IO_MAX; /* must fit */
    }
    else
        png_ptr->zbuf_size = (uInt)size;

1141
    png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, size);
1142 1143 1144
    /* The following ensures a relatively safe failure if this gets called while
     * the buffer is actually in use.
     */
1145
    png_ptr->zstream.next_out = png_ptr->zbuf;
1146 1147
    png_ptr->zstream.avail_out = 0;
    png_ptr->zstream.avail_in = 0;
1148
}
1149 1150 1151 1152 1153

void PNGAPI
png_set_invalid(png_structp png_ptr, png_infop info_ptr, int mask)
{
   if (png_ptr && info_ptr)
1154
      info_ptr->valid &= ~mask;
1155
}
1156

1157

1158 1159

#ifdef PNG_SET_USER_LIMITS_SUPPORTED
1160
/* This function was added to libpng 1.2.6 */
1161 1162 1163 1164
void PNGAPI
png_set_user_limits (png_structp png_ptr, png_uint_32 user_width_max,
    png_uint_32 user_height_max)
{
1165 1166 1167 1168 1169 1170
   /* 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;
1171

1172 1173
   png_ptr->user_width_max = user_width_max;
   png_ptr->user_height_max = user_height_max;
1174
}
1175

1176
/* This function was added to libpng 1.4.0 */
1177 1178 1179 1180
void PNGAPI
png_set_chunk_cache_max (png_structp png_ptr,
   png_uint_32 user_chunk_cache_max)
{
1181 1182 1183 1184 1185 1186 1187 1188 1189 1190
    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)
1191
       png_ptr->user_chunk_malloc_max = user_chunk_malloc_max;
1192
}
1193 1194
#endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */

1195

1196
#ifdef PNG_BENIGN_ERRORS_SUPPORTED
1197 1198 1199
void PNGAPI
png_set_benign_errors(png_structp png_ptr, int allowed)
{
1200
   png_debug(1, "in png_set_benign_errors");
1201

1202
   if (allowed)
1203
      png_ptr->flags |= PNG_FLAG_BENIGN_ERRORS_WARN;
1204

1205
   else
1206
      png_ptr->flags &= ~PNG_FLAG_BENIGN_ERRORS_WARN;
1207 1208
}
#endif /* PNG_BENIGN_ERRORS_SUPPORTED */
1209
#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */