Visualization Library 2.0.0-b5

A lightweight C++ OpenGL middleware for 2D/3D graphics

VL     Star     Watch     Fork     Issue

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