Subversion Repositories Kolibri OS

Rev

Rev 1897 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1897 Rev 3928
Line 1... Line 1...
1
/* png.c - location for general purpose libpng functions
1
/* png.c - location for general purpose libpng functions
2
 *
2
 *
3
 * Last changed in libpng 1.5.1 [February 3, 2011]
3
 * Last changed in libpng 1.6.2 [April 25, 2013]
4
 * Copyright (c) 1998-2011 Glenn Randers-Pehrson
4
 * Copyright (c) 1998-2013 Glenn Randers-Pehrson
5
 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
5
 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
6
 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
6
 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
7
 *
7
 *
8
 * This code is released under the libpng license.
8
 * This code is released under the libpng license.
9
 * For conditions of distribution and use, see the disclaimer
9
 * For conditions of distribution and use, see the disclaimer
Line 12... Line 12...
12
 
12
 
Line 13... Line 13...
13
#include "pngpriv.h"
13
#include "pngpriv.h"
Line 14... Line 14...
14
 
14
 
15
/* Generate a compiler error if there is an old png.h in the search path. */
15
/* Generate a compiler error if there is an old png.h in the search path. */
Line 16... Line 16...
16
typedef png_libpng_version_1_5_1 Your_png_h_is_not_version_1_5_1;
16
typedef png_libpng_version_1_6_5 Your_png_h_is_not_version_1_6_5;
17
 
17
 
18
/* Tells libpng that we have already handled the first "num_bytes" bytes
18
/* Tells libpng that we have already handled the first "num_bytes" bytes
19
 * of the PNG file signature.  If the PNG data is embedded into another
19
 * of the PNG file signature.  If the PNG data is embedded into another
20
 * stream we can set num_bytes = 8 so that libpng will not attempt to read
20
 * stream we can set num_bytes = 8 so that libpng will not attempt to read
Line 21... Line 21...
21
 * or write any of the magic bytes before it starts on the IHDR.
21
 * or write any of the magic bytes before it starts on the IHDR.
22
 */
22
 */
23
 
23
 
24
#ifdef PNG_READ_SUPPORTED
24
#ifdef PNG_READ_SUPPORTED
25
void PNGAPI
25
void PNGAPI
Line 26... Line 26...
26
png_set_sig_bytes(png_structp png_ptr, int num_bytes)
26
png_set_sig_bytes(png_structrp png_ptr, int num_bytes)
27
{
27
{
Line 41... Line 41...
41
 * already read the first few bytes of a file to determine the file type
41
 * already read the first few bytes of a file to determine the file type
42
 * can simply check the remaining bytes for extra assurance.  Returns
42
 * can simply check the remaining bytes for extra assurance.  Returns
43
 * an integer less than, equal to, or greater than zero if sig is found,
43
 * an integer less than, equal to, or greater than zero if sig is found,
44
 * respectively, to be less than, to match, or be greater than the correct
44
 * respectively, to be less than, to match, or be greater than the correct
45
 * PNG signature (this is the same behaviour as strcmp, memcmp, etc).
45
 * PNG signature (this is the same behavior as strcmp, memcmp, etc).
46
 */
46
 */
47
int PNGAPI
47
int PNGAPI
48
png_sig_cmp(png_const_bytep sig, png_size_t start, png_size_t num_to_check)
48
png_sig_cmp(png_const_bytep sig, png_size_t start, png_size_t num_to_check)
49
{
49
{
50
   png_byte png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10};
50
   png_byte png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10};
51
 
51
 
Line 60... Line 60...
60
 
60
 
Line 61... Line 61...
61
   if (start + num_to_check > 8)
61
   if (start + num_to_check > 8)
62
      num_to_check = 8 - start;
62
      num_to_check = 8 - start;
Line 63... Line 63...
63
 
63
 
64
   return ((int)(png_memcmp(&sig[start], &png_signature[start], num_to_check)));
64
   return ((int)(memcmp(&sig[start], &png_signature[start], num_to_check)));
Line 65... Line 65...
65
}
65
}
Line 66... Line 66...
66
 
66
 
67
#endif /* PNG_READ_SUPPORTED */
67
#endif /* PNG_READ_SUPPORTED */
68
 
68
 
69
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
69
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
70
/* Function to allocate memory for zlib */
70
/* Function to allocate memory for zlib */
71
PNG_FUNCTION(voidpf /* PRIVATE */,
-
 
72
png_zalloc,(voidpf png_ptr, uInt items, uInt size),PNG_ALLOCATED)
-
 
73
{
-
 
74
   png_voidp ptr;
71
PNG_FUNCTION(voidpf /* PRIVATE */,
Line 75... Line 72...
75
   png_structp p=(png_structp)png_ptr;
72
png_zalloc,(voidpf png_ptr, uInt items, uInt size),PNG_ALLOCATED)
76
   png_uint_32 save_flags=p->flags;
73
{
Line 77... Line 74...
77
   png_alloc_size_t num_bytes;
74
   png_alloc_size_t num_bytes = size;
78
 
75
 
-
 
76
   if (png_ptr == NULL)
79
   if (png_ptr == NULL)
77
      return NULL;
80
      return (NULL);
78
 
81
 
79
   if (items >= (~(png_alloc_size_t)0)/size)
82
   if (items > PNG_UINT_32_MAX/size)
-
 
83
   {
-
 
84
     png_warning (p, "Potential overflow in png_zalloc()");
-
 
85
     return (NULL);
-
 
86
   }
-
 
Line 87... Line 80...
87
   num_bytes = (png_alloc_size_t)items * size;
80
   {
-
 
81
      png_warning (png_voidcast(png_structrp, png_ptr),
88
 
82
         "Potential overflow in png_zalloc()");
Line 89... Line 83...
89
   p->flags|=PNG_FLAG_MALLOC_NULL_MEM_OK;
83
      return NULL;
90
   ptr = (png_voidp)png_malloc((png_structp)png_ptr, num_bytes);
84
   }
91
   p->flags=save_flags;
85
 
92
 
86
   num_bytes *= items;
93
   return ((voidpf)ptr);
87
   return png_malloc_warn(png_voidcast(png_structrp, png_ptr), num_bytes);
94
}
88
}
Line 95... Line 89...
95
 
89
 
96
/* Function to free memory for zlib */
90
/* Function to free memory for zlib */
97
void /* PRIVATE */
91
void /* PRIVATE */
98
png_zfree(voidpf png_ptr, voidpf ptr)
92
png_zfree(voidpf png_ptr, voidpf ptr)
99
{
93
{
100
   png_free((png_structp)png_ptr, (png_voidp)ptr);
94
   png_free(png_voidcast(png_const_structrp,png_ptr), ptr);
-
 
95
}
101
}
96
 
102
 
97
/* Reset the CRC variable to 32 bits of 1's.  Care must be taken
Line 103... Line 98...
103
/* Reset the CRC variable to 32 bits of 1's.  Care must be taken
98
 * in case CRC is > 32 bits to leave the top bits 0.
104
 * in case CRC is > 32 bits to leave the top bits 0.
99
 */
105
 */
100
void /* PRIVATE */
106
void /* PRIVATE */
101
png_reset_crc(png_structrp png_ptr)
107
png_reset_crc(png_structp png_ptr)
102
{
108
{
103
   /* The cast is safe because the crc is a 32 bit value. */
109
   png_ptr->crc = crc32(0, Z_NULL, 0);
104
   png_ptr->crc = (png_uint_32)crc32(0, Z_NULL, 0);
110
}
105
}
111
 
106
 
Line 112... Line 107...
112
/* Calculate the CRC over a section of data.  We can only pass as
107
/* Calculate the CRC over a section of data.  We can only pass as
113
 * much data to this routine as the largest single buffer size.  We
108
 * much data to this routine as the largest single buffer size.  We
114
 * also check that this data will actually be used before going to the
109
 * also check that this data will actually be used before going to the
115
 * trouble of calculating it.
110
 * trouble of calculating it.
116
 */
111
 */
117
void /* PRIVATE */
112
void /* PRIVATE */
Line 131... Line 126...
131
      if (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE)
126
      if (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE)
132
         need_crc = 0;
127
         need_crc = 0;
133
   }
128
   }
134
 
129
 
Line -... Line 130...
-
 
130
   /* 'uLong' is defined in zlib.h as unsigned long; this means that on some
-
 
131
    * systems it is a 64 bit value.  crc32, however, returns 32 bits so the
-
 
132
    * following cast is safe.  'uInt' may be no more than 16 bits, so it is
-
 
133
    * necessary to perform a loop here.
-
 
134
    */
135
   if (need_crc)
135
   if (need_crc && length > 0)
-
 
136
   {
-
 
137
      uLong crc = png_ptr->crc; /* Should never issue a warning */
-
 
138
 
-
 
139
      do
-
 
140
      {
-
 
141
         uInt safe_length = (uInt)length;
-
 
142
         if (safe_length == 0)
-
 
143
            safe_length = (uInt)-1; /* evil, but safe */
-
 
144
 
136
      png_ptr->crc = crc32(png_ptr->crc, ptr, (uInt)length);
145
         crc = crc32(crc, ptr, safe_length);
-
 
146
 
-
 
147
         /* The following should never issue compiler warnings; if they do the
-
 
148
          * target system has characteristics that will probably violate other
-
 
149
          * assumptions within the libpng code.
-
 
150
          */
-
 
151
         ptr += safe_length;
-
 
152
         length -= safe_length;
-
 
153
      }
-
 
154
      while (length > 0);
-
 
155
 
-
 
156
      /* And the following is always safe because the crc is only 32 bits. */
-
 
157
      png_ptr->crc = (png_uint_32)crc;
-
 
158
   }
137
}
159
}
Line 138... Line -...
138
 
-
 
139
/* Allocate the memory for an info_struct for the application.  We don't
160
 
140
 * really need the png_ptr, but it could potentially be useful in the
-
 
141
 * future.  This should be used in favour of malloc(png_sizeof(png_info))
-
 
142
 * and png_info_init() so that applications that want to use a shared
161
/* Check a user supplied version number, called from both read and write
143
 * libpng don't have to be recompiled if png_info changes size.
162
 * functions that create a png_struct.
144
 */
163
 */
145
PNG_FUNCTION(png_infop,PNGAPI
164
int
-
 
165
png_user_version_check(png_structrp png_ptr, png_const_charp user_png_ver)
-
 
166
{
146
png_create_info_struct,(png_structp png_ptr),PNG_ALLOCATED)
167
   if (user_png_ver)
147
{
168
   {
Line -... Line 169...
-
 
169
      int i = 0;
-
 
170
 
-
 
171
      do
-
 
172
      {
148
   png_infop info_ptr;
173
         if (user_png_ver[i] != png_libpng_ver[i])
-
 
174
            png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;
Line -... Line 175...
-
 
175
      } while (png_libpng_ver[i++]);
-
 
176
   }
-
 
177
 
-
 
178
   else
-
 
179
      png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;
-
 
180
 
-
 
181
   if (png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH)
-
 
182
   {
-
 
183
     /* Libpng 0.90 and later are binary incompatible with libpng 0.89, so
-
 
184
      * we must recompile any applications that use any older library version.
-
 
185
      * For versions after libpng 1.0, we will be compatible, so we need
-
 
186
      * only check the first and third digits (note that when we reach version
-
 
187
      * 1.10 we will need to check the fourth symbol, namely user_png_ver[3]).
-
 
188
      */
-
 
189
      if (user_png_ver == NULL || user_png_ver[0] != png_libpng_ver[0] ||
-
 
190
          (user_png_ver[0] == '1' && (user_png_ver[2] != png_libpng_ver[2] ||
-
 
191
          user_png_ver[3] != png_libpng_ver[3])) ||
-
 
192
          (user_png_ver[0] == '0' && user_png_ver[2] < '9'))
-
 
193
      {
-
 
194
#ifdef PNG_WARNINGS_SUPPORTED
-
 
195
         size_t pos = 0;
-
 
196
         char m[128];
-
 
197
 
-
 
198
         pos = png_safecat(m, (sizeof m), pos,
-
 
199
             "Application built with libpng-");
-
 
200
         pos = png_safecat(m, (sizeof m), pos, user_png_ver);
-
 
201
         pos = png_safecat(m, (sizeof m), pos, " but running with ");
-
 
202
         pos = png_safecat(m, (sizeof m), pos, png_libpng_ver);
-
 
203
 
-
 
204
         png_warning(png_ptr, m);
149
 
205
#endif
-
 
206
 
-
 
207
#ifdef PNG_ERROR_NUMBERS_SUPPORTED
150
   png_debug(1, "in png_create_info_struct");
208
         png_ptr->flags = 0;
-
 
209
#endif
-
 
210
 
-
 
211
         return 0;
-
 
212
      }
-
 
213
   }
-
 
214
 
-
 
215
   /* Success return. */
-
 
216
   return 1;
-
 
217
}
-
 
218
 
-
 
219
/* Generic function to create a png_struct for either read or write - this
-
 
220
 * contains the common initialization.
-
 
221
 */
-
 
222
PNG_FUNCTION(png_structp /* PRIVATE */,
-
 
223
png_create_png_struct,(png_const_charp user_png_ver, png_voidp error_ptr,
-
 
224
    png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr,
-
 
225
    png_malloc_ptr malloc_fn, png_free_ptr free_fn),PNG_ALLOCATED)
-
 
226
{
-
 
227
   png_struct create_struct;
-
 
228
#  ifdef PNG_SETJMP_SUPPORTED
-
 
229
      jmp_buf create_jmp_buf;
-
 
230
#  endif
-
 
231
 
-
 
232
   /* This temporary stack-allocated structure is used to provide a place to
-
 
233
    * build enough context to allow the user provided memory allocator (if any)
-
 
234
    * to be called.
-
 
235
    */
-
 
236
   memset(&create_struct, 0, (sizeof create_struct));
-
 
237
 
-
 
238
   /* Added at libpng-1.2.6 */
-
 
239
#  ifdef PNG_USER_LIMITS_SUPPORTED
-
 
240
      create_struct.user_width_max = PNG_USER_WIDTH_MAX;
-
 
241
      create_struct.user_height_max = PNG_USER_HEIGHT_MAX;
-
 
242
 
-
 
243
#     ifdef PNG_USER_CHUNK_CACHE_MAX
-
 
244
         /* Added at libpng-1.2.43 and 1.4.0 */
-
 
245
         create_struct.user_chunk_cache_max = PNG_USER_CHUNK_CACHE_MAX;
-
 
246
#     endif
-
 
247
 
-
 
248
#     ifdef PNG_USER_CHUNK_MALLOC_MAX
-
 
249
         /* Added at libpng-1.2.43 and 1.4.1, required only for read but exists
-
 
250
          * in png_struct regardless.
-
 
251
          */
Line -... Line 252...
-
 
252
         create_struct.user_chunk_malloc_max = PNG_USER_CHUNK_MALLOC_MAX;
-
 
253
#     endif
-
 
254
#  endif
151
 
255
 
152
   if (png_ptr == NULL)
256
   /* The following two API calls simply set fields in png_struct, so it is safe
-
 
257
    * to do them now even though error handling is not yet set up.
-
 
258
    */
-
 
259
#  ifdef PNG_USER_MEM_SUPPORTED
-
 
260
      png_set_mem_fn(&create_struct, mem_ptr, malloc_fn, free_fn);
-
 
261
#  endif
-
 
262
 
-
 
263
   /* (*error_fn) can return control to the caller after the error_ptr is set,
-
 
264
    * this will result in a memory leak unless the error_fn does something
-
 
265
    * extremely sophisticated.  The design lacks merit but is implicit in the
-
 
266
    * API.
-
 
267
    */
-
 
268
   png_set_error_fn(&create_struct, error_ptr, error_fn, warn_fn);
-
 
269
 
-
 
270
#  ifdef PNG_SETJMP_SUPPORTED
-
 
271
      if (!setjmp(create_jmp_buf))
-
 
272
      {
-
 
273
         /* Temporarily fake out the longjmp information until we have
153
      return (NULL);
274
          * successfully completed this function.  This only works if we have
-
 
275
          * setjmp() support compiled in, but it is safe - this stuff should
-
 
276
          * never happen.
154
 
277
          */
-
 
278
         create_struct.jmp_buf_ptr = &create_jmp_buf;
-
 
279
         create_struct.jmp_buf_size = 0; /*stack allocation*/
-
 
280
         create_struct.longjmp_fn = longjmp;
-
 
281
#  else
-
 
282
      {
-
 
283
#  endif
-
 
284
         /* Call the general version checker (shared with read and write code):
155
#ifdef PNG_USER_MEM_SUPPORTED
285
          */
-
 
286
         if (png_user_version_check(&create_struct, user_png_ver))
-
 
287
         {
-
 
288
            png_structrp png_ptr = png_voidcast(png_structrp,
-
 
289
               png_malloc_warn(&create_struct, (sizeof *png_ptr)));
-
 
290
 
-
 
291
            if (png_ptr != NULL)
-
 
292
            {
-
 
293
               /* png_ptr->zstream holds a back-pointer to the png_struct, so
-
 
294
                * this can only be done now:
-
 
295
                */
-
 
296
               create_struct.zstream.zalloc = png_zalloc;
-
 
297
               create_struct.zstream.zfree = png_zfree;
-
 
298
               create_struct.zstream.opaque = png_ptr;
-
 
299
 
-
 
300
#              ifdef PNG_SETJMP_SUPPORTED
156
   info_ptr = (png_infop)png_create_struct_2(PNG_STRUCT_INFO,
301
                  /* Eliminate the local error handling: */
-
 
302
                  create_struct.jmp_buf_ptr = NULL;
-
 
303
                  create_struct.jmp_buf_size = 0;
-
 
304
                  create_struct.longjmp_fn = 0;
-
 
305
#              endif
-
 
306
 
-
 
307
               *png_ptr = create_struct;
-
 
308
 
-
 
309
               /* This is the successful return point */
-
 
310
               return png_ptr;
-
 
311
            }
-
 
312
         }
-
 
313
      }
-
 
314
 
-
 
315
   /* A longjmp because of a bug in the application storage allocator or a
-
 
316
    * simple failure to allocate the png_struct.
-
 
317
    */
-
 
318
   return NULL;
-
 
319
}
-
 
320
 
-
 
321
/* Allocate the memory for an info_struct for the application. */
-
 
322
PNG_FUNCTION(png_infop,PNGAPI
-
 
323
png_create_info_struct,(png_const_structrp png_ptr),PNG_ALLOCATED)
-
 
324
{
-
 
325
   png_inforp info_ptr;
-
 
326
 
-
 
327
   png_debug(1, "in png_create_info_struct");
-
 
328
 
-
 
329
   if (png_ptr == NULL)
-
 
330
      return NULL;
-
 
331
 
-
 
332
   /* Use the internal API that does not (or at least should not) error out, so
-
 
333
    * that this call always returns ok.  The application typically sets up the
-
 
334
    * error handling *after* creating the info_struct because this is the way it
-
 
335
    * has always been done in 'example.c'.
157
      png_ptr->malloc_fn, png_ptr->mem_ptr);
336
    */
158
#else
337
   info_ptr = png_voidcast(png_inforp, png_malloc_base(png_ptr,
Line 159... Line 338...
159
   info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO);
338
      (sizeof *info_ptr)));
160
#endif
339
 
Line 161... Line 340...
161
   if (info_ptr != NULL)
340
   if (info_ptr != NULL)
162
      png_info_init_3(&info_ptr, png_sizeof(png_info));
341
      memset(info_ptr, 0, (sizeof *info_ptr));
163
 
342
 
164
   return (info_ptr);
343
   return info_ptr;
-
 
344
}
-
 
345
 
-
 
346
/* This function frees the memory associated with a single info struct.
165
}
347
 * Normally, one would use either png_destroy_read_struct() or
166
 
348
 * png_destroy_write_struct() to free an info struct, but this may be
167
/* This function frees the memory associated with a single info struct.
349
 * useful for some applications.  From libpng 1.6.0 this function is also used
168
 * Normally, one would use either png_destroy_read_struct() or
350
 * internally to implement the png_info release part of the 'struct' destroy
169
 * png_destroy_write_struct() to free an info struct, but this may be
351
 * APIs.  This ensures that all possible approaches free the same data (all of
Line 170... Line 352...
170
 * useful for some applications.
352
 * it).
Line 171... Line 353...
171
 */
353
 */
172
void PNGAPI
354
void PNGAPI
Line 183... Line 365...
183
      info_ptr = *info_ptr_ptr;
365
      info_ptr = *info_ptr_ptr;
184
 
366
 
Line 185... Line 367...
185
   if (info_ptr != NULL)
367
   if (info_ptr != NULL)
186
   {
368
   {
187
      png_info_destroy(png_ptr, info_ptr);
369
      /* Do this first in case of an error below; if the app implements its own
188
 
-
 
189
#ifdef PNG_USER_MEM_SUPPORTED
370
       * memory management this can lead to png_free calling png_error, which
190
      png_destroy_struct_2((png_voidp)info_ptr, png_ptr->free_fn,
371
       * will abort this routine and return control to the app error handler.
191
          png_ptr->mem_ptr);
372
       * An infinite loop may result if it then tries to free the same info
192
#else
-
 
193
      png_destroy_struct((png_voidp)info_ptr);
373
       * ptr.
194
#endif
374
       */
195
      *info_ptr_ptr = NULL;
375
      *info_ptr_ptr = NULL;
-
 
376
 
-
 
377
      png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1);
-
 
378
      memset(info_ptr, 0, (sizeof *info_ptr));
-
 
379
      png_free(png_ptr, info_ptr);
196
   }
380
   }
197
}
381
}
Line 198... Line 382...
198
 
382
 
199
/* Initialize the info structure.  This is now an internal function (0.89)
383
/* Initialize the info structure.  This is now an internal function (0.89)
-
 
384
 * and applications using it are urged to use png_create_info_struct()
200
 * and applications using it are urged to use png_create_info_struct()
385
 * instead.  Use deprecated in 1.6.0, internal use removed (used internally it
201
 * instead.
386
 * is just a memset).
-
 
387
 *
-
 
388
 * NOTE: it is almost inconceivable that this API is used because it bypasses
-
 
389
 * the user-memory mechanism and the user error handling/warning mechanisms in
202
 */
390
 * those cases where it does anything other than a memset.
203
 
391
 */
204
void PNGAPI
392
PNG_FUNCTION(void,PNGAPI
-
 
393
png_info_init_3,(png_infopp ptr_ptr, png_size_t png_info_struct_size),
205
png_info_init_3(png_infopp ptr_ptr, png_size_t png_info_struct_size)
394
   PNG_DEPRECATED)
206
{
395
{
Line 207... Line 396...
207
   png_infop info_ptr = *ptr_ptr;
396
   png_inforp info_ptr = *ptr_ptr;
Line 208... Line 397...
208
 
397
 
209
   png_debug(1, "in png_info_init_3");
398
   png_debug(1, "in png_info_init_3");
Line 210... Line 399...
210
 
399
 
211
   if (info_ptr == NULL)
400
   if (info_ptr == NULL)
-
 
401
      return;
-
 
402
 
212
      return;
403
   if ((sizeof (png_info)) > png_info_struct_size)
213
 
404
   {
-
 
405
      *ptr_ptr = NULL;
214
   if (png_sizeof(png_info) > png_info_struct_size)
406
      /* The following line is why this API should not be used: */
215
   {
407
      free(info_ptr);
Line 216... Line 408...
216
      png_destroy_struct(info_ptr);
408
      info_ptr = png_voidcast(png_inforp, png_malloc_base(NULL,
217
      info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO);
409
         (sizeof *info_ptr)));
218
      *ptr_ptr = info_ptr;
410
      *ptr_ptr = info_ptr;
Line -... Line 411...
-
 
411
   }
219
   }
412
 
220
 
413
   /* Set everything to 0 */
221
   /* Set everything to 0 */
414
   memset(info_ptr, 0, (sizeof *info_ptr));
222
   png_memset(info_ptr, 0, png_sizeof(png_info));
415
}
223
}
416
 
Line 224... Line 417...
224
 
417
/* The following API is not called internally */
Line 237... Line 430...
237
   else if (freer == PNG_USER_WILL_FREE_DATA)
430
   else if (freer == PNG_USER_WILL_FREE_DATA)
238
      info_ptr->free_me &= ~mask;
431
      info_ptr->free_me &= ~mask;
Line 239... Line 432...
239
 
432
 
240
   else
-
 
241
      png_warning(png_ptr,
433
   else
242
         "Unknown freer parameter in png_data_freer");
434
      png_error(png_ptr, "Unknown freer parameter in png_data_freer");
Line 243... Line 435...
243
}
435
}
244
 
436
 
245
void PNGAPI
437
void PNGAPI
246
png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask,
438
png_free_data(png_const_structrp png_ptr, png_inforp info_ptr, png_uint_32 mask,
247
   int num)
439
   int num)
Line 248... Line 440...
248
{
440
{
Line 289... Line 481...
289
#ifdef PNG_sCAL_SUPPORTED
481
#ifdef PNG_sCAL_SUPPORTED
290
   /* Free any sCAL entry */
482
   /* Free any sCAL entry */
291
   if ((mask & PNG_FREE_SCAL) & info_ptr->free_me)
483
   if ((mask & PNG_FREE_SCAL) & info_ptr->free_me)
292
   {
484
   {
293
#if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED)
-
 
294
      png_free(png_ptr, info_ptr->scal_s_width);
485
      png_free(png_ptr, info_ptr->scal_s_width);
295
      png_free(png_ptr, info_ptr->scal_s_height);
486
      png_free(png_ptr, info_ptr->scal_s_height);
296
      info_ptr->scal_s_width = NULL;
487
      info_ptr->scal_s_width = NULL;
297
      info_ptr->scal_s_height = NULL;
488
      info_ptr->scal_s_height = NULL;
298
#endif
-
 
299
      info_ptr->valid &= ~PNG_INFO_sCAL;
489
      info_ptr->valid &= ~PNG_INFO_sCAL;
300
   }
490
   }
301
#endif
491
#endif
Line 302... Line 492...
302
 
492
 
Line 309... Line 499...
309
      info_ptr->pcal_purpose = NULL;
499
      info_ptr->pcal_purpose = NULL;
310
      info_ptr->pcal_units = NULL;
500
      info_ptr->pcal_units = NULL;
311
      if (info_ptr->pcal_params != NULL)
501
      if (info_ptr->pcal_params != NULL)
312
         {
502
         {
313
            int i;
503
            unsigned int i;
314
            for (i = 0; i < (int)info_ptr->pcal_nparams; i++)
504
            for (i = 0; i < info_ptr->pcal_nparams; i++)
315
            {
505
            {
316
               png_free(png_ptr, info_ptr->pcal_params[i]);
506
               png_free(png_ptr, info_ptr->pcal_params[i]);
317
               info_ptr->pcal_params[i] = NULL;
507
               info_ptr->pcal_params[i] = NULL;
318
            }
508
            }
319
            png_free(png_ptr, info_ptr->pcal_params);
509
            png_free(png_ptr, info_ptr->pcal_params);
320
            info_ptr->pcal_params = NULL;
510
            info_ptr->pcal_params = NULL;
Line 323... Line 513...
323
   }
513
   }
324
#endif
514
#endif
325
 
515
 
Line 326... Line 516...
326
#ifdef PNG_iCCP_SUPPORTED
516
#ifdef PNG_iCCP_SUPPORTED
327
   /* Free any iCCP entry */
517
   /* Free any profile entry */
328
   if ((mask & PNG_FREE_ICCP) & info_ptr->free_me)
518
   if ((mask & PNG_FREE_ICCP) & info_ptr->free_me)
329
   {
519
   {
330
      png_free(png_ptr, info_ptr->iccp_name);
520
      png_free(png_ptr, info_ptr->iccp_name);
331
      png_free(png_ptr, info_ptr->iccp_profile);
521
      png_free(png_ptr, info_ptr->iccp_profile);
332
      info_ptr->iccp_name = NULL;
522
      info_ptr->iccp_name = NULL;
Line 354... Line 544...
354
      {
544
      {
355
         if (info_ptr->splt_palettes_num)
545
         if (info_ptr->splt_palettes_num)
356
         {
546
         {
357
            int i;
547
            int i;
358
            for (i = 0; i < (int)info_ptr->splt_palettes_num; i++)
548
            for (i = 0; i < info_ptr->splt_palettes_num; i++)
359
               png_free_data(png_ptr, info_ptr, PNG_FREE_SPLT, i);
549
               png_free_data(png_ptr, info_ptr, PNG_FREE_SPLT, (int)i);
360
 
550
 
Line 361... Line 551...
361
            png_free(png_ptr, info_ptr->splt_palettes);
551
            png_free(png_ptr, info_ptr->splt_palettes);
362
            info_ptr->splt_palettes = NULL;
552
            info_ptr->splt_palettes = NULL;
363
            info_ptr->splt_palettes_num = 0;
553
            info_ptr->splt_palettes_num = 0;
364
         }
554
         }
365
         info_ptr->valid &= ~PNG_INFO_sPLT;
555
         info_ptr->valid &= ~PNG_INFO_sPLT;
366
      }
556
      }
367
   }
557
   }
368
#endif
558
#endif
Line 369... Line 559...
369
 
559
 
370
#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED
-
 
371
   if (png_ptr->unknown_chunk.data)
-
 
372
   {
-
 
373
      png_free(png_ptr, png_ptr->unknown_chunk.data);
-
 
374
      png_ptr->unknown_chunk.data = NULL;
-
 
375
   }
-
 
376
 
560
#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED
377
   if ((mask & PNG_FREE_UNKN) & info_ptr->free_me)
561
   if ((mask & PNG_FREE_UNKN) & info_ptr->free_me)
378
   {
562
   {
379
      if (num != -1)
563
      if (num != -1)
380
      {
564
      {
Line 391... Line 575...
391
 
575
 
Line 392... Line 576...
392
         if (info_ptr->unknown_chunks_num)
576
         if (info_ptr->unknown_chunks_num)
393
         {
577
         {
394
            for (i = 0; i < info_ptr->unknown_chunks_num; i++)
578
            for (i = 0; i < info_ptr->unknown_chunks_num; i++)
395
               png_free_data(png_ptr, info_ptr, PNG_FREE_UNKN, i);
579
               png_free_data(png_ptr, info_ptr, PNG_FREE_UNKN, (int)i);
Line 396... Line 580...
396
 
580
 
397
            png_free(png_ptr, info_ptr->unknown_chunks);
581
            png_free(png_ptr, info_ptr->unknown_chunks);
398
            info_ptr->unknown_chunks = NULL;
582
            info_ptr->unknown_chunks = NULL;
399
            info_ptr->unknown_chunks_num = 0;
583
            info_ptr->unknown_chunks_num = 0;
Line 414... Line 598...
414
 
598
 
Line 415... Line 599...
415
   /* Free any PLTE entry that was internally allocated */
599
   /* Free any PLTE entry that was internally allocated */
416
   if ((mask & PNG_FREE_PLTE) & info_ptr->free_me)
600
   if ((mask & PNG_FREE_PLTE) & info_ptr->free_me)
417
   {
601
   {
418
      png_zfree(png_ptr, info_ptr->palette);
602
      png_free(png_ptr, info_ptr->palette);
419
      info_ptr->palette = NULL;
603
      info_ptr->palette = NULL;
420
      info_ptr->valid &= ~PNG_INFO_PLTE;
604
      info_ptr->valid &= ~PNG_INFO_PLTE;
421
      info_ptr->num_palette = 0;
605
      info_ptr->num_palette = 0;
422
   }
606
   }
Line 426... Line 610...
426
   if ((mask & PNG_FREE_ROWS) & info_ptr->free_me)
610
   if ((mask & PNG_FREE_ROWS) & info_ptr->free_me)
427
   {
611
   {
428
      if (info_ptr->row_pointers)
612
      if (info_ptr->row_pointers)
429
      {
613
      {
430
         int row;
614
         png_uint_32 row;
431
         for (row = 0; row < (int)info_ptr->height; row++)
615
         for (row = 0; row < info_ptr->height; row++)
432
         {
616
         {
433
            png_free(png_ptr, info_ptr->row_pointers[row]);
617
            png_free(png_ptr, info_ptr->row_pointers[row]);
434
            info_ptr->row_pointers[row] = NULL;
618
            info_ptr->row_pointers[row] = NULL;
435
         }
619
         }
436
         png_free(png_ptr, info_ptr->row_pointers);
620
         png_free(png_ptr, info_ptr->row_pointers);
437
         info_ptr->row_pointers = NULL;
621
         info_ptr->row_pointers = NULL;
Line 444... Line 628...
444
      mask &= ~PNG_FREE_MUL;
628
      mask &= ~PNG_FREE_MUL;
445
 
629
 
Line 446... Line 630...
446
   info_ptr->free_me &= ~mask;
630
   info_ptr->free_me &= ~mask;
447
}
631
}
448
 
-
 
449
/* This is an internal routine to free any memory that the info struct is
-
 
450
 * pointing to before re-using it or freeing the struct itself.  Recall
-
 
451
 * that png_free() checks for NULL pointers for us.
-
 
452
 */
-
 
453
void /* PRIVATE */
-
 
454
png_info_destroy(png_structp png_ptr, png_infop info_ptr)
-
 
455
{
-
 
456
   png_debug(1, "in png_info_destroy");
-
 
457
 
-
 
458
   png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1);
-
 
459
 
-
 
460
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
-
 
461
   if (png_ptr->num_chunk_list)
-
 
462
   {
-
 
463
      png_free(png_ptr, png_ptr->chunk_list);
-
 
464
      png_ptr->chunk_list = NULL;
-
 
465
      png_ptr->num_chunk_list = 0;
-
 
466
   }
-
 
467
#endif
-
 
468
 
-
 
469
   png_info_init_3(&info_ptr, png_sizeof(png_info));
-
 
470
}
-
 
471
#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */
632
#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */
Line 472... Line 633...
472
 
633
 
473
/* This function returns a pointer to the io_ptr associated with the user
634
/* This function returns a pointer to the io_ptr associated with the user
474
 * functions.  The application should free any memory associated with this
635
 * functions.  The application should free any memory associated with this
475
 * pointer before png_write_destroy() or png_read_destroy() are called.
636
 * pointer before png_write_destroy() or png_read_destroy() are called.
476
 */
637
 */
477
png_voidp PNGAPI
638
png_voidp PNGAPI
478
png_get_io_ptr(png_structp png_ptr)
639
png_get_io_ptr(png_const_structrp png_ptr)
479
{
640
{
480
   if (png_ptr == NULL)
641
   if (png_ptr == NULL)
Line 481... Line 642...
481
      return (NULL);
642
      return (NULL);
Line 487... Line 648...
487
#  ifdef PNG_STDIO_SUPPORTED
648
#  ifdef PNG_STDIO_SUPPORTED
488
/* Initialize the default input/output functions for the PNG file.  If you
649
/* Initialize the default input/output functions for the PNG file.  If you
489
 * use your own read or write routines, you can call either png_set_read_fn()
650
 * use your own read or write routines, you can call either png_set_read_fn()
490
 * or png_set_write_fn() instead of png_init_io().  If you have defined
651
 * or png_set_write_fn() instead of png_init_io().  If you have defined
491
 * PNG_NO_STDIO, you must use a function of your own because "FILE *" isn't
652
 * PNG_NO_STDIO or otherwise disabled PNG_STDIO_SUPPORTED, you must use a
492
 * necessarily available.
653
 * function of your own because "FILE *" isn't necessarily available.
493
 */
654
 */
494
void PNGAPI
655
void PNGAPI
495
png_init_io(png_structp png_ptr, png_FILE_p fp)
656
png_init_io(png_structrp png_ptr, png_FILE_p fp)
496
{
657
{
497
   png_debug(1, "in png_init_io");
658
   png_debug(1, "in png_init_io");
498
 
659
 
Line 499... Line 660...
499
   if (png_ptr == NULL)
660
   if (png_ptr == NULL)
500
      return;
661
      return;
Line 501... Line 662...
501
 
662
 
502
   png_ptr->io_ptr = (png_voidp)fp;
663
   png_ptr->io_ptr = (png_voidp)fp;
503
}
664
}
Line -... Line 665...
-
 
665
#  endif
-
 
666
 
-
 
667
#ifdef PNG_SAVE_INT_32_SUPPORTED
-
 
668
/* The png_save_int_32 function assumes integers are stored in two's
-
 
669
 * complement format.  If this isn't the case, then this routine needs to
-
 
670
 * be modified to write data in two's complement format.  Note that,
-
 
671
 * the following works correctly even if png_int_32 has more than 32 bits
-
 
672
 * (compare the more complex code required on read for sign extension.)
-
 
673
 */
-
 
674
void PNGAPI
-
 
675
png_save_int_32(png_bytep buf, png_int_32 i)
-
 
676
{
-
 
677
   buf[0] = (png_byte)((i >> 24) & 0xff);
-
 
678
   buf[1] = (png_byte)((i >> 16) & 0xff);
-
 
679
   buf[2] = (png_byte)((i >> 8) & 0xff);
-
 
680
   buf[3] = (png_byte)(i & 0xff);
-
 
681
}
504
#  endif
682
#endif
505
 
683
 
506
#  ifdef PNG_TIME_RFC1123_SUPPORTED
684
#  ifdef PNG_TIME_RFC1123_SUPPORTED
507
/* Convert the supplied time into an RFC 1123 string suitable for use in
685
/* Convert the supplied time into an RFC 1123 string suitable for use in
508
 * a "Creation Time" or other text-based time string.
686
 * a "Creation Time" or other text-based time string.
509
 */
687
 */
510
png_const_charp PNGAPI
688
int PNGAPI
511
png_convert_to_rfc1123(png_structp png_ptr, png_const_timep ptime)
689
png_convert_to_rfc1123_buffer(char out[29], png_const_timep ptime)
512
{
690
{
513
   static PNG_CONST char short_months[12][4] =
691
   static PNG_CONST char short_months[12][4] =
Line 514... Line 692...
514
        {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
692
        {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
-
 
693
         "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
-
 
694
 
-
 
695
   if (out == NULL)
-
 
696
      return 0;
-
 
697
 
-
 
698
   if (ptime->year > 9999 /* RFC1123 limitation */ ||
-
 
699
       ptime->month == 0    ||  ptime->month > 12  ||
515
         "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
700
       ptime->day   == 0    ||  ptime->day   > 31  ||
Line 516... Line -...
516
 
-
 
517
   if (png_ptr == NULL)
701
       ptime->hour  > 23    ||  ptime->minute > 59 ||
-
 
702
       ptime->second > 60)
-
 
703
      return 0;
-
 
704
 
518
      return (NULL);
705
   {
-
 
706
      size_t pos = 0;
-
 
707
      char number_buf[5]; /* enough for a four-digit year */
-
 
708
 
-
 
709
#     define APPEND_STRING(string) pos = png_safecat(out, 29, pos, (string))
-
 
710
#     define APPEND_NUMBER(format, value)\
-
 
711
         APPEND_STRING(PNG_FORMAT_NUMBER(number_buf, format, (value)))
-
 
712
#     define APPEND(ch) if (pos < 28) out[pos++] = (ch)
-
 
713
 
-
 
714
      APPEND_NUMBER(PNG_NUMBER_FORMAT_u, (unsigned)ptime->day);
-
 
715
      APPEND(' ');
-
 
716
      APPEND_STRING(short_months[(ptime->month - 1)]);
-
 
717
      APPEND(' ');
-
 
718
      APPEND_NUMBER(PNG_NUMBER_FORMAT_u, ptime->year);
519
 
719
      APPEND(' ');
-
 
720
      APPEND_NUMBER(PNG_NUMBER_FORMAT_02u, (unsigned)ptime->hour);
-
 
721
      APPEND(':');
-
 
722
      APPEND_NUMBER(PNG_NUMBER_FORMAT_02u, (unsigned)ptime->minute);
-
 
723
      APPEND(':');
-
 
724
      APPEND_NUMBER(PNG_NUMBER_FORMAT_02u, (unsigned)ptime->second);
-
 
725
      APPEND_STRING(" +0000"); /* This reliably terminates the buffer */
520
   if (png_ptr->time_buffer == NULL)
726
 
Line 521... Line -...
521
   {
-
 
522
      png_ptr->time_buffer = (png_charp)png_malloc(png_ptr, (png_uint_32)(29*
727
#     undef APPEND
523
         png_sizeof(char)));
-
 
524
   }
-
 
525
 
-
 
526
#    ifdef USE_FAR_KEYWORD
-
 
527
   {
-
 
528
      char near_time_buf[29];
-
 
529
      png_snprintf6(near_time_buf, 29, "%d %s %d %02d:%02d:%02d +0000",
-
 
530
          ptime->day % 32, short_months[(ptime->month - 1) % 12],
728
#     undef APPEND_NUMBER
-
 
729
#     undef APPEND_STRING
-
 
730
   }
-
 
731
 
-
 
732
   return 1;
-
 
733
}
-
 
734
 
531
          ptime->year, ptime->hour % 24, ptime->minute % 60,
735
#     if PNG_LIBPNG_VER < 10700
-
 
736
/* To do: remove the following from libpng-1.7 */
532
          ptime->second % 61);
737
/* Original API that uses a private buffer in png_struct.
-
 
738
 * Deprecated because it causes png_struct to carry a spurious temporary
-
 
739
 * buffer (png_struct::time_buffer), better to have the caller pass this in.
-
 
740
 */
533
      png_memcpy(png_ptr->time_buffer, near_time_buf,
741
png_const_charp PNGAPI
534
          29*png_sizeof(char));
742
png_convert_to_rfc1123(png_structrp png_ptr, png_const_timep ptime)
535
   }
743
{
-
 
744
   if (png_ptr != NULL)
536
#    else
745
   {
537
   png_snprintf6(png_ptr->time_buffer, 29, "%d %s %d %02d:%02d:%02d +0000",
746
      /* The only failure above if png_ptr != NULL is from an invalid ptime */
538
       ptime->day % 32, short_months[(ptime->month - 1) % 12],
747
      if (!png_convert_to_rfc1123_buffer(png_ptr->time_buffer, ptime))
-
 
748
         png_warning(png_ptr, "Ignoring invalid time value");
-
 
749
 
-
 
750
      else
-
 
751
         return png_ptr->time_buffer;
539
       ptime->year, ptime->hour % 24, ptime->minute % 60,
752
   }
Line 540... Line 753...
540
       ptime->second % 61);
753
 
Line 541... Line 754...
541
#    endif
754
   return NULL;
542
   return png_ptr->time_buffer;
755
}
543
}
756
#     endif
544
#  endif /* PNG_TIME_RFC1123_SUPPORTED */
757
#  endif /* PNG_TIME_RFC1123_SUPPORTED */
545
 
758
 
546
#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */
759
#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */
547
 
760
 
548
png_const_charp PNGAPI
761
png_const_charp PNGAPI
549
png_get_copyright(png_const_structp png_ptr)
762
png_get_copyright(png_const_structrp png_ptr)
550
{
763
{
551
   PNG_UNUSED(png_ptr)  /* Silence compiler warning about unused png_ptr */
764
   PNG_UNUSED(png_ptr)  /* Silence compiler warning about unused png_ptr */
552
#ifdef PNG_STRING_COPYRIGHT
765
#ifdef PNG_STRING_COPYRIGHT
553
   return PNG_STRING_COPYRIGHT
766
   return PNG_STRING_COPYRIGHT
554
#else
767
#else
555
#  ifdef __STDC__
768
#  ifdef __STDC__
556
   return PNG_STRING_NEWLINE \
769
   return PNG_STRING_NEWLINE \
557
     "libpng version 1.5.1 - February 3, 2011" PNG_STRING_NEWLINE \
770
     "libpng version 1.6.5 - September 14, 2013" PNG_STRING_NEWLINE \
558
     "Copyright (c) 1998-2011 Glenn Randers-Pehrson" PNG_STRING_NEWLINE \
771
     "Copyright (c) 1998-2013 Glenn Randers-Pehrson" PNG_STRING_NEWLINE \
559
     "Copyright (c) 1996-1997 Andreas Dilger" PNG_STRING_NEWLINE \
772
     "Copyright (c) 1996-1997 Andreas Dilger" PNG_STRING_NEWLINE \
560
     "Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc." \
773
     "Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc." \
561
     PNG_STRING_NEWLINE;
774
     PNG_STRING_NEWLINE;
562
#  else
775
#  else
Line 576... Line 789...
576
 * png_get_header_ver().  Due to the version_nn_nn_nn typedef guard,
789
 * png_get_header_ver().  Due to the version_nn_nn_nn typedef guard,
577
 * it is guaranteed that png.c uses the correct version of png.h.
790
 * it is guaranteed that png.c uses the correct version of png.h.
578
 */
791
 */
579
png_const_charp PNGAPI
792
png_const_charp PNGAPI
580
png_get_libpng_ver(png_const_structp png_ptr)
793
png_get_libpng_ver(png_const_structrp png_ptr)
581
{
794
{
582
   /* Version of *.c files used when building libpng */
795
   /* Version of *.c files used when building libpng */
583
   return png_get_header_ver(png_ptr);
796
   return png_get_header_ver(png_ptr);
584
}
797
}
585
 
798
 
Line 586... Line 799...
586
png_const_charp PNGAPI
799
png_const_charp PNGAPI
587
png_get_header_ver(png_const_structp png_ptr)
800
png_get_header_ver(png_const_structrp png_ptr)
588
{
801
{
589
   /* Version of *.h files used when building libpng */
802
   /* Version of *.h files used when building libpng */
590
   PNG_UNUSED(png_ptr)  /* Silence compiler warning about unused png_ptr */
803
   PNG_UNUSED(png_ptr)  /* Silence compiler warning about unused png_ptr */
591
   return PNG_LIBPNG_VER_STRING;
804
   return PNG_LIBPNG_VER_STRING;
592
}
805
}
Line 593... Line 806...
593
 
806
 
594
png_const_charp PNGAPI
807
png_const_charp PNGAPI
595
png_get_header_version(png_const_structp png_ptr)
808
png_get_header_version(png_const_structrp png_ptr)
596
{
809
{
597
   /* Returns longer string containing both version and date */
810
   /* Returns longer string containing both version and date */
598
   PNG_UNUSED(png_ptr)  /* Silence compiler warning about unused png_ptr */
811
   PNG_UNUSED(png_ptr)  /* Silence compiler warning about unused png_ptr */
599
#ifdef __STDC__
812
#ifdef __STDC__
Line 606... Line 819...
606
   return PNG_HEADER_VERSION_STRING;
819
   return PNG_HEADER_VERSION_STRING;
607
#endif
820
#endif
608
}
821
}
609
 
822
 
Line 610... Line -...
610
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
-
 
611
#  ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
823
#ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED
612
int PNGAPI
824
int PNGAPI
613
png_handle_as_unknown(png_structp png_ptr, png_const_bytep chunk_name)
825
png_handle_as_unknown(png_const_structrp png_ptr, png_const_bytep chunk_name)
614
{
826
{
615
   /* Check chunk_name and return "keep" value if it's on the list, else 0 */
827
   /* Check chunk_name and return "keep" value if it's on the list, else 0 */
616
   int i;
-
 
617
   png_bytep p;
828
   png_const_bytep p, p_end;
618
   if (png_ptr == NULL || chunk_name == NULL || png_ptr->num_chunk_list<=0)
-
 
619
      return 0;
-
 
Line 620... Line 829...
620
 
829
 
-
 
830
   if (png_ptr == NULL || chunk_name == NULL || png_ptr->num_chunk_list == 0)
-
 
831
      return PNG_HANDLE_CHUNK_AS_DEFAULT;
-
 
832
 
621
   p = png_ptr->chunk_list + png_ptr->num_chunk_list*5 - 5;
833
   p_end = png_ptr->chunk_list;
-
 
834
   p = p_end + png_ptr->num_chunk_list*5; /* beyond end */
-
 
835
 
-
 
836
   /* The code is the fifth byte after each four byte string.  Historically this
-
 
837
    * code was always searched from the end of the list, this is no longer
-
 
838
    * necessary because the 'set' routine handles duplicate entries correcty.
622
   for (i = png_ptr->num_chunk_list; i; i--, p -= 5)
839
    */
-
 
840
   do /* num_chunk_list > 0, so at least one */
-
 
841
   {
-
 
842
      p -= 5;
623
      if (!png_memcmp(chunk_name, p, 4))
843
 
624
        return ((int)*(p + 4));
844
      if (!memcmp(chunk_name, p, 4))
625
   return 0;
845
         return p[4];
-
 
846
   }
-
 
847
   while (p > p_end);
-
 
848
 
-
 
849
   /* This means that known chunks should be processed and unknown chunks should
-
 
850
    * be handled according to the value of png_ptr->unknown_default; this can be
-
 
851
    * confusing because, as a result, there are two levels of defaulting for
626
}
852
    * unknown chunks.
-
 
853
    */
-
 
854
   return PNG_HANDLE_CHUNK_AS_DEFAULT;
-
 
855
}
627
#  endif
856
 
-
 
857
#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
-
 
858
int /* PRIVATE */
-
 
859
png_chunk_unknown_handling(png_const_structrp png_ptr, png_uint_32 chunk_name)
-
 
860
{
-
 
861
   png_byte chunk_string[5];
-
 
862
 
-
 
863
   PNG_CSTRING_FROM_CHUNK(chunk_string, chunk_name);
-
 
864
   return png_handle_as_unknown(png_ptr, chunk_string);
-
 
865
}
-
 
866
#endif /* HANDLE_AS_UNKNOWN */
Line 628... Line 867...
628
#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */
867
#endif /* SET_UNKNOWN_CHUNKS */
629
 
868
 
630
#ifdef PNG_READ_SUPPORTED
869
#ifdef PNG_READ_SUPPORTED
631
/* This function, added to libpng-1.0.6g, is untested. */
870
/* This function, added to libpng-1.0.6g, is untested. */
632
int PNGAPI
871
int PNGAPI
633
png_reset_zstream(png_structp png_ptr)
872
png_reset_zstream(png_structrp png_ptr)
634
{
873
{
Line -... Line 874...
-
 
874
   if (png_ptr == NULL)
635
   if (png_ptr == NULL)
875
      return Z_STREAM_ERROR;
636
      return Z_STREAM_ERROR;
876
 
637
 
877
   /* WARNING: this resets the window bits to the maximum! */
Line 638... Line 878...
638
   return (inflateReset(&png_ptr->zstream));
878
   return (inflateReset(&png_ptr->zstream));
Line 649... Line 889...
649
 
889
 
Line 650... Line 890...
650
 
890
 
-
 
891
 
-
 
892
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
-
 
893
/* Ensure that png_ptr->zstream.msg holds some appropriate error message string.
-
 
894
 * If it doesn't 'ret' is used to set it to something appropriate, even in cases
651
 
895
 * like Z_OK or Z_STREAM_END where the error code is apparently a success code.
652
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
896
 */
-
 
897
void /* PRIVATE */
-
 
898
png_zstream_error(png_structrp png_ptr, int ret)
-
 
899
{
653
#  ifdef PNG_SIZE_T
900
   /* Translate 'ret' into an appropriate error string, priority is given to the
654
/* Added at libpng version 1.2.6 */
901
    * one in zstream if set.  This always returns a string, even in cases like
655
   PNG_EXTERN png_size_t PNGAPI png_convert_size PNGARG((size_t size));
902
    * Z_OK or Z_STREAM_END where the error code is a success code.
656
png_size_t PNGAPI
903
    */
-
 
904
   if (png_ptr->zstream.msg == NULL) switch (ret)
-
 
905
   {
-
 
906
      default:
-
 
907
      case Z_OK:
-
 
908
         png_ptr->zstream.msg = PNGZ_MSG_CAST("unexpected zlib return code");
-
 
909
         break;
-
 
910
 
-
 
911
      case Z_STREAM_END:
-
 
912
         /* Normal exit */
-
 
913
         png_ptr->zstream.msg = PNGZ_MSG_CAST("unexpected end of LZ stream");
657
png_convert_size(size_t size)
914
         break;
-
 
915
 
-
 
916
      case Z_NEED_DICT:
-
 
917
         /* This means the deflate stream did not have a dictionary; this
-
 
918
          * indicates a bogus PNG.
-
 
919
          */
-
 
920
         png_ptr->zstream.msg = PNGZ_MSG_CAST("missing LZ dictionary");
-
 
921
         break;
-
 
922
 
-
 
923
      case Z_ERRNO:
-
 
924
         /* gz APIs only: should not happen */
-
 
925
         png_ptr->zstream.msg = PNGZ_MSG_CAST("zlib IO error");
-
 
926
         break;
-
 
927
 
-
 
928
      case Z_STREAM_ERROR:
-
 
929
         /* internal libpng error */
-
 
930
         png_ptr->zstream.msg = PNGZ_MSG_CAST("bad parameters to zlib");
-
 
931
         break;
-
 
932
 
-
 
933
      case Z_DATA_ERROR:
-
 
934
         png_ptr->zstream.msg = PNGZ_MSG_CAST("damaged LZ stream");
-
 
935
         break;
-
 
936
 
-
 
937
      case Z_MEM_ERROR:
-
 
938
         png_ptr->zstream.msg = PNGZ_MSG_CAST("insufficient memory");
-
 
939
         break;
658
{
940
 
-
 
941
      case Z_BUF_ERROR:
-
 
942
         /* End of input or output; not a problem if the caller is doing
-
 
943
          * incremental read or write.
-
 
944
          */
Line 659... Line 945...
659
   if (size > (png_size_t)-1)
945
         png_ptr->zstream.msg = PNGZ_MSG_CAST("truncated");
-
 
946
         break;
-
 
947
 
-
 
948
      case Z_VERSION_ERROR:
-
 
949
         png_ptr->zstream.msg = PNGZ_MSG_CAST("unsupported zlib version");
-
 
950
         break;
-
 
951
 
-
 
952
      case PNG_UNEXPECTED_ZLIB_RETURN:
-
 
953
         /* Compile errors here mean that zlib now uses the value co-opted in
-
 
954
          * pngpriv.h for PNG_UNEXPECTED_ZLIB_RETURN; update the switch above
-
 
955
          * and change pngpriv.h.  Note that this message is "... return",
-
 
956
          * whereas the default/Z_OK one is "... return code".
-
 
957
          */
660
      PNG_ABORT();  /* We haven't got access to png_ptr, so no png_error() */
958
         png_ptr->zstream.msg = PNGZ_MSG_CAST("unexpected zlib return");
-
 
959
         break;
-
 
960
   }
661
 
961
}
-
 
962
 
Line 662... Line 963...
662
   return ((png_size_t)size);
963
/* png_convert_size: a PNGAPI but no longer in png.h, so deleted
-
 
964
 * at libpng 1.5.5!
-
 
965
 */
-
 
966
 
-
 
967
/* Added at libpng version 1.2.34 and 1.4.0 (moved from pngset.c) */
-
 
968
#ifdef PNG_GAMMA_SUPPORTED /* always set if COLORSPACE */
-
 
969
static int
-
 
970
png_colorspace_check_gamma(png_const_structrp png_ptr,
-
 
971
   png_colorspacerp colorspace, png_fixed_point gAMA, int from)
-
 
972
   /* This is called to check a new gamma value against an existing one.  The
-
 
973
    * routine returns false if the new gamma value should not be written.
-
 
974
    *
-
 
975
    * 'from' says where the new gamma value comes from:
-
 
976
    *
-
 
977
    *    0: the new gamma value is the libpng estimate for an ICC profile
-
 
978
    *    1: the new gamma value comes from a gAMA chunk
-
 
979
    *    2: the new gamma value comes from an sRGB chunk
-
 
980
    */
-
 
981
{
-
 
982
   png_fixed_point gtest;
-
 
983
 
-
 
984
   if ((colorspace->flags & PNG_COLORSPACE_HAVE_GAMMA) != 0 &&
-
 
985
      (!png_muldiv(>est, colorspace->gamma, PNG_FP_1, gAMA) ||
-
 
986
      png_gamma_significant(gtest)))
-
 
987
   {
-
 
988
      /* Either this is an sRGB image, in which case the calculated gamma
-
 
989
       * approximation should match, or this is an image with a profile and the
-
 
990
       * value libpng calculates for the gamma of the profile does not match the
-
 
991
       * value recorded in the file.  The former, sRGB, case is an error, the
-
 
992
       * latter is just a warning.
-
 
993
       */
-
 
994
      if ((colorspace->flags & PNG_COLORSPACE_FROM_sRGB) != 0 || from == 2)
-
 
995
      {
-
 
996
         png_chunk_report(png_ptr, "gamma value does not match sRGB",
-
 
997
            PNG_CHUNK_ERROR);
-
 
998
         /* Do not overwrite an sRGB value */
-
 
999
         return from == 2;
-
 
1000
      }
-
 
1001
 
-
 
1002
      else /* sRGB tag not involved */
-
 
1003
      {
-
 
1004
         png_chunk_report(png_ptr, "gamma value does not match libpng estimate",
-
 
1005
            PNG_CHUNK_WARNING);
-
 
1006
         return from == 1;
-
 
1007
      }
-
 
1008
   }
-
 
1009
 
-
 
1010
   return 1;
-
 
1011
}
-
 
1012
 
-
 
1013
void /* PRIVATE */
-
 
1014
png_colorspace_set_gamma(png_const_structrp png_ptr,
-
 
1015
   png_colorspacerp colorspace, png_fixed_point gAMA)
-
 
1016
{
-
 
1017
   /* Changed in libpng-1.5.4 to limit the values to ensure overflow can't
-
 
1018
    * occur.  Since the fixed point representation is assymetrical it is
-
 
1019
    * possible for 1/gamma to overflow the limit of 21474 and this means the
-
 
1020
    * gamma value must be at least 5/100000 and hence at most 20000.0.  For
-
 
1021
    * safety the limits here are a little narrower.  The values are 0.00016 to
-
 
1022
    * 6250.0, which are truly ridiculous gamma values (and will produce
-
 
1023
    * displays that are all black or all white.)
-
 
1024
    *
-
 
1025
    * In 1.6.0 this test replaces the ones in pngrutil.c, in the gAMA chunk
-
 
1026
    * handling code, which only required the value to be >0.
-
 
1027
    */
-
 
1028
   png_const_charp errmsg;
663
}
1029
 
-
 
1030
   if (gAMA < 16 || gAMA > 625000000)
-
 
1031
      errmsg = "gamma value out of range";
-
 
1032
 
-
 
1033
#  ifdef PNG_READ_gAMA_SUPPORTED
-
 
1034
      /* Allow the application to set the gamma value more than once */
-
 
1035
      else if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0 &&
-
 
1036
         (colorspace->flags & PNG_COLORSPACE_FROM_gAMA) != 0)
-
 
1037
         errmsg = "duplicate";
-
 
1038
#  endif
-
 
1039
 
-
 
1040
   /* Do nothing if the colorspace is already invalid */
-
 
1041
   else if (colorspace->flags & PNG_COLORSPACE_INVALID)
-
 
1042
      return;
-
 
1043
 
-
 
1044
   else
-
 
1045
   {
-
 
1046
      if (png_colorspace_check_gamma(png_ptr, colorspace, gAMA, 1/*from gAMA*/))
-
 
1047
      {
-
 
1048
         /* Store this gamma value. */
-
 
1049
         colorspace->gamma = gAMA;
-
 
1050
         colorspace->flags |=
-
 
1051
            (PNG_COLORSPACE_HAVE_GAMMA | PNG_COLORSPACE_FROM_gAMA);
-
 
1052
      }
-
 
1053
 
-
 
1054
      /* At present if the check_gamma test fails the gamma of the colorspace is
-
 
1055
       * not updated however the colorspace is not invalidated.  This
-
 
1056
       * corresponds to the case where the existing gamma comes from an sRGB
-
 
1057
       * chunk or profile.  An error message has already been output.
-
 
1058
       */
-
 
1059
      return;
-
 
1060
   }
-
 
1061
 
-
 
1062
   /* Error exit - errmsg has been set. */
-
 
1063
   colorspace->flags |= PNG_COLORSPACE_INVALID;
-
 
1064
   png_chunk_report(png_ptr, errmsg, PNG_CHUNK_WRITE_ERROR);
-
 
1065
}
-
 
1066
 
-
 
1067
void /* PRIVATE */
-
 
1068
png_colorspace_sync_info(png_const_structrp png_ptr, png_inforp info_ptr)
-
 
1069
{
-
 
1070
   if (info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID)
-
 
1071
   {
-
 
1072
      /* Everything is invalid */
-
 
1073
      info_ptr->valid &= ~(PNG_INFO_gAMA|PNG_INFO_cHRM|PNG_INFO_sRGB|
-
 
1074
         PNG_INFO_iCCP);
-
 
1075
 
-
 
1076
#     ifdef PNG_COLORSPACE_SUPPORTED
-
 
1077
         /* Clean up the iCCP profile now if it won't be used. */
-
 
1078
         png_free_data(png_ptr, info_ptr, PNG_FREE_ICCP, -1/*not used*/);
-
 
1079
#     else
-
 
1080
         PNG_UNUSED(png_ptr)
-
 
1081
#     endif
-
 
1082
   }
-
 
1083
 
-
 
1084
   else
-
 
1085
   {
-
 
1086
#     ifdef PNG_COLORSPACE_SUPPORTED
-
 
1087
         /* Leave the INFO_iCCP flag set if the pngset.c code has already set
-
 
1088
          * it; this allows a PNG to contain a profile which matches sRGB and
-
 
1089
          * yet still have that profile retrievable by the application.
-
 
1090
          */
-
 
1091
         if (info_ptr->colorspace.flags & PNG_COLORSPACE_MATCHES_sRGB)
-
 
1092
            info_ptr->valid |= PNG_INFO_sRGB;
-
 
1093
 
-
 
1094
         else
-
 
1095
            info_ptr->valid &= ~PNG_INFO_sRGB;
-
 
1096
 
-
 
1097
         if (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS)
-
 
1098
            info_ptr->valid |= PNG_INFO_cHRM;
-
 
1099
 
-
 
1100
         else
-
 
1101
            info_ptr->valid &= ~PNG_INFO_cHRM;
-
 
1102
#     endif
-
 
1103
 
-
 
1104
      if (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_GAMMA)
-
 
1105
         info_ptr->valid |= PNG_INFO_gAMA;
-
 
1106
 
-
 
1107
      else
-
 
1108
         info_ptr->valid &= ~PNG_INFO_gAMA;
-
 
1109
   }
-
 
1110
}
-
 
1111
 
-
 
1112
#ifdef PNG_READ_SUPPORTED
-
 
1113
void /* PRIVATE */
-
 
1114
png_colorspace_sync(png_const_structrp png_ptr, png_inforp info_ptr)
-
 
1115
{
-
 
1116
   if (info_ptr == NULL) /* reduce code size; check here not in the caller */
-
 
1117
      return;
-
 
1118
 
-
 
1119
   info_ptr->colorspace = png_ptr->colorspace;
-
 
1120
   png_colorspace_sync_info(png_ptr, info_ptr);
-
 
1121
}
-
 
1122
#endif
-
 
1123
#endif
-
 
1124
 
-
 
1125
#ifdef PNG_COLORSPACE_SUPPORTED
-
 
1126
/* Added at libpng-1.5.5 to support read and write of true CIEXYZ values for
-
 
1127
 * cHRM, as opposed to using chromaticities.  These internal APIs return
-
 
1128
 * non-zero on a parameter error.  The X, Y and Z values are required to be
-
 
1129
 * positive and less than 1.0.
-
 
1130
 */
-
 
1131
static int
-
 
1132
png_xy_from_XYZ(png_xy *xy, const png_XYZ *XYZ)
-
 
1133
{
-
 
1134
   png_int_32 d, dwhite, whiteX, whiteY;
-
 
1135
 
-
 
1136
   d = XYZ->red_X + XYZ->red_Y + XYZ->red_Z;
-
 
1137
   if (!png_muldiv(&xy->redx, XYZ->red_X, PNG_FP_1, d)) return 1;
-
 
1138
   if (!png_muldiv(&xy->redy, XYZ->red_Y, PNG_FP_1, d)) return 1;
-
 
1139
   dwhite = d;
-
 
1140
   whiteX = XYZ->red_X;
-
 
1141
   whiteY = XYZ->red_Y;
-
 
1142
 
-
 
1143
   d = XYZ->green_X + XYZ->green_Y + XYZ->green_Z;
-
 
1144
   if (!png_muldiv(&xy->greenx, XYZ->green_X, PNG_FP_1, d)) return 1;
-
 
1145
   if (!png_muldiv(&xy->greeny, XYZ->green_Y, PNG_FP_1, d)) return 1;
-
 
1146
   dwhite += d;
-
 
1147
   whiteX += XYZ->green_X;
-
 
1148
   whiteY += XYZ->green_Y;
-
 
1149
 
-
 
1150
   d = XYZ->blue_X + XYZ->blue_Y + XYZ->blue_Z;
-
 
1151
   if (!png_muldiv(&xy->bluex, XYZ->blue_X, PNG_FP_1, d)) return 1;
-
 
1152
   if (!png_muldiv(&xy->bluey, XYZ->blue_Y, PNG_FP_1, d)) return 1;
-
 
1153
   dwhite += d;
-
 
1154
   whiteX += XYZ->blue_X;
-
 
1155
   whiteY += XYZ->blue_Y;
-
 
1156
 
-
 
1157
   /* The reference white is simply the sum of the end-point (X,Y,Z) vectors,
-
 
1158
    * thus:
-
 
1159
    */
-
 
1160
   if (!png_muldiv(&xy->whitex, whiteX, PNG_FP_1, dwhite)) return 1;
-
 
1161
   if (!png_muldiv(&xy->whitey, whiteY, PNG_FP_1, dwhite)) return 1;
-
 
1162
 
-
 
1163
   return 0;
-
 
1164
}
-
 
1165
 
-
 
1166
static int
-
 
1167
png_XYZ_from_xy(png_XYZ *XYZ, const png_xy *xy)
-
 
1168
{
-
 
1169
   png_fixed_point red_inverse, green_inverse, blue_scale;
-
 
1170
   png_fixed_point left, right, denominator;
-
 
1171
 
-
 
1172
   /* Check xy and, implicitly, z.  Note that wide gamut color spaces typically
-
 
1173
    * have end points with 0 tristimulus values (these are impossible end
-
 
1174
    * points, but they are used to cover the possible colors.)
-
 
1175
    */
-
 
1176
   if (xy->redx < 0 || xy->redx > PNG_FP_1) return 1;
-
 
1177
   if (xy->redy < 0 || xy->redy > PNG_FP_1-xy->redx) return 1;
-
 
1178
   if (xy->greenx < 0 || xy->greenx > PNG_FP_1) return 1;
-
 
1179
   if (xy->greeny < 0 || xy->greeny > PNG_FP_1-xy->greenx) return 1;
-
 
1180
   if (xy->bluex < 0 || xy->bluex > PNG_FP_1) return 1;
-
 
1181
   if (xy->bluey < 0 || xy->bluey > PNG_FP_1-xy->bluex) return 1;
-
 
1182
   if (xy->whitex < 0 || xy->whitex > PNG_FP_1) return 1;
-
 
1183
   if (xy->whitey < 0 || xy->whitey > PNG_FP_1-xy->whitex) return 1;
-
 
1184
 
-
 
1185
   /* The reverse calculation is more difficult because the original tristimulus
-
 
1186
    * value had 9 independent values (red,green,blue)x(X,Y,Z) however only 8
-
 
1187
    * derived values were recorded in the cHRM chunk;
-
 
1188
    * (red,green,blue,white)x(x,y).  This loses one degree of freedom and
-
 
1189
    * therefore an arbitrary ninth value has to be introduced to undo the
-
 
1190
    * original transformations.
-
 
1191
    *
-
 
1192
    * Think of the original end-points as points in (X,Y,Z) space.  The
-
 
1193
    * chromaticity values (c) have the property:
-
 
1194
    *
-
 
1195
    *           C
-
 
1196
    *   c = ---------
-
 
1197
    *       X + Y + Z
-
 
1198
    *
-
 
1199
    * For each c (x,y,z) from the corresponding original C (X,Y,Z).  Thus the
-
 
1200
    * three chromaticity values (x,y,z) for each end-point obey the
-
 
1201
    * relationship:
-
 
1202
    *
-
 
1203
    *   x + y + z = 1
-
 
1204
    *
-
 
1205
    * This describes the plane in (X,Y,Z) space that intersects each axis at the
-
 
1206
    * value 1.0; call this the chromaticity plane.  Thus the chromaticity
-
 
1207
    * calculation has scaled each end-point so that it is on the x+y+z=1 plane
-
 
1208
    * and chromaticity is the intersection of the vector from the origin to the
-
 
1209
    * (X,Y,Z) value with the chromaticity plane.
-
 
1210
    *
-
 
1211
    * To fully invert the chromaticity calculation we would need the three
-
 
1212
    * end-point scale factors, (red-scale, green-scale, blue-scale), but these
-
 
1213
    * were not recorded.  Instead we calculated the reference white (X,Y,Z) and
-
 
1214
    * recorded the chromaticity of this.  The reference white (X,Y,Z) would have
-
 
1215
    * given all three of the scale factors since:
-
 
1216
    *
-
 
1217
    *    color-C = color-c * color-scale
-
 
1218
    *    white-C = red-C + green-C + blue-C
-
 
1219
    *            = red-c*red-scale + green-c*green-scale + blue-c*blue-scale
-
 
1220
    *
-
 
1221
    * But cHRM records only white-x and white-y, so we have lost the white scale
-
 
1222
    * factor:
-
 
1223
    *
-
 
1224
    *    white-C = white-c*white-scale
-
 
1225
    *
-
 
1226
    * To handle this the inverse transformation makes an arbitrary assumption
-
 
1227
    * about white-scale:
-
 
1228
    *
-
 
1229
    *    Assume: white-Y = 1.0
-
 
1230
    *    Hence:  white-scale = 1/white-y
-
 
1231
    *    Or:     red-Y + green-Y + blue-Y = 1.0
-
 
1232
    *
-
 
1233
    * Notice the last statement of the assumption gives an equation in three of
-
 
1234
    * the nine values we want to calculate.  8 more equations come from the
-
 
1235
    * above routine as summarised at the top above (the chromaticity
-
 
1236
    * calculation):
-
 
1237
    *
-
 
1238
    *    Given: color-x = color-X / (color-X + color-Y + color-Z)
-
 
1239
    *    Hence: (color-x - 1)*color-X + color.x*color-Y + color.x*color-Z = 0
-
 
1240
    *
-
 
1241
    * This is 9 simultaneous equations in the 9 variables "color-C" and can be
-
 
1242
    * solved by Cramer's rule.  Cramer's rule requires calculating 10 9x9 matrix
-
 
1243
    * determinants, however this is not as bad as it seems because only 28 of
-
 
1244
    * the total of 90 terms in the various matrices are non-zero.  Nevertheless
-
 
1245
    * Cramer's rule is notoriously numerically unstable because the determinant
-
 
1246
    * calculation involves the difference of large, but similar, numbers.  It is
-
 
1247
    * difficult to be sure that the calculation is stable for real world values
-
 
1248
    * and it is certain that it becomes unstable where the end points are close
-
 
1249
    * together.
-
 
1250
    *
-
 
1251
    * So this code uses the perhaps slightly less optimal but more
-
 
1252
    * understandable and totally obvious approach of calculating color-scale.
-
 
1253
    *
-
 
1254
    * This algorithm depends on the precision in white-scale and that is
-
 
1255
    * (1/white-y), so we can immediately see that as white-y approaches 0 the
-
 
1256
    * accuracy inherent in the cHRM chunk drops off substantially.
-
 
1257
    *
-
 
1258
    * libpng arithmetic: a simple invertion of the above equations
-
 
1259
    * ------------------------------------------------------------
-
 
1260
    *
-
 
1261
    *    white_scale = 1/white-y
-
 
1262
    *    white-X = white-x * white-scale
-
 
1263
    *    white-Y = 1.0
-
 
1264
    *    white-Z = (1 - white-x - white-y) * white_scale
-
 
1265
    *
-
 
1266
    *    white-C = red-C + green-C + blue-C
-
 
1267
    *            = red-c*red-scale + green-c*green-scale + blue-c*blue-scale
-
 
1268
    *
-
 
1269
    * This gives us three equations in (red-scale,green-scale,blue-scale) where
-
 
1270
    * all the coefficients are now known:
-
 
1271
    *
-
 
1272
    *    red-x*red-scale + green-x*green-scale + blue-x*blue-scale
-
 
1273
    *       = white-x/white-y
-
 
1274
    *    red-y*red-scale + green-y*green-scale + blue-y*blue-scale = 1
-
 
1275
    *    red-z*red-scale + green-z*green-scale + blue-z*blue-scale
-
 
1276
    *       = (1 - white-x - white-y)/white-y
-
 
1277
    *
-
 
1278
    * In the last equation color-z is (1 - color-x - color-y) so we can add all
-
 
1279
    * three equations together to get an alternative third:
-
 
1280
    *
-
 
1281
    *    red-scale + green-scale + blue-scale = 1/white-y = white-scale
-
 
1282
    *
-
 
1283
    * So now we have a Cramer's rule solution where the determinants are just
-
 
1284
    * 3x3 - far more tractible.  Unfortunately 3x3 determinants still involve
-
 
1285
    * multiplication of three coefficients so we can't guarantee to avoid
-
 
1286
    * overflow in the libpng fixed point representation.  Using Cramer's rule in
-
 
1287
    * floating point is probably a good choice here, but it's not an option for
-
 
1288
    * fixed point.  Instead proceed to simplify the first two equations by
-
 
1289
    * eliminating what is likely to be the largest value, blue-scale:
-
 
1290
    *
-
 
1291
    *    blue-scale = white-scale - red-scale - green-scale
-
 
1292
    *
-
 
1293
    * Hence:
-
 
1294
    *
-
 
1295
    *    (red-x - blue-x)*red-scale + (green-x - blue-x)*green-scale =
-
 
1296
    *                (white-x - blue-x)*white-scale
-
 
1297
    *
-
 
1298
    *    (red-y - blue-y)*red-scale + (green-y - blue-y)*green-scale =
-
 
1299
    *                1 - blue-y*white-scale
-
 
1300
    *
-
 
1301
    * And now we can trivially solve for (red-scale,green-scale):
-
 
1302
    *
-
 
1303
    *    green-scale =
-
 
1304
    *                (white-x - blue-x)*white-scale - (red-x - blue-x)*red-scale
-
 
1305
    *                -----------------------------------------------------------
-
 
1306
    *                                  green-x - blue-x
-
 
1307
    *
-
 
1308
    *    red-scale =
-
 
1309
    *                1 - blue-y*white-scale - (green-y - blue-y) * green-scale
-
 
1310
    *                ---------------------------------------------------------
-
 
1311
    *                                  red-y - blue-y
-
 
1312
    *
-
 
1313
    * Hence:
-
 
1314
    *
-
 
1315
    *    red-scale =
-
 
1316
    *          ( (green-x - blue-x) * (white-y - blue-y) -
-
 
1317
    *            (green-y - blue-y) * (white-x - blue-x) ) / white-y
-
 
1318
    * -------------------------------------------------------------------------
-
 
1319
    *  (green-x - blue-x)*(red-y - blue-y)-(green-y - blue-y)*(red-x - blue-x)
-
 
1320
    *
-
 
1321
    *    green-scale =
-
 
1322
    *          ( (red-y - blue-y) * (white-x - blue-x) -
-
 
1323
    *            (red-x - blue-x) * (white-y - blue-y) ) / white-y
-
 
1324
    * -------------------------------------------------------------------------
-
 
1325
    *  (green-x - blue-x)*(red-y - blue-y)-(green-y - blue-y)*(red-x - blue-x)
-
 
1326
    *
-
 
1327
    * Accuracy:
-
 
1328
    * The input values have 5 decimal digits of accuracy.  The values are all in
-
 
1329
    * the range 0 < value < 1, so simple products are in the same range but may
-
 
1330
    * need up to 10 decimal digits to preserve the original precision and avoid
-
 
1331
    * underflow.  Because we are using a 32-bit signed representation we cannot
-
 
1332
    * match this; the best is a little over 9 decimal digits, less than 10.
-
 
1333
    *
-
 
1334
    * The approach used here is to preserve the maximum precision within the
-
 
1335
    * signed representation.  Because the red-scale calculation above uses the
-
 
1336
    * difference between two products of values that must be in the range -1..+1
-
 
1337
    * it is sufficient to divide the product by 7; ceil(100,000/32767*2).  The
-
 
1338
    * factor is irrelevant in the calculation because it is applied to both
-
 
1339
    * numerator and denominator.
-
 
1340
    *
-
 
1341
    * Note that the values of the differences of the products of the
-
 
1342
    * chromaticities in the above equations tend to be small, for example for
-
 
1343
    * the sRGB chromaticities they are:
-
 
1344
    *
-
 
1345
    * red numerator:    -0.04751
-
 
1346
    * green numerator:  -0.08788
-
 
1347
    * denominator:      -0.2241 (without white-y multiplication)
-
 
1348
    *
-
 
1349
    *  The resultant Y coefficients from the chromaticities of some widely used
-
 
1350
    *  color space definitions are (to 15 decimal places):
-
 
1351
    *
-
 
1352
    *  sRGB
-
 
1353
    *    0.212639005871510 0.715168678767756 0.072192315360734
-
 
1354
    *  Kodak ProPhoto
-
 
1355
    *    0.288071128229293 0.711843217810102 0.000085653960605
-
 
1356
    *  Adobe RGB
-
 
1357
    *    0.297344975250536 0.627363566255466 0.075291458493998
-
 
1358
    *  Adobe Wide Gamut RGB
-
 
1359
    *    0.258728243040113 0.724682314948566 0.016589442011321
-
 
1360
    */
-
 
1361
   /* By the argument, above overflow should be impossible here. The return
-
 
1362
    * value of 2 indicates an internal error to the caller.
-
 
1363
    */
-
 
1364
   if (!png_muldiv(&left, xy->greenx-xy->bluex, xy->redy - xy->bluey, 7))
-
 
1365
      return 2;
-
 
1366
   if (!png_muldiv(&right, xy->greeny-xy->bluey, xy->redx - xy->bluex, 7))
-
 
1367
      return 2;
-
 
1368
   denominator = left - right;
-
 
1369
 
-
 
1370
   /* Now find the red numerator. */
-
 
1371
   if (!png_muldiv(&left, xy->greenx-xy->bluex, xy->whitey-xy->bluey, 7))
-
 
1372
      return 2;
-
 
1373
   if (!png_muldiv(&right, xy->greeny-xy->bluey, xy->whitex-xy->bluex, 7))
-
 
1374
      return 2;
-
 
1375
 
-
 
1376
   /* Overflow is possible here and it indicates an extreme set of PNG cHRM
-
 
1377
    * chunk values.  This calculation actually returns the reciprocal of the
-
 
1378
    * scale value because this allows us to delay the multiplication of white-y
-
 
1379
    * into the denominator, which tends to produce a small number.
-
 
1380
    */
-
 
1381
   if (!png_muldiv(&red_inverse, xy->whitey, denominator, left-right) ||
-
 
1382
       red_inverse <= xy->whitey /* r+g+b scales = white scale */)
-
 
1383
      return 1;
-
 
1384
 
-
 
1385
   /* Similarly for green_inverse: */
-
 
1386
   if (!png_muldiv(&left, xy->redy-xy->bluey, xy->whitex-xy->bluex, 7))
-
 
1387
      return 2;
-
 
1388
   if (!png_muldiv(&right, xy->redx-xy->bluex, xy->whitey-xy->bluey, 7))
-
 
1389
      return 2;
-
 
1390
   if (!png_muldiv(&green_inverse, xy->whitey, denominator, left-right) ||
-
 
1391
       green_inverse <= xy->whitey)
-
 
1392
      return 1;
-
 
1393
 
-
 
1394
   /* And the blue scale, the checks above guarantee this can't overflow but it
-
 
1395
    * can still produce 0 for extreme cHRM values.
-
 
1396
    */
-
 
1397
   blue_scale = png_reciprocal(xy->whitey) - png_reciprocal(red_inverse) -
-
 
1398
      png_reciprocal(green_inverse);
-
 
1399
   if (blue_scale <= 0) return 1;
-
 
1400
 
-
 
1401
 
-
 
1402
   /* And fill in the png_XYZ: */
-
 
1403
   if (!png_muldiv(&XYZ->red_X, xy->redx, PNG_FP_1, red_inverse)) return 1;
-
 
1404
   if (!png_muldiv(&XYZ->red_Y, xy->redy, PNG_FP_1, red_inverse)) return 1;
-
 
1405
   if (!png_muldiv(&XYZ->red_Z, PNG_FP_1 - xy->redx - xy->redy, PNG_FP_1,
-
 
1406
      red_inverse))
-
 
1407
      return 1;
-
 
1408
 
-
 
1409
   if (!png_muldiv(&XYZ->green_X, xy->greenx, PNG_FP_1, green_inverse))
-
 
1410
      return 1;
-
 
1411
   if (!png_muldiv(&XYZ->green_Y, xy->greeny, PNG_FP_1, green_inverse))
-
 
1412
      return 1;
-
 
1413
   if (!png_muldiv(&XYZ->green_Z, PNG_FP_1 - xy->greenx - xy->greeny, PNG_FP_1,
-
 
1414
      green_inverse))
-
 
1415
      return 1;
-
 
1416
 
-
 
1417
   if (!png_muldiv(&XYZ->blue_X, xy->bluex, blue_scale, PNG_FP_1)) return 1;
-
 
1418
   if (!png_muldiv(&XYZ->blue_Y, xy->bluey, blue_scale, PNG_FP_1)) return 1;
-
 
1419
   if (!png_muldiv(&XYZ->blue_Z, PNG_FP_1 - xy->bluex - xy->bluey, blue_scale,
-
 
1420
      PNG_FP_1))
-
 
1421
      return 1;
-
 
1422
 
-
 
1423
   return 0; /*success*/
-
 
1424
}
-
 
1425
 
-
 
1426
static int
-
 
1427
png_XYZ_normalize(png_XYZ *XYZ)
-
 
1428
{
-
 
1429
   png_int_32 Y;
-
 
1430
 
-
 
1431
   if (XYZ->red_Y < 0 || XYZ->green_Y < 0 || XYZ->blue_Y < 0 ||
-
 
1432
      XYZ->red_X < 0 || XYZ->green_X < 0 || XYZ->blue_X < 0 ||
-
 
1433
      XYZ->red_Z < 0 || XYZ->green_Z < 0 || XYZ->blue_Z < 0)
-
 
1434
      return 1;
-
 
1435
 
-
 
1436
   /* Normalize by scaling so the sum of the end-point Y values is PNG_FP_1.
-
 
1437
    * IMPLEMENTATION NOTE: ANSI requires signed overflow not to occur, therefore
-
 
1438
    * relying on addition of two positive values producing a negative one is not
-
 
1439
    * safe.
-
 
1440
    */
-
 
1441
   Y = XYZ->red_Y;
-
 
1442
   if (0x7fffffff - Y < XYZ->green_X) return 1;
-
 
1443
   Y += XYZ->green_Y;
-
 
1444
   if (0x7fffffff - Y < XYZ->blue_X) return 1;
-
 
1445
   Y += XYZ->blue_Y;
-
 
1446
 
-
 
1447
   if (Y != PNG_FP_1)
-
 
1448
   {
-
 
1449
      if (!png_muldiv(&XYZ->red_X, XYZ->red_X, PNG_FP_1, Y)) return 1;
-
 
1450
      if (!png_muldiv(&XYZ->red_Y, XYZ->red_Y, PNG_FP_1, Y)) return 1;
-
 
1451
      if (!png_muldiv(&XYZ->red_Z, XYZ->red_Z, PNG_FP_1, Y)) return 1;
-
 
1452
 
-
 
1453
      if (!png_muldiv(&XYZ->green_X, XYZ->green_X, PNG_FP_1, Y)) return 1;
-
 
1454
      if (!png_muldiv(&XYZ->green_Y, XYZ->green_Y, PNG_FP_1, Y)) return 1;
-
 
1455
      if (!png_muldiv(&XYZ->green_Z, XYZ->green_Z, PNG_FP_1, Y)) return 1;
-
 
1456
 
-
 
1457
      if (!png_muldiv(&XYZ->blue_X, XYZ->blue_X, PNG_FP_1, Y)) return 1;
-
 
1458
      if (!png_muldiv(&XYZ->blue_Y, XYZ->blue_Y, PNG_FP_1, Y)) return 1;
-
 
1459
      if (!png_muldiv(&XYZ->blue_Z, XYZ->blue_Z, PNG_FP_1, Y)) return 1;
-
 
1460
   }
-
 
1461
 
-
 
1462
   return 0;
-
 
1463
}
-
 
1464
 
-
 
1465
static int
-
 
1466
png_colorspace_endpoints_match(const png_xy *xy1, const png_xy *xy2, int delta)
-
 
1467
{
-
 
1468
   /* Allow an error of +/-0.01 (absolute value) on each chromaticity */
-
 
1469
   return !(PNG_OUT_OF_RANGE(xy1->whitex, xy2->whitex,delta) ||
-
 
1470
      PNG_OUT_OF_RANGE(xy1->whitey, xy2->whitey,delta) ||
-
 
1471
      PNG_OUT_OF_RANGE(xy1->redx,   xy2->redx,  delta) ||
-
 
1472
      PNG_OUT_OF_RANGE(xy1->redy,   xy2->redy,  delta) ||
-
 
1473
      PNG_OUT_OF_RANGE(xy1->greenx, xy2->greenx,delta) ||
-
 
1474
      PNG_OUT_OF_RANGE(xy1->greeny, xy2->greeny,delta) ||
-
 
1475
      PNG_OUT_OF_RANGE(xy1->bluex,  xy2->bluex, delta) ||
-
 
1476
      PNG_OUT_OF_RANGE(xy1->bluey,  xy2->bluey, delta));
-
 
1477
}
-
 
1478
 
-
 
1479
/* Added in libpng-1.6.0, a different check for the validity of a set of cHRM
-
 
1480
 * chunk chromaticities.  Earlier checks used to simply look for the overflow
-
 
1481
 * condition (where the determinant of the matrix to solve for XYZ ends up zero
-
 
1482
 * because the chromaticity values are not all distinct.)  Despite this it is
-
 
1483
 * theoretically possible to produce chromaticities that are apparently valid
-
 
1484
 * but that rapidly degrade to invalid, potentially crashing, sets because of
-
 
1485
 * arithmetic inaccuracies when calculations are performed on them.  The new
-
 
1486
 * check is to round-trip xy -> XYZ -> xy and then check that the result is
-
 
1487
 * within a small percentage of the original.
-
 
1488
 */
-
 
1489
static int
-
 
1490
png_colorspace_check_xy(png_XYZ *XYZ, const png_xy *xy)
-
 
1491
{
-
 
1492
   int result;
-
 
1493
   png_xy xy_test;
-
 
1494
 
-
 
1495
   /* As a side-effect this routine also returns the XYZ endpoints. */
-
 
1496
   result = png_XYZ_from_xy(XYZ, xy);
-
 
1497
   if (result) return result;
-
 
1498
 
-
 
1499
   result = png_xy_from_XYZ(&xy_test, XYZ);
-
 
1500
   if (result) return result;
-
 
1501
 
-
 
1502
   if (png_colorspace_endpoints_match(xy, &xy_test,
-
 
1503
      5/*actually, the math is pretty accurate*/))
-
 
1504
      return 0;
-
 
1505
 
-
 
1506
   /* Too much slip */
-
 
1507
   return 1;
-
 
1508
}
-
 
1509
 
-
 
1510
/* This is the check going the other way.  The XYZ is modified to normalize it
-
 
1511
 * (another side-effect) and the xy chromaticities are returned.
-
 
1512
 */
-
 
1513
static int
-
 
1514
png_colorspace_check_XYZ(png_xy *xy, png_XYZ *XYZ)
-
 
1515
{
-
 
1516
   int result;
-
 
1517
   png_XYZ XYZtemp;
-
 
1518
 
-
 
1519
   result = png_XYZ_normalize(XYZ);
-
 
1520
   if (result) return result;
-
 
1521
 
-
 
1522
   result = png_xy_from_XYZ(xy, XYZ);
-
 
1523
   if (result) return result;
-
 
1524
 
-
 
1525
   XYZtemp = *XYZ;
-
 
1526
   return png_colorspace_check_xy(&XYZtemp, xy);
-
 
1527
}
-
 
1528
 
-
 
1529
/* Used to check for an endpoint match against sRGB */
-
 
1530
static const png_xy sRGB_xy = /* From ITU-R BT.709-3 */
-
 
1531
{
-
 
1532
   /* color      x       y */
-
 
1533
   /* red   */ 64000, 33000,
-
 
1534
   /* green */ 30000, 60000,
-
 
1535
   /* blue  */ 15000,  6000,
-
 
1536
   /* white */ 31270, 32900
-
 
1537
};
-
 
1538
 
-
 
1539
static int
-
 
1540
png_colorspace_set_xy_and_XYZ(png_const_structrp png_ptr,
-
 
1541
   png_colorspacerp colorspace, const png_xy *xy, const png_XYZ *XYZ,
-
 
1542
   int preferred)
-
 
1543
{
-
 
1544
   if (colorspace->flags & PNG_COLORSPACE_INVALID)
-
 
1545
      return 0;
-
 
1546
 
-
 
1547
   /* The consistency check is performed on the chromaticities; this factors out
-
 
1548
    * variations because of the normalization (or not) of the end point Y
-
 
1549
    * values.
-
 
1550
    */
-
 
1551
   if (preferred < 2 && (colorspace->flags & PNG_COLORSPACE_HAVE_ENDPOINTS))
-
 
1552
   {
-
 
1553
      /* The end points must be reasonably close to any we already have.  The
-
 
1554
       * following allows an error of up to +/-.001
-
 
1555
       */
-
 
1556
      if (!png_colorspace_endpoints_match(xy, &colorspace->end_points_xy, 100))
-
 
1557
      {
-
 
1558
         colorspace->flags |= PNG_COLORSPACE_INVALID;
-
 
1559
         png_benign_error(png_ptr, "inconsistent chromaticities");
-
 
1560
         return 0; /* failed */
-
 
1561
      }
-
 
1562
 
-
 
1563
      /* Only overwrite with preferred values */
-
 
1564
      if (!preferred)
-
 
1565
         return 1; /* ok, but no change */
-
 
1566
   }
-
 
1567
 
-
 
1568
   colorspace->end_points_xy = *xy;
-
 
1569
   colorspace->end_points_XYZ = *XYZ;
-
 
1570
   colorspace->flags |= PNG_COLORSPACE_HAVE_ENDPOINTS;
-
 
1571
 
-
 
1572
   /* The end points are normally quoted to two decimal digits, so allow +/-0.01
-
 
1573
    * on this test.
-
 
1574
    */
-
 
1575
   if (png_colorspace_endpoints_match(xy, &sRGB_xy, 1000))
-
 
1576
      colorspace->flags |= PNG_COLORSPACE_ENDPOINTS_MATCH_sRGB;
-
 
1577
 
-
 
1578
   else
-
 
1579
      colorspace->flags &= PNG_COLORSPACE_CANCEL(
Line 664... Line 1580...
664
#  endif /* PNG_SIZE_T */
1580
         PNG_COLORSPACE_ENDPOINTS_MATCH_sRGB);
665
 
1581
 
666
/* Added at libpng version 1.2.34 and 1.4.0 (moved from pngset.c) */
-
 
667
#  ifdef PNG_CHECK_cHRM_SUPPORTED
-
 
668
 
1582
   return 2; /* ok and changed */
669
int /* PRIVATE */
1583
}
-
 
1584
 
-
 
1585
int /* PRIVATE */
-
 
1586
png_colorspace_set_chromaticities(png_const_structrp png_ptr,
-
 
1587
   png_colorspacerp colorspace, const png_xy *xy, int preferred)
-
 
1588
{
670
png_check_cHRM_fixed(png_structp png_ptr,
1589
   /* We must check the end points to ensure they are reasonable - in the past
671
   png_fixed_point white_x, png_fixed_point white_y, png_fixed_point red_x,
1590
    * color management systems have crashed as a result of getting bogus
Line 672... Line 1591...
672
   png_fixed_point red_y, png_fixed_point green_x, png_fixed_point green_y,
1591
    * colorant values, while this isn't the fault of libpng it is the
-
 
1592
    * responsibility of libpng because PNG carries the bomb and libpng is in a
-
 
1593
    * position to protect against it.
-
 
1594
    */
-
 
1595
   png_XYZ XYZ;
Line -... Line 1596...
-
 
1596
 
-
 
1597
   switch (png_colorspace_check_xy(&XYZ, xy))
-
 
1598
   {
-
 
1599
      case 0: /* success */
-
 
1600
         return png_colorspace_set_xy_and_XYZ(png_ptr, colorspace, xy, &XYZ,
-
 
1601
            preferred);
-
 
1602
 
-
 
1603
      case 1:
-
 
1604
         /* We can't invert the chromaticities so we can't produce value XYZ
-
 
1605
          * values.  Likely as not a color management system will fail too.
-
 
1606
          */
-
 
1607
         colorspace->flags |= PNG_COLORSPACE_INVALID;
-
 
1608
         png_benign_error(png_ptr, "invalid chromaticities");
-
 
1609
         break;
-
 
1610
 
-
 
1611
      default:
-
 
1612
         /* libpng is broken; this should be a warning but if it happens we
-
 
1613
          * want error reports so for the moment it is an error.
-
 
1614
          */
-
 
1615
         colorspace->flags |= PNG_COLORSPACE_INVALID;
-
 
1616
         png_error(png_ptr, "internal error checking chromaticities");
-
 
1617
         break;
-
 
1618
   }
-
 
1619
 
-
 
1620
   return 0; /* failed */
-
 
1621
}
-
 
1622
 
-
 
1623
int /* PRIVATE */
-
 
1624
png_colorspace_set_endpoints(png_const_structrp png_ptr,
-
 
1625
   png_colorspacerp colorspace, const png_XYZ *XYZ_in, int preferred)
-
 
1626
{
-
 
1627
   png_XYZ XYZ = *XYZ_in;
-
 
1628
   png_xy xy;
-
 
1629
 
-
 
1630
   switch (png_colorspace_check_XYZ(&xy, &XYZ))
-
 
1631
   {
-
 
1632
      case 0:
-
 
1633
         return png_colorspace_set_xy_and_XYZ(png_ptr, colorspace, &xy, &XYZ,
-
 
1634
            preferred);
-
 
1635
 
-
 
1636
      case 1:
-
 
1637
         /* End points are invalid. */
-
 
1638
         colorspace->flags |= PNG_COLORSPACE_INVALID;
-
 
1639
         png_benign_error(png_ptr, "invalid end points");
-
 
1640
         break;
-
 
1641
 
-
 
1642
      default:
-
 
1643
         colorspace->flags |= PNG_COLORSPACE_INVALID;
-
 
1644
         png_error(png_ptr, "internal error checking chromaticities");
-
 
1645
         break;
-
 
1646
   }
-
 
1647
 
-
 
1648
   return 0; /* failed */
-
 
1649
}
-
 
1650
 
-
 
1651
#if defined(PNG_sRGB_SUPPORTED) || defined(PNG_iCCP_SUPPORTED)
-
 
1652
/* Error message generation */
-
 
1653
static char
-
 
1654
png_icc_tag_char(png_uint_32 byte)
-
 
1655
{
-
 
1656
   byte &= 0xff;
-
 
1657
   if (byte >= 32 && byte <= 126)
-
 
1658
      return (char)byte;
-
 
1659
   else
-
 
1660
      return '?';
-
 
1661
}
-
 
1662
 
-
 
1663
static void
-
 
1664
png_icc_tag_name(char *name, png_uint_32 tag)
-
 
1665
{
-
 
1666
   name[0] = '\'';
-
 
1667
   name[1] = png_icc_tag_char(tag >> 24);
-
 
1668
   name[2] = png_icc_tag_char(tag >> 16);
-
 
1669
   name[3] = png_icc_tag_char(tag >>  8);
-
 
1670
   name[4] = png_icc_tag_char(tag      );
-
 
1671
   name[5] = '\'';
-
 
1672
}
-
 
1673
 
-
 
1674
static int
-
 
1675
is_ICC_signature_char(png_alloc_size_t it)
-
 
1676
{
-
 
1677
   return it == 32 || (it >= 48 && it <= 57) || (it >= 65 && it <= 90) ||
-
 
1678
      (it >= 97 && it <= 122);
-
 
1679
}
-
 
1680
 
-
 
1681
static int is_ICC_signature(png_alloc_size_t it)
-
 
1682
{
-
 
1683
   return is_ICC_signature_char(it >> 24) /* checks all the top bits */ &&
-
 
1684
      is_ICC_signature_char((it >> 16) & 0xff) &&
-
 
1685
      is_ICC_signature_char((it >> 8) & 0xff) &&
-
 
1686
      is_ICC_signature_char(it & 0xff);
-
 
1687
}
-
 
1688
 
673
   png_fixed_point blue_x, png_fixed_point blue_y)
1689
static int
-
 
1690
png_icc_profile_error(png_const_structrp png_ptr, png_colorspacerp colorspace,
-
 
1691
   png_const_charp name, png_alloc_size_t value, png_const_charp reason)
-
 
1692
{
-
 
1693
   size_t pos;
-
 
1694
   char message[196]; /* see below for calculation */
-
 
1695
 
-
 
1696
   if (colorspace != NULL)
-
 
1697
      colorspace->flags |= PNG_COLORSPACE_INVALID;
-
 
1698
 
-
 
1699
   pos = png_safecat(message, (sizeof message), 0, "profile '"); /* 9 chars */
-
 
1700
   pos = png_safecat(message, pos+79, pos, name); /* Truncate to 79 chars */
-
 
1701
   pos = png_safecat(message, (sizeof message), pos, "': "); /* +2 = 90 */
-
 
1702
   if (is_ICC_signature(value))
-
 
1703
   {
-
 
1704
      /* So 'value' is at most 4 bytes and the following cast is safe */
-
 
1705
      png_icc_tag_name(message+pos, (png_uint_32)value);
-
 
1706
      pos += 6; /* total +8; less than the else clause */
-
 
1707
      message[pos++] = ':';
-
 
1708
      message[pos++] = ' ';
-
 
1709
   }
-
 
1710
#  ifdef PNG_WARNINGS_SUPPORTED
-
 
1711
   else
-
 
1712
      {
-
 
1713
         char number[PNG_NUMBER_BUFFER_SIZE]; /* +24 = 114*/
-
 
1714
 
-
 
1715
         pos = png_safecat(message, (sizeof message), pos,
-
 
1716
            png_format_number(number, number+(sizeof number),
-
 
1717
               PNG_NUMBER_FORMAT_x, value));
-
 
1718
         pos = png_safecat(message, (sizeof message), pos, "h: "); /*+2 = 116*/
-
 
1719
      }
-
 
1720
#  endif
-
 
1721
   /* The 'reason' is an arbitrary message, allow +79 maximum 195 */
-
 
1722
   pos = png_safecat(message, (sizeof message), pos, reason);
-
 
1723
 
-
 
1724
   /* This is recoverable, but make it unconditionally an app_error on write to
-
 
1725
    * avoid writing invalid ICC profiles into PNG files.  (I.e.  we handle them
-
 
1726
    * on read, with a warning, but on write unless the app turns off
-
 
1727
    * application errors the PNG won't be written.)
-
 
1728
    */
-
 
1729
   png_chunk_report(png_ptr, message,
-
 
1730
      (colorspace != NULL) ? PNG_CHUNK_ERROR : PNG_CHUNK_WRITE_ERROR);
-
 
1731
 
-
 
1732
   return 0;
-
 
1733
}
-
 
1734
#endif /* sRGB || iCCP */
-
 
1735
 
-
 
1736
#ifdef PNG_sRGB_SUPPORTED
-
 
1737
int /* PRIVATE */
-
 
1738
png_colorspace_set_sRGB(png_const_structrp png_ptr, png_colorspacerp colorspace,
-
 
1739
   int intent)
-
 
1740
{
-
 
1741
   /* sRGB sets known gamma, end points and (from the chunk) intent. */
-
 
1742
   /* IMPORTANT: these are not necessarily the values found in an ICC profile
-
 
1743
    * because ICC profiles store values adapted to a D50 environment; it is
-
 
1744
    * expected that the ICC profile mediaWhitePointTag will be D50, see the
-
 
1745
    * checks and code elsewhere to understand this better.
-
 
1746
    *
-
 
1747
    * These XYZ values, which are accurate to 5dp, produce rgb to gray
-
 
1748
    * coefficients of (6968,23435,2366), which are reduced (because they add up
-
 
1749
    * to 32769 not 32768) to (6968,23434,2366).  These are the values that
-
 
1750
    * libpng has traditionally used (and are the best values given the 15bit
-
 
1751
    * algorithm used by the rgb to gray code.)
-
 
1752
    */
-
 
1753
   static const png_XYZ sRGB_XYZ = /* D65 XYZ (*not* the D50 adapted values!) */
-
 
1754
   {
-
 
1755
      /* color      X      Y      Z */
674
{
1756
      /* red   */ 41239, 21264,  1933,
Line -... Line 1757...
-
 
1757
      /* green */ 35758, 71517, 11919,
-
 
1758
      /* blue  */ 18048,  7219, 95053
-
 
1759
   };
-
 
1760
 
-
 
1761
   /* Do nothing if the colorspace is already invalidated. */
-
 
1762
   if (colorspace->flags & PNG_COLORSPACE_INVALID)
-
 
1763
      return 0;
-
 
1764
 
-
 
1765
   /* Check the intent, then check for existing settings.  It is valid for the
675
   int ret = 1;
1766
    * PNG file to have cHRM or gAMA chunks along with sRGB, but the values must
-
 
1767
    * be consistent with the correct values.  If, however, this function is
676
   unsigned long xy_hi,xy_lo,yx_hi,yx_lo;
1768
    * called below because an iCCP chunk matches sRGB then it is quite
-
 
1769
    * conceivable that an older app recorded incorrect gAMA and cHRM because of
-
 
1770
    * an incorrect calculation based on the values in the profile - this does
677
 
1771
    * *not* invalidate the profile (though it still produces an error, which can
-
 
1772
    * be ignored.)
678
   png_debug(1, "in function png_check_cHRM_fixed");
1773
    */
-
 
1774
   if (intent < 0 || intent >= PNG_sRGB_INTENT_LAST)
-
 
1775
      return png_icc_profile_error(png_ptr, colorspace, "sRGB",
679
 
1776
         (unsigned)intent, "invalid sRGB rendering intent");
-
 
1777
 
680
   if (png_ptr == NULL)
1778
   if ((colorspace->flags & PNG_COLORSPACE_HAVE_INTENT) != 0 &&
-
 
1779
      colorspace->rendering_intent != intent)
-
 
1780
      return png_icc_profile_error(png_ptr, colorspace, "sRGB",
-
 
1781
         (unsigned)intent, "inconsistent rendering intents");
681
      return 0;
1782
 
-
 
1783
   if ((colorspace->flags & PNG_COLORSPACE_FROM_sRGB) != 0)
-
 
1784
   {
-
 
1785
      png_benign_error(png_ptr, "duplicate sRGB information ignored");
682
 
1786
      return 0;
-
 
1787
   }
-
 
1788
 
-
 
1789
   /* If the standard sRGB cHRM chunk does not match the one from the PNG file
-
 
1790
    * warn but overwrite the value with the correct one.
-
 
1791
    */
-
 
1792
   if ((colorspace->flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0 &&
-
 
1793
      !png_colorspace_endpoints_match(&sRGB_xy, &colorspace->end_points_xy,
-
 
1794
         100))
-
 
1795
      png_chunk_report(png_ptr, "cHRM chunk does not match sRGB",
-
 
1796
         PNG_CHUNK_ERROR);
-
 
1797
 
-
 
1798
   /* This check is just done for the error reporting - the routine always
-
 
1799
    * returns true when the 'from' argument corresponds to sRGB (2).
-
 
1800
    */
-
 
1801
   (void)png_colorspace_check_gamma(png_ptr, colorspace, PNG_GAMMA_sRGB_INVERSE,
-
 
1802
      2/*from sRGB*/);
-
 
1803
 
-
 
1804
   /* intent: bugs in GCC force 'int' to be used as the parameter type. */
-
 
1805
   colorspace->rendering_intent = (png_uint_16)intent;
-
 
1806
   colorspace->flags |= PNG_COLORSPACE_HAVE_INTENT;
-
 
1807
 
-
 
1808
   /* endpoints */
-
 
1809
   colorspace->end_points_xy = sRGB_xy;
-
 
1810
   colorspace->end_points_XYZ = sRGB_XYZ;
-
 
1811
   colorspace->flags |=
-
 
1812
      (PNG_COLORSPACE_HAVE_ENDPOINTS|PNG_COLORSPACE_ENDPOINTS_MATCH_sRGB);
-
 
1813
 
-
 
1814
   /* gamma */
683
   if (white_x < 0 || white_y <= 0 ||
1815
   colorspace->gamma = PNG_GAMMA_sRGB_INVERSE;
-
 
1816
   colorspace->flags |= PNG_COLORSPACE_HAVE_GAMMA;
-
 
1817
 
684
         red_x < 0 ||   red_y <  0 ||
1818
   /* Finally record that we have an sRGB profile */
685
       green_x < 0 || green_y <  0 ||
1819
   colorspace->flags |=
686
        blue_x < 0 ||  blue_y <  0)
1820
      (PNG_COLORSPACE_MATCHES_sRGB|PNG_COLORSPACE_FROM_sRGB);
-
 
1821
 
687
   {
1822
   return 1; /* set */
-
 
1823
}
688
      png_warning(png_ptr,
1824
#endif /* sRGB */
689
        "Ignoring attempt to set negative chromaticity value");
1825
 
-
 
1826
#ifdef PNG_iCCP_SUPPORTED
-
 
1827
/* Encoded value of D50 as an ICC XYZNumber.  From the ICC 2010 spec the value
690
      ret = 0;
1828
 * is XYZ(0.9642,1.0,0.8249), which scales to:
691
   }
1829
 *
692
   if (white_x > (png_fixed_point)PNG_UINT_31_MAX ||
1830
 *    (63189.8112, 65536, 54060.6464)
693
       white_y > (png_fixed_point)PNG_UINT_31_MAX ||
1831
 */
694
         red_x > (png_fixed_point)PNG_UINT_31_MAX ||
1832
static const png_byte D50_nCIEXYZ[12] =
-
 
1833
   { 0x00, 0x00, 0xf6, 0xd6, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xd3, 0x2d };
-
 
1834
 
-
 
1835
int /* PRIVATE */
-
 
1836
png_icc_check_length(png_const_structrp png_ptr, png_colorspacerp colorspace,
-
 
1837
   png_const_charp name, png_uint_32 profile_length)
-
 
1838
{
695
         red_y > (png_fixed_point)PNG_UINT_31_MAX ||
1839
   if (profile_length < 132)
696
       green_x > (png_fixed_point)PNG_UINT_31_MAX ||
1840
      return png_icc_profile_error(png_ptr, colorspace, name, profile_length,
-
 
1841
         "too short");
-
 
1842
 
-
 
1843
   if (profile_length & 3)
-
 
1844
      return png_icc_profile_error(png_ptr, colorspace, name, profile_length,
-
 
1845
         "invalid length");
-
 
1846
 
-
 
1847
   return 1;
-
 
1848
}
-
 
1849
 
-
 
1850
int /* PRIVATE */
-
 
1851
png_icc_check_header(png_const_structrp png_ptr, png_colorspacerp colorspace,
-
 
1852
   png_const_charp name, png_uint_32 profile_length,
-
 
1853
   png_const_bytep profile/* first 132 bytes only */, int color_type)
-
 
1854
{
697
       green_y > (png_fixed_point)PNG_UINT_31_MAX ||
1855
   png_uint_32 temp;
-
 
1856
 
-
 
1857
   /* Length check; this cannot be ignored in this code because profile_length
-
 
1858
    * is used later to check the tag table, so even if the profile seems over
-
 
1859
    * long profile_length from the caller must be correct.  The caller can fix
-
 
1860
    * this up on read or write by just passing in the profile header length.
-
 
1861
    */
-
 
1862
   temp = png_get_uint_32(profile);
-
 
1863
   if (temp != profile_length)
-
 
1864
      return png_icc_profile_error(png_ptr, colorspace, name, temp,
-
 
1865
         "length does not match profile");
-
 
1866
 
-
 
1867
   temp = png_get_uint_32(profile+128); /* tag count: 12 bytes/tag */
-
 
1868
   if (temp > 357913930 || /* (2^32-4-132)/12: maximum possible tag count */
-
 
1869
      profile_length < 132+12*temp) /* truncated tag table */
-
 
1870
      return png_icc_profile_error(png_ptr, colorspace, name, temp,
-
 
1871
         "tag count too large");
-
 
1872
 
-
 
1873
   /* The 'intent' must be valid or we can't store it, ICC limits the intent to
-
 
1874
    * 16 bits.
-
 
1875
    */
-
 
1876
   temp = png_get_uint_32(profile+64);
-
 
1877
   if (temp >= 0xffff) /* The ICC limit */
-
 
1878
      return png_icc_profile_error(png_ptr, colorspace, name, temp,
-
 
1879
         "invalid rendering intent");
-
 
1880
 
-
 
1881
   /* This is just a warning because the profile may be valid in future
-
 
1882
    * versions.
-
 
1883
    */
-
 
1884
   if (temp >= PNG_sRGB_INTENT_LAST)
-
 
1885
      (void)png_icc_profile_error(png_ptr, NULL, name, temp,
-
 
1886
         "intent outside defined range");
-
 
1887
 
-
 
1888
   /* At this point the tag table can't be checked because it hasn't necessarily
-
 
1889
    * been loaded; however, various header fields can be checked.  These checks
-
 
1890
    * are for values permitted by the PNG spec in an ICC profile; the PNG spec
-
 
1891
    * restricts the profiles that can be passed in an iCCP chunk (they must be
-
 
1892
    * appropriate to processing PNG data!)
-
 
1893
    */
-
 
1894
 
-
 
1895
   /* Data checks (could be skipped).  These checks must be independent of the
-
 
1896
    * version number; however, the version number doesn't accomodate changes in
-
 
1897
    * the header fields (just the known tags and the interpretation of the
-
 
1898
    * data.)
-
 
1899
    */
-
 
1900
   temp = png_get_uint_32(profile+36); /* signature 'ascp' */
-
 
1901
   if (temp != 0x61637370)
-
 
1902
      return png_icc_profile_error(png_ptr, colorspace, name, temp,
-
 
1903
         "invalid signature");
-
 
1904
 
-
 
1905
   /* Currently the PCS illuminant/adopted white point (the computational
-
 
1906
    * white point) are required to be D50,
-
 
1907
    * however the profile contains a record of the illuminant so perhaps ICC
-
 
1908
    * expects to be able to change this in the future (despite the rationale in
-
 
1909
    * the introduction for using a fixed PCS adopted white.)  Consequently the
-
 
1910
    * following is just a warning.
-
 
1911
    */
-
 
1912
   if (memcmp(profile+68, D50_nCIEXYZ, 12) != 0)
-
 
1913
      (void)png_icc_profile_error(png_ptr, NULL, name, 0/*no tag value*/,
-
 
1914
         "PCS illuminant is not D50");
-
 
1915
 
-
 
1916
   /* The PNG spec requires this:
-
 
1917
    * "If the iCCP chunk is present, the image samples conform to the colour
-
 
1918
    * space represented by the embedded ICC profile as defined by the
-
 
1919
    * International Color Consortium [ICC]. The colour space of the ICC profile
-
 
1920
    * shall be an RGB colour space for colour images (PNG colour types 2, 3, and
-
 
1921
    * 6), or a greyscale colour space for greyscale images (PNG colour types 0
-
 
1922
    * and 4)."
-
 
1923
    *
-
 
1924
    * This checking code ensures the embedded profile (on either read or write)
-
 
1925
    * conforms to the specification requirements.  Notice that an ICC 'gray'
-
 
1926
    * color-space profile contains the information to transform the monochrome
-
 
1927
    * data to XYZ or L*a*b (according to which PCS the profile uses) and this
-
 
1928
    * should be used in preference to the standard libpng K channel replication
-
 
1929
    * into R, G and B channels.
-
 
1930
    *
-
 
1931
    * Previously it was suggested that an RGB profile on grayscale data could be
-
 
1932
    * handled.  However it it is clear that using an RGB profile in this context
-
 
1933
    * must be an error - there is no specification of what it means.  Thus it is
-
 
1934
    * almost certainly more correct to ignore the profile.
-
 
1935
    */
-
 
1936
   temp = png_get_uint_32(profile+16); /* data colour space field */
-
 
1937
   switch (temp)
-
 
1938
   {
-
 
1939
      case 0x52474220: /* 'RGB ' */
-
 
1940
         if (!(color_type & PNG_COLOR_MASK_COLOR))
-
 
1941
            return png_icc_profile_error(png_ptr, colorspace, name, temp,
-
 
1942
               "RGB color space not permitted on grayscale PNG");
-
 
1943
         break;
-
 
1944
 
-
 
1945
      case 0x47524159: /* 'GRAY' */
-
 
1946
         if (color_type & PNG_COLOR_MASK_COLOR)
-
 
1947
            return png_icc_profile_error(png_ptr, colorspace, name, temp,
-
 
1948
               "Gray color space not permitted on RGB PNG");
-
 
1949
         break;
-
 
1950
 
-
 
1951
      default:
-
 
1952
         return png_icc_profile_error(png_ptr, colorspace, name, temp,
-
 
1953
            "invalid ICC profile color space");
-
 
1954
   }
-
 
1955
 
-
 
1956
   /* It is up to the application to check that the profile class matches the
-
 
1957
    * application requirements; the spec provides no guidance, but it's pretty
-
 
1958
    * weird if the profile is not scanner ('scnr'), monitor ('mntr'), printer
-
 
1959
    * ('prtr') or 'spac' (for generic color spaces).  Issue a warning in these
-
 
1960
    * cases.  Issue an error for device link or abstract profiles - these don't
-
 
1961
    * contain the records necessary to transform the color-space to anything
-
 
1962
    * other than the target device (and not even that for an abstract profile).
-
 
1963
    * Profiles of these classes may not be embedded in images.
-
 
1964
    */
-
 
1965
   temp = png_get_uint_32(profile+12); /* profile/device class */
-
 
1966
   switch (temp)
-
 
1967
   {
-
 
1968
      case 0x73636E72: /* 'scnr' */
-
 
1969
      case 0x6D6E7472: /* 'mntr' */
-
 
1970
      case 0x70727472: /* 'prtr' */
-
 
1971
      case 0x73706163: /* 'spac' */
-
 
1972
         /* All supported */
-
 
1973
         break;
-
 
1974
 
-
 
1975
      case 0x61627374: /* 'abst' */
-
 
1976
         /* May not be embedded in an image */
-
 
1977
         return png_icc_profile_error(png_ptr, colorspace, name, temp,
-
 
1978
            "invalid embedded Abstract ICC profile");
-
 
1979
 
-
 
1980
      case 0x6C696E6B: /* 'link' */
-
 
1981
         /* DeviceLink profiles cannnot be interpreted in a non-device specific
-
 
1982
          * fashion, if an app uses the AToB0Tag in the profile the results are
-
 
1983
          * undefined unless the result is sent to the intended device,
-
 
1984
          * therefore a DeviceLink profile should not be found embedded in a
-
 
1985
          * PNG.
-
 
1986
          */
-
 
1987
         return png_icc_profile_error(png_ptr, colorspace, name, temp,
-
 
1988
            "unexpected DeviceLink ICC profile class");
-
 
1989
 
-
 
1990
      case 0x6E6D636C: /* 'nmcl' */
-
 
1991
         /* A NamedColor profile is also device specific, however it doesn't
-
 
1992
          * contain an AToB0 tag that is open to misintrepretation.  Almost
-
 
1993
          * certainly it will fail the tests below.
-
 
1994
          */
-
 
1995
         (void)png_icc_profile_error(png_ptr, NULL, name, temp,
-
 
1996
            "unexpected NamedColor ICC profile class");
-
 
1997
         break;
-
 
1998
 
-
 
1999
      default:
-
 
2000
         /* To allow for future enhancements to the profile accept unrecognized
-
 
2001
          * profile classes with a warning, these then hit the test below on the
-
 
2002
          * tag content to ensure they are backward compatible with one of the
-
 
2003
          * understood profiles.
-
 
2004
          */
-
 
2005
         (void)png_icc_profile_error(png_ptr, NULL, name, temp,
-
 
2006
            "unrecognized ICC profile class");
698
        blue_x > (png_fixed_point)PNG_UINT_31_MAX ||
2007
         break;
-
 
2008
   }
699
        blue_y > (png_fixed_point)PNG_UINT_31_MAX )
2009
 
-
 
2010
   /* For any profile other than a device link one the PCS must be encoded
-
 
2011
    * either in XYZ or Lab.
700
   {
2012
    */
-
 
2013
   temp = png_get_uint_32(profile+20);
-
 
2014
   switch (temp)
701
      png_warning(png_ptr,
2015
   {
Line -... Line 2016...
-
 
2016
      case 0x58595A20: /* 'XYZ ' */
-
 
2017
      case 0x4C616220: /* 'Lab ' */
-
 
2018
         break;
-
 
2019
 
-
 
2020
      default:
-
 
2021
         return png_icc_profile_error(png_ptr, colorspace, name, temp,
-
 
2022
            "unexpected ICC PCS encoding");
-
 
2023
   }
-
 
2024
 
-
 
2025
   return 1;
-
 
2026
}
-
 
2027
 
-
 
2028
int /* PRIVATE */
702
        "Ignoring attempt to set chromaticity value exceeding 21474.83");
2029
png_icc_check_tag_table(png_const_structrp png_ptr, png_colorspacerp colorspace,
-
 
2030
   png_const_charp name, png_uint_32 profile_length,
-
 
2031
   png_const_bytep profile /* header plus whole tag table */)
-
 
2032
{
-
 
2033
   png_uint_32 tag_count = png_get_uint_32(profile+128);
-
 
2034
   png_uint_32 itag;
-
 
2035
   png_const_bytep tag = profile+132; /* The first tag */
-
 
2036
 
-
 
2037
   /* First scan all the tags in the table and add bits to the icc_info value
-
 
2038
    * (temporarily in 'tags').
-
 
2039
    */
-
 
2040
   for (itag=0; itag < tag_count; ++itag, tag += 12)
-
 
2041
   {
-
 
2042
      png_uint_32 tag_id = png_get_uint_32(tag+0);
-
 
2043
      png_uint_32 tag_start = png_get_uint_32(tag+4); /* must be aligned */
703
      ret = 0;
2044
      png_uint_32 tag_length = png_get_uint_32(tag+8);/* not padded */
-
 
2045
 
704
   }
2046
      /* The ICC specification does not exclude zero length tags, therefore the
-
 
2047
       * start might actually be anywhere if there is no data, but this would be
705
   if (white_x > 100000L - white_y)
2048
       * a clear abuse of the intent of the standard so the start is checked for
-
 
2049
       * being in range.  All defined tag types have an 8 byte header - a 4 byte
-
 
2050
       * type signature then 0.
-
 
2051
       */
-
 
2052
      if ((tag_start & 3) != 0)
-
 
2053
      {
-
 
2054
         /* CNHP730S.icc shipped with Microsoft Windows 64 violates this, it is
-
 
2055
          * only a warning here because libpng does not care about the
-
 
2056
          * alignment.
-
 
2057
          */
-
 
2058
         (void)png_icc_profile_error(png_ptr, NULL, name, tag_id,
-
 
2059
            "ICC profile tag start not a multiple of 4");
-
 
2060
      }
-
 
2061
 
706
   {
2062
      /* This is a hard error; potentially it can cause read outside the
Line -... Line 2063...
-
 
2063
       * profile.
707
      png_warning(png_ptr, "Invalid cHRM white point");
2064
       */
-
 
2065
      if (tag_start > profile_length || tag_length > profile_length - tag_start)
708
      ret = 0;
2066
         return png_icc_profile_error(png_ptr, colorspace, name, tag_id,
-
 
2067
            "ICC profile tag outside profile");
-
 
2068
   }
-
 
2069
 
-
 
2070
   return 1; /* success, maybe with warnings */
-
 
2071
}
-
 
2072
 
-
 
2073
#ifdef PNG_sRGB_SUPPORTED
-
 
2074
/* Information about the known ICC sRGB profiles */
-
 
2075
static const struct
-
 
2076
{
-
 
2077
   png_uint_32 adler, crc, length;
-
 
2078
   png_uint_32 md5[4];
-
 
2079
   png_byte    have_md5;
-
 
2080
   png_byte    is_broken;
-
 
2081
   png_uint_16 intent;
-
 
2082
 
-
 
2083
#  define PNG_MD5(a,b,c,d) { a, b, c, d }, (a!=0)||(b!=0)||(c!=0)||(d!=0)
-
 
2084
#  define PNG_ICC_CHECKSUM(adler, crc, md5, intent, broke, date, length, fname)\
-
 
2085
      { adler, crc, length, md5, broke, intent },
-
 
2086
 
-
 
2087
} png_sRGB_checks[] =
-
 
2088
{
-
 
2089
   /* This data comes from contrib/tools/checksum-icc run on downloads of
-
 
2090
    * all four ICC sRGB profiles from www.color.org.
-
 
2091
    */
-
 
2092
   /* adler32, crc32, MD5[4], intent, date, length, file-name */
-
 
2093
   PNG_ICC_CHECKSUM(0x0a3fd9f6, 0x3b8772b9,
-
 
2094
      PNG_MD5(0x29f83dde, 0xaff255ae, 0x7842fae4, 0xca83390d), 0, 0,
-
 
2095
      "2009/03/27 21:36:31", 3048, "sRGB_IEC61966-2-1_black_scaled.icc")
-
 
2096
 
-
 
2097
   /* ICC sRGB v2 perceptual no black-compensation: */
-
 
2098
   PNG_ICC_CHECKSUM(0x4909e5e1, 0x427ebb21,
-
 
2099
      PNG_MD5(0xc95bd637, 0xe95d8a3b, 0x0df38f99, 0xc1320389), 1, 0,
-
 
2100
      "2009/03/27 21:37:45", 3052, "sRGB_IEC61966-2-1_no_black_scaling.icc")
-
 
2101
 
-
 
2102
   PNG_ICC_CHECKSUM(0xfd2144a1, 0x306fd8ae,
-
 
2103
      PNG_MD5(0xfc663378, 0x37e2886b, 0xfd72e983, 0x8228f1b8), 0, 0,
-
 
2104
      "2009/08/10 17:28:01", 60988, "sRGB_v4_ICC_preference_displayclass.icc")
-
 
2105
 
-
 
2106
   /* ICC sRGB v4 perceptual */
-
 
2107
   PNG_ICC_CHECKSUM(0x209c35d2, 0xbbef7812,
-
 
2108
      PNG_MD5(0x34562abf, 0x994ccd06, 0x6d2c5721, 0xd0d68c5d), 0, 0,
-
 
2109
      "2007/07/25 00:05:37", 60960, "sRGB_v4_ICC_preference.icc")
-
 
2110
 
-
 
2111
   /* The following profiles have no known MD5 checksum. If there is a match
-
 
2112
    * on the (empty) MD5 the other fields are used to attempt a match and
-
 
2113
    * a warning is produced.  The first two of these profiles have a 'cprt' tag
-
 
2114
    * which suggests that they were also made by Hewlett Packard.
-
 
2115
    */
-
 
2116
   PNG_ICC_CHECKSUM(0xa054d762, 0x5d5129ce,
-
 
2117
      PNG_MD5(0x00000000, 0x00000000, 0x00000000, 0x00000000), 1, 0,
-
 
2118
      "2004/07/21 18:57:42", 3024, "sRGB_IEC61966-2-1_noBPC.icc")
-
 
2119
 
-
 
2120
   /* This is a 'mntr' (display) profile with a mediaWhitePointTag that does not
-
 
2121
    * match the D50 PCS illuminant in the header (it is in fact the D65 values,
-
 
2122
    * so the white point is recorded as the un-adapted value.)  The profiles
-
 
2123
    * below only differ in one byte - the intent - and are basically the same as
-
 
2124
    * the previous profile except for the mediaWhitePointTag error and a missing
-
 
2125
    * chromaticAdaptationTag.
-
 
2126
    */
-
 
2127
   PNG_ICC_CHECKSUM(0xf784f3fb, 0x182ea552,
-
 
2128
      PNG_MD5(0x00000000, 0x00000000, 0x00000000, 0x00000000), 0, 1/*broken*/,
-
 
2129
      "1998/02/09 06:49:00", 3144, "HP-Microsoft sRGB v2 perceptual")
-
 
2130
 
-
 
2131
   PNG_ICC_CHECKSUM(0x0398f3fc, 0xf29e526d,
-
 
2132
      PNG_MD5(0x00000000, 0x00000000, 0x00000000, 0x00000000), 1, 1/*broken*/,
-
 
2133
      "1998/02/09 06:49:00", 3144, "HP-Microsoft sRGB v2 media-relative")
-
 
2134
};
-
 
2135
 
-
 
2136
static int
-
 
2137
png_compare_ICC_profile_with_sRGB(png_const_structrp png_ptr,
-
 
2138
   png_const_bytep profile, uLong adler)
-
 
2139
{
-
 
2140
   /* The quick check is to verify just the MD5 signature and trust the
-
 
2141
    * rest of the data.  Because the profile has already been verified for
-
 
2142
    * correctness this is safe.  png_colorspace_set_sRGB will check the 'intent'
-
 
2143
    * field too, so if the profile has been edited with an intent not defined
-
 
2144
    * by sRGB (but maybe defined by a later ICC specification) the read of
-
 
2145
    * the profile will fail at that point.
-
 
2146
    */
-
 
2147
   png_uint_32 length = 0;
-
 
2148
   png_uint_32 intent = 0x10000; /* invalid */
-
 
2149
#if PNG_sRGB_PROFILE_CHECKS > 1
-
 
2150
   uLong crc = 0; /* the value for 0 length data */
-
 
2151
#endif
-
 
2152
   unsigned int i;
709
   }
2153
 
710
 
2154
   for (i=0; i < (sizeof png_sRGB_checks) / (sizeof png_sRGB_checks[0]); ++i)
-
 
2155
   {
-
 
2156
      if (png_get_uint_32(profile+84) == png_sRGB_checks[i].md5[0] &&
-
 
2157
         png_get_uint_32(profile+88) == png_sRGB_checks[i].md5[1] &&
-
 
2158
         png_get_uint_32(profile+92) == png_sRGB_checks[i].md5[2] &&
-
 
2159
         png_get_uint_32(profile+96) == png_sRGB_checks[i].md5[3])
-
 
2160
      {
-
 
2161
         /* This may be one of the old HP profiles without an MD5, in that
-
 
2162
          * case we can only use the length and Adler32 (note that these
-
 
2163
          * are not used by default if there is an MD5!)
-
 
2164
          */
711
   if (red_x > 100000L - red_y)
2165
#        if PNG_sRGB_PROFILE_CHECKS == 0
Line -... Line 2166...
-
 
2166
            if (png_sRGB_checks[i].have_md5)
-
 
2167
               return 1+png_sRGB_checks[i].is_broken;
-
 
2168
#        endif
-
 
2169
 
-
 
2170
         /* Profile is unsigned or more checks have been configured in. */
712
   {
2171
         if (length == 0)
713
      png_warning(png_ptr, "Invalid cHRM red point");
2172
         {
714
      ret = 0;
2173
            length = png_get_uint_32(profile);
715
   }
2174
            intent = png_get_uint_32(profile+64);
716
 
2175
         }
Line -... Line 2176...
-
 
2176
 
-
 
2177
         /* Length *and* intent must match */
717
   if (green_x > 100000L - green_y)
2178
         if (length == png_sRGB_checks[i].length &&
718
   {
2179
            intent == png_sRGB_checks[i].intent)
-
 
2180
         {
-
 
2181
            /* Now calculate the adler32 if not done already. */
-
 
2182
            if (adler == 0)
-
 
2183
            {
-
 
2184
               adler = adler32(0, NULL, 0);
-
 
2185
               adler = adler32(adler, profile, length);
-
 
2186
            }
-
 
2187
 
Line -... Line 2188...
-
 
2188
            if (adler == png_sRGB_checks[i].adler)
-
 
2189
            {
719
      png_warning(png_ptr, "Invalid cHRM green point");
2190
               /* These basic checks suggest that the data has not been
-
 
2191
                * modified, but if the check level is more than 1 perform
720
      ret = 0;
2192
                * our own crc32 checksum on the data.
-
 
2193
                */
721
   }
2194
#              if PNG_sRGB_PROFILE_CHECKS > 1
-
 
2195
                  if (crc == 0)
722
 
2196
                  {
-
 
2197
                     crc = crc32(0, NULL, 0);
-
 
2198
                     crc = crc32(crc, profile, length);
723
   if (blue_x > 100000L - blue_y)
2199
                  }
-
 
2200
 
-
 
2201
                  /* So this check must pass for the 'return' below to happen.
724
   {
2202
                   */
Line -... Line 2203...
-
 
2203
                  if (crc == png_sRGB_checks[i].crc)
-
 
2204
#              endif
-
 
2205
               {
-
 
2206
                  if (png_sRGB_checks[i].is_broken)
-
 
2207
                  {
725
      png_warning(png_ptr, "Invalid cHRM blue point");
2208
                     /* These profiles are known to have bad data that may cause
-
 
2209
                      * problems if they are used, therefore attempt to
-
 
2210
                      * discourage their use, skip the 'have_md5' warning below,
-
 
2211
                      * which is made irrelevant by this error.
726
      ret = 0;
2212
                      */
727
   }
-
 
Line -... Line 2213...
-
 
2213
                     png_chunk_report(png_ptr, "known incorrect sRGB profile",
-
 
2214
                        PNG_CHUNK_ERROR);
-
 
2215
                  }
-
 
2216
 
-
 
2217
                  /* Warn that this being done; this isn't even an error since
-
 
2218
                   * the profile is perfectly valid, but it would be nice if
-
 
2219
                   * people used the up-to-date ones.
-
 
2220
                   */
-
 
2221
                  else if (!png_sRGB_checks[i].have_md5)
-
 
2222
                  {
-
 
2223
                     png_chunk_report(png_ptr,
-
 
2224
                        "out-of-date sRGB profile with no signature",
-
 
2225
                        PNG_CHUNK_WARNING);
-
 
2226
                  }
-
 
2227
 
-
 
2228
                  return 1+png_sRGB_checks[i].is_broken;
-
 
2229
               }
-
 
2230
            }
-
 
2231
         }
-
 
2232
 
-
 
2233
#        if PNG_sRGB_PROFILE_CHECKS > 0
-
 
2234
            /* The signature matched, but the profile had been changed in some
728
 
2235
             * way.  This is an apparent violation of the ICC terms of use and,
-
 
2236
             * anyway, probably indicates a data error or uninformed hacking.
-
 
2237
             */
-
 
2238
            if (png_sRGB_checks[i].have_md5)
-
 
2239
               png_benign_error(png_ptr,
-
 
2240
                  "copyright violation: edited ICC profile ignored");
-
 
2241
#        endif
-
 
2242
      }
-
 
2243
   }
-
 
2244
 
-
 
2245
   return 0; /* no match */
-
 
2246
}
-
 
2247
#endif
-
 
2248
 
-
 
2249
#ifdef PNG_sRGB_SUPPORTED
-
 
2250
void /* PRIVATE */
-
 
2251
png_icc_set_sRGB(png_const_structrp png_ptr,
-
 
2252
   png_colorspacerp colorspace, png_const_bytep profile, uLong adler)
-
 
2253
{
-
 
2254
   /* Is this profile one of the known ICC sRGB profiles?  If it is, just set
-
 
2255
    * the sRGB information.
-
 
2256
    */
-
 
2257
   if (png_compare_ICC_profile_with_sRGB(png_ptr, profile, adler))
-
 
2258
      (void)png_colorspace_set_sRGB(png_ptr, colorspace,
-
 
2259
         (int)/*already checked*/png_get_uint_32(profile+64));
-
 
2260
}
-
 
2261
#endif /* PNG_READ_sRGB_SUPPORTED */
-
 
2262
 
-
 
2263
int /* PRIVATE */
-
 
2264
png_colorspace_set_ICC(png_const_structrp png_ptr, png_colorspacerp colorspace,
-
 
2265
   png_const_charp name, png_uint_32 profile_length, png_const_bytep profile,
-
 
2266
   int color_type)
-
 
2267
{
-
 
2268
   if (colorspace->flags & PNG_COLORSPACE_INVALID)
-
 
2269
      return 0;
-
 
2270
 
-
 
2271
   if (png_icc_check_length(png_ptr, colorspace, name, profile_length) &&
-
 
2272
      png_icc_check_header(png_ptr, colorspace, name, profile_length, profile,
-
 
2273
         color_type) &&
-
 
2274
      png_icc_check_tag_table(png_ptr, colorspace, name, profile_length,
-
 
2275
         profile))
-
 
2276
   {
-
 
2277
#     ifdef PNG_sRGB_SUPPORTED
-
 
2278
         /* If no sRGB support, don't try storing sRGB information */
-
 
2279
         png_icc_set_sRGB(png_ptr, colorspace, profile, 0);
-
 
2280
#     endif
-
 
2281
      return 1;
-
 
2282
   }
-
 
2283
 
-
 
2284
   /* Failure case */
-
 
2285
   return 0;
-
 
2286
}
-
 
2287
#endif /* iCCP */
-
 
2288
 
-
 
2289
#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED
-
 
2290
void /* PRIVATE */
-
 
2291
png_colorspace_set_rgb_coefficients(png_structrp png_ptr)
-
 
2292
{
-
 
2293
   /* Set the rgb_to_gray coefficients from the colorspace. */
-
 
2294
   if (!png_ptr->rgb_to_gray_coefficients_set &&
-
 
2295
      (png_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0)
-
 
2296
   {
-
 
2297
      /* png_set_background has not been called, get the coefficients from the Y
-
 
2298
       * values of the colorspace colorants.
-
 
2299
       */
-
 
2300
      png_fixed_point r = png_ptr->colorspace.end_points_XYZ.red_Y;
-
 
2301
      png_fixed_point g = png_ptr->colorspace.end_points_XYZ.green_Y;
-
 
2302
      png_fixed_point b = png_ptr->colorspace.end_points_XYZ.blue_Y;
-
 
2303
      png_fixed_point total = r+g+b;
-
 
2304
 
-
 
2305
      if (total > 0 &&
-
 
2306
         r >= 0 && png_muldiv(&r, r, 32768, total) && r >= 0 && r <= 32768 &&
-
 
2307
         g >= 0 && png_muldiv(&g, g, 32768, total) && g >= 0 && g <= 32768 &&
-
 
2308
         b >= 0 && png_muldiv(&b, b, 32768, total) && b >= 0 && b <= 32768 &&
-
 
2309
         r+g+b <= 32769)
-
 
2310
      {
-
 
2311
         /* We allow 0 coefficients here.  r+g+b may be 32769 if two or
-
 
2312
          * all of the coefficients were rounded up.  Handle this by
-
 
2313
          * reducing the *largest* coefficient by 1; this matches the
-
 
2314
          * approach used for the default coefficients in pngrtran.c
-
 
2315
          */
-
 
2316
         int add = 0;
-
 
2317
 
-
 
2318
         if (r+g+b > 32768)
-
 
2319
            add = -1;
-
 
2320
         else if (r+g+b < 32768)
-
 
2321
            add = 1;
-
 
2322
 
-
 
2323
         if (add != 0)
-
 
2324
         {
-
 
2325
            if (g >= r && g >= b)
-
 
2326
               g += add;
-
 
2327
            else if (r >= g && r >= b)
-
 
2328
               r += add;
-
 
2329
            else
-
 
2330
               b += add;
-
 
2331
         }
-
 
2332
 
-
 
2333
         /* Check for an internal error. */
-
 
2334
         if (r+g+b != 32768)
-
 
2335
            png_error(png_ptr,
-
 
2336
               "internal error handling cHRM coefficients");
-
 
2337
 
-
 
2338
         else
-
 
2339
         {
-
 
2340
            png_ptr->rgb_to_gray_red_coeff   = (png_uint_16)r;
-
 
2341
            png_ptr->rgb_to_gray_green_coeff = (png_uint_16)g;
-
 
2342
         }
729
   png_64bit_product(green_x - red_x, blue_y - red_y, &xy_hi, &xy_lo);
2343
      }
730
   png_64bit_product(green_y - red_y, blue_x - red_x, &yx_hi, &yx_lo);
2344
 
731
 
2345
      /* This is a png_error at present even though it could be ignored -
732
   if (xy_hi == yx_hi && xy_lo == yx_lo)
2346
       * it should never happen, but it is important that if it does, the
733
   {
2347
       * bug is fixed.
734
      png_warning(png_ptr,
2348
       */
Line 761... Line 2375...
761
      error = 1;
2375
      error = 1;
762
   }
2376
   }
763
 
2377
 
Line 764... Line 2378...
764
#  ifdef PNG_SET_USER_LIMITS_SUPPORTED
2378
#  ifdef PNG_SET_USER_LIMITS_SUPPORTED
765
   if (width > png_ptr->user_width_max || width > PNG_USER_WIDTH_MAX)
2379
   if (width > png_ptr->user_width_max)
Line 766... Line 2380...
766
 
2380
 
767
#  else
2381
#  else
768
   if (width > PNG_USER_WIDTH_MAX)
2382
   if (width > PNG_USER_WIDTH_MAX)
769
#  endif
2383
#  endif
770
   {
2384
   {
771
      png_warning(png_ptr, "Image width exceeds user limit in IHDR");
2385
      png_warning(png_ptr, "Image width exceeds user limit in IHDR");
772
      error = 1;
2386
      error = 1;
Line 773... Line 2387...
773
   }
2387
   }
774
 
2388
 
775
#  ifdef PNG_SET_USER_LIMITS_SUPPORTED
2389
#  ifdef PNG_SET_USER_LIMITS_SUPPORTED
776
   if (height > png_ptr->user_height_max || height > PNG_USER_HEIGHT_MAX)
2390
   if (height > png_ptr->user_height_max)
777
#  else
2391
#  else
778
   if (height > PNG_USER_HEIGHT_MAX)
2392
   if (height > PNG_USER_HEIGHT_MAX)
779
#  endif
2393
#  endif
Line 887... Line 2501...
887
/* ASCII to fp functions */
2501
/* ASCII to fp functions */
888
/* Check an ASCII formated floating point value, see the more detailed
2502
/* Check an ASCII formated floating point value, see the more detailed
889
 * comments in pngpriv.h
2503
 * comments in pngpriv.h
890
 */
2504
 */
891
/* The following is used internally to preserve the 'valid' flag */
2505
/* The following is used internally to preserve the sticky flags */
892
#define png_fp_add(state, flags) ((state) |= (flags))
2506
#define png_fp_add(state, flags) ((state) |= (flags))
893
#define png_fp_set(state, value)\
2507
#define png_fp_set(state, value) ((state) = (value) | ((state) & PNG_FP_STICKY))
894
   ((state) = (value) | ((state) & PNG_FP_WAS_VALID))
-
 
895
 
2508
 
896
/* Internal type codes: bits above the base state! */
-
 
897
#define PNG_FP_SIGN   0  /* [+-] */
-
 
898
#define PNG_FP_DOT    4  /* . */
-
 
899
#define PNG_FP_DIGIT  8  /* [0123456789] */
-
 
900
#define PNG_FP_E     12  /* [Ee] */
-
 
901
 
-
 
Line 902... Line 2509...
902
int /* PRIVATE */
2509
int /* PRIVATE */
903
png_check_fp_number(png_const_charp string, png_size_t size, int *statep,
2510
png_check_fp_number(png_const_charp string, png_size_t size, int *statep,
904
   png_size_tp whereami)
2511
   png_size_tp whereami)
905
{
2512
{
Line 909... Line 2516...
909
   while (i < size)
2516
   while (i < size)
910
   {
2517
   {
911
      int type;
2518
      int type;
912
      /* First find the type of the next character */
2519
      /* First find the type of the next character */
-
 
2520
      switch (string[i])
913
      {
2521
      {
914
         char ch = string[i];
2522
      case 43:  type = PNG_FP_SAW_SIGN;                   break;
915
 
-
 
-
 
2523
      case 45:  type = PNG_FP_SAW_SIGN + PNG_FP_NEGATIVE; break;
916
         if (ch >= 48 && ch <= 57)
2524
      case 46:  type = PNG_FP_SAW_DOT;                    break;
917
            type = PNG_FP_DIGIT;
2525
      case 48:  type = PNG_FP_SAW_DIGIT;                  break;
918
 
-
 
919
         else switch (ch)
2526
      case 49: case 50: case 51: case 52:
920
         {
-
 
921
         case 43: case 45:  type = PNG_FP_SIGN;  break;
2527
      case 53: case 54: case 55: case 56:
922
         case 46:           type = PNG_FP_DOT;   break;
2528
      case 57:  type = PNG_FP_SAW_DIGIT + PNG_FP_NONZERO; break;
-
 
2529
      case 69:
923
         case 69: case 101: type = PNG_FP_E;     break;
2530
      case 101: type = PNG_FP_SAW_E;                      break;
924
         default:           goto PNG_FP_End;
2531
      default:  goto PNG_FP_End;
925
         }
2532
      }
926
      }
-
 
Line 927... Line 2533...
927
 
2533
 
928
      /* Now deal with this type according to the current
2534
      /* Now deal with this type according to the current
929
       * state, the type is arranged to not overlap the
2535
       * state, the type is arranged to not overlap the
930
       * bits of the PNG_FP_STATE.
2536
       * bits of the PNG_FP_STATE.
931
       */
2537
       */
932
      switch ((state & PNG_FP_STATE) + type)
2538
      switch ((state & PNG_FP_STATE) + (type & PNG_FP_SAW_ANY))
933
      {
2539
      {
934
      case PNG_FP_INTEGER + PNG_FP_SIGN:
2540
      case PNG_FP_INTEGER + PNG_FP_SAW_SIGN:
935
         if (state & PNG_FP_SAW_ANY)
2541
         if (state & PNG_FP_SAW_ANY)
Line 936... Line 2542...
936
            goto PNG_FP_End; /* not a part of the number */
2542
            goto PNG_FP_End; /* not a part of the number */
937
 
2543
 
Line 938... Line 2544...
938
         png_fp_add(state, PNG_FP_SAW_SIGN);
2544
         png_fp_add(state, type);
939
         break;
2545
         break;
940
 
2546
 
941
      case PNG_FP_INTEGER + PNG_FP_DOT:
2547
      case PNG_FP_INTEGER + PNG_FP_SAW_DOT:
Line 942... Line 2548...
942
         /* Ok as trailer, ok as lead of fraction. */
2548
         /* Ok as trailer, ok as lead of fraction. */
943
         if (state & PNG_FP_SAW_DOT) /* two dots */
2549
         if (state & PNG_FP_SAW_DOT) /* two dots */
Line 944... Line 2550...
944
            goto PNG_FP_End;
2550
            goto PNG_FP_End;
945
 
2551
 
Line 946... Line 2552...
946
         else if (state & PNG_FP_SAW_DIGIT) /* trailing dot? */
2552
         else if (state & PNG_FP_SAW_DIGIT) /* trailing dot? */
Line 947... Line 2553...
947
            png_fp_add(state, PNG_FP_SAW_DOT);
2553
            png_fp_add(state, type);
948
 
2554
 
949
         else
2555
         else
Line 950... Line 2556...
950
            png_fp_set(state, PNG_FP_FRACTION | PNG_FP_SAW_DOT);
2556
            png_fp_set(state, PNG_FP_FRACTION | type);
Line 951... Line 2557...
951
 
2557
 
-
 
2558
         break;
952
         break;
2559
 
953
 
2560
      case PNG_FP_INTEGER + PNG_FP_SAW_DIGIT:
954
      case PNG_FP_INTEGER + PNG_FP_DIGIT:
2561
         if (state & PNG_FP_SAW_DOT) /* delayed fraction */
Line 955... Line 2562...
955
         if (state & PNG_FP_SAW_DOT) /* delayed fraction */
2562
            png_fp_set(state, PNG_FP_FRACTION | PNG_FP_SAW_DOT);
Line 956... Line 2563...
956
            png_fp_set(state, PNG_FP_FRACTION | PNG_FP_SAW_DOT);
2563
 
Line 957... Line 2564...
957
 
2564
         png_fp_add(state, type | PNG_FP_WAS_VALID);
958
         png_fp_add(state, PNG_FP_SAW_DIGIT + PNG_FP_WAS_VALID);
2565
 
Line 959... Line 2566...
959
 
2566
         break;
960
         break;
2567
 
Line 961... Line 2568...
961
      case PNG_FP_INTEGER + PNG_FP_E:
2568
      case PNG_FP_INTEGER + PNG_FP_SAW_E:
962
         if ((state & PNG_FP_SAW_DIGIT) == 0)
2569
         if ((state & PNG_FP_SAW_DIGIT) == 0)
963
            goto PNG_FP_End;
2570
            goto PNG_FP_End;
Line 964... Line 2571...
964
 
2571
 
965
         png_fp_set(state, PNG_FP_EXPONENT);
2572
         png_fp_set(state, PNG_FP_EXPONENT);
966
 
2573
 
967
         break;
2574
         break;
968
 
2575
 
969
   /* case PNG_FP_FRACTION + PNG_FP_SIGN:
2576
   /* case PNG_FP_FRACTION + PNG_FP_SAW_SIGN:
Line 987... Line 2594...
987
         png_fp_set(state, PNG_FP_EXPONENT);
2594
         png_fp_set(state, PNG_FP_EXPONENT);
Line 988... Line 2595...
988
 
2595
 
Line 989... Line 2596...
989
         break;
2596
         break;
990
 
2597
 
991
      case PNG_FP_EXPONENT + PNG_FP_SIGN:
2598
      case PNG_FP_EXPONENT + PNG_FP_SAW_SIGN:
Line 992... Line 2599...
992
         if (state & PNG_FP_SAW_ANY)
2599
         if (state & PNG_FP_SAW_ANY)
Line 993... Line 2600...
993
            goto PNG_FP_End; /* not a part of the number */
2600
            goto PNG_FP_End; /* not a part of the number */
Line 994... Line 2601...
994
 
2601
 
995
         png_fp_add(state, PNG_FP_SAW_SIGN);
2602
         png_fp_add(state, PNG_FP_SAW_SIGN);
Line 996... Line 2603...
996
 
2603
 
997
         break;
2604
         break;
Line 998... Line 2605...
998
 
2605
 
Line 999... Line 2606...
999
   /* case PNG_FP_EXPONENT + PNG_FP_DOT:
2606
   /* case PNG_FP_EXPONENT + PNG_FP_SAW_DOT:
1000
         goto PNG_FP_End; */
2607
         goto PNG_FP_End; */
Line 1001... Line 2608...
1001
 
2608
 
1002
      case PNG_FP_EXPONENT + PNG_FP_DIGIT:
2609
      case PNG_FP_EXPONENT + PNG_FP_SAW_DIGIT:
Line 1031... Line 2638...
1031
{
2638
{
1032
   int        state=0;
2639
   int        state=0;
1033
   png_size_t char_index=0;
2640
   png_size_t char_index=0;
1034
 
2641
 
Line 1035... Line 2642...
1035
   return png_check_fp_number(string, size, &state, &char_index) &&
2642
   if (png_check_fp_number(string, size, &state, &char_index) &&
1036
      (char_index == size || string[char_index] == 0);
2643
      (char_index == size || string[char_index] == 0))
-
 
2644
      return state /* must be non-zero - see above */;
-
 
2645
 
-
 
2646
   return 0; /* i.e. fail */
1037
}
2647
}
1038
#endif /* pCAL or sCAL */
2648
#endif /* pCAL or sCAL */
Line 1039... Line 2649...
1039
 
2649
 
1040
#ifdef PNG_READ_sCAL_SUPPORTED
2650
#ifdef PNG_sCAL_SUPPORTED
1041
#  ifdef PNG_FLOATING_POINT_SUPPORTED
2651
#  ifdef PNG_FLOATING_POINT_SUPPORTED
1042
/* Utility used below - a simple accurate power of ten from an integral
2652
/* Utility used below - a simple accurate power of ten from an integral
1043
 * exponent.
2653
 * exponent.
1044
 */
2654
 */
Line 1079... Line 2689...
1079
/* Function to format a floating point value in ASCII with a given
2689
/* Function to format a floating point value in ASCII with a given
1080
 * precision.
2690
 * precision.
1081
 */
2691
 */
1082
void /* PRIVATE */
2692
void /* PRIVATE */
1083
png_ascii_from_fp(png_structp png_ptr, png_charp ascii, png_size_t size,
2693
png_ascii_from_fp(png_const_structrp png_ptr, png_charp ascii, png_size_t size,
1084
    double fp, unsigned int precision)
2694
    double fp, unsigned int precision)
1085
{
2695
{
1086
   /* We use standard functions from math.h, but not printf because
2696
   /* We use standard functions from math.h, but not printf because
1087
    * that would require stdio.  The caller must supply a buffer of
2697
    * that would require stdio.  The caller must supply a buffer of
1088
    * sufficient size or we will png_error.  The tests on size and
2698
    * sufficient size or we will png_error.  The tests on size and
Line 1328... Line 2938...
1328
             */
2938
             */
1329
            size -= cdigits;
2939
            size -= cdigits;
1330
 
2940
 
Line 1331... Line 2941...
1331
            *ascii++ = 69, --size;    /* 'E': PLUS 1 TOTAL 2+precision*/
2941
            *ascii++ = 69, --size;    /* 'E': PLUS 1 TOTAL 2+precision */
-
 
2942
 
-
 
2943
            /* The following use of an unsigned temporary avoids ambiguities in
-
 
2944
             * the signed arithmetic on exp_b10 and permits GCC at least to do
-
 
2945
             * better optimization.
-
 
2946
             */
-
 
2947
            {
-
 
2948
               unsigned int uexp_b10;
-
 
2949
 
1332
            if (exp_b10 < 0)
2950
               if (exp_b10 < 0)
1333
            {
2951
               {
1334
               *ascii++ = 45, --size; /* '-': PLUS 1 TOTAL 3+precision */
2952
                  *ascii++ = 45, --size; /* '-': PLUS 1 TOTAL 3+precision */
1335
               exp_b10 = -exp_b10;
2953
                  uexp_b10 = -exp_b10;
1336
            }
2954
               }
Line -... Line 2955...
-
 
2955
 
-
 
2956
               else
-
 
2957
                  uexp_b10 = exp_b10;
1337
 
2958
 
Line 1338... Line 2959...
1338
            cdigits = 0;
2959
               cdigits = 0;
1339
 
2960
 
1340
            while (exp_b10 > 0)
2961
               while (uexp_b10 > 0)
1341
            {
2962
               {
-
 
2963
                  exponent[cdigits++] = (char)(48 + uexp_b10 % 10);
1342
               exponent[cdigits++] = (char)(48 + exp_b10 % 10);
2964
                  uexp_b10 /= 10;
Line 1343... Line 2965...
1343
               exp_b10 /= 10;
2965
               }
1344
            }
2966
            }
1345
 
2967
 
Line 1381... Line 3003...
1381
#  ifdef PNG_FIXED_POINT_SUPPORTED
3003
#  ifdef PNG_FIXED_POINT_SUPPORTED
1382
/* Function to format a fixed point value in ASCII.
3004
/* Function to format a fixed point value in ASCII.
1383
 */
3005
 */
1384
void /* PRIVATE */
3006
void /* PRIVATE */
1385
png_ascii_from_fixed(png_structp png_ptr, png_charp ascii, png_size_t size,
3007
png_ascii_from_fixed(png_const_structrp png_ptr, png_charp ascii,
1386
    png_fixed_point fp)
3008
    png_size_t size, png_fixed_point fp)
1387
{
3009
{
1388
   /* Require space for 10 decimal digits, a decimal point, a minus sign and a
3010
   /* Require space for 10 decimal digits, a decimal point, a minus sign and a
1389
    * trailing \0, 13 characters:
3011
    * trailing \0, 13 characters:
1390
    */
3012
    */
1391
   if (size > 12)
3013
   if (size > 12)
Line 1397... Line 3019...
1397
         *ascii++ = 45, --size, num = -fp;
3019
         *ascii++ = 45, --size, num = -fp;
1398
      else
3020
      else
1399
         num = fp;
3021
         num = fp;
1400
 
3022
 
Line 1401... Line 3023...
1401
      if (num <= 0x80000000U) /* else overflowed */
3023
      if (num <= 0x80000000) /* else overflowed */
1402
      {
3024
      {
1403
         unsigned int ndigits = 0, first = 16/*flag value*/;
3025
         unsigned int ndigits = 0, first = 16 /* flag value */;
1404
         char digits[10];
3026
         char digits[10];
Line 1405... Line 3027...
1405
 
3027
 
Line 1452... Line 3074...
1452
#   endif /* FIXED_POINT */
3074
#   endif /* FIXED_POINT */
1453
#endif /* READ_SCAL */
3075
#endif /* READ_SCAL */
1454
 
3076
 
Line 1455... Line 3077...
1455
#if defined(PNG_FLOATING_POINT_SUPPORTED) && \
3077
#if defined(PNG_FLOATING_POINT_SUPPORTED) && \
1456
   !defined(PNG_FIXED_POINT_MACRO_SUPPORTED)
3078
   !defined(PNG_FIXED_POINT_MACRO_SUPPORTED) && \
-
 
3079
   (defined(PNG_gAMA_SUPPORTED) || defined(PNG_cHRM_SUPPORTED) || \
-
 
3080
   defined(PNG_sCAL_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) || \
-
 
3081
   defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)) || \
-
 
3082
   (defined(PNG_sCAL_SUPPORTED) && \
-
 
3083
   defined(PNG_FLOATING_ARITHMETIC_SUPPORTED))
1457
png_fixed_point
3084
png_fixed_point
1458
png_fixed(png_structp png_ptr, double fp, png_const_charp text)
3085
png_fixed(png_const_structrp png_ptr, double fp, png_const_charp text)
1459
{
3086
{
1460
   double r = floor(100000 * fp + .5);
3087
   double r = floor(100000 * fp + .5);
Line 1461... Line 3088...
1461
 
3088
 
1462
   if (r > 2147483647. || r < -2147483648.)
3089
   if (r > 2147483647. || r < -2147483648.)
Line 1466... Line 3093...
1466
}
3093
}
1467
#endif
3094
#endif
1468
 
3095
 
Line 1469... Line 3096...
1469
#if defined(PNG_READ_GAMMA_SUPPORTED) || \
3096
#if defined(PNG_READ_GAMMA_SUPPORTED) || \
1470
    defined(PNG_INCH_CONVERSIONS_SUPPORTED) || defined(PNG__READ_pHYs_SUPPORTED)
3097
    defined(PNG_INCH_CONVERSIONS_SUPPORTED) || defined(PNG_READ_pHYs_SUPPORTED)
1471
/* muldiv functions */
3098
/* muldiv functions */
1472
/* This API takes signed arguments and rounds the result to the nearest
3099
/* This API takes signed arguments and rounds the result to the nearest
1473
 * integer (or, for a fixed point number - the standard argument - to
3100
 * integer (or, for a fixed point number - the standard argument - to
1474
 * the nearest .00001).  Overflow and divide by zero are signalled in
3101
 * the nearest .00001).  Overflow and divide by zero are signalled in
1475
 * the result, a boolean - true on success, false on overflow.
3102
 * the result, a boolean - true on success, false on overflow.
Line 1493... Line 3120...
1493
         r *= times;
3120
         r *= times;
1494
         r /= divisor;
3121
         r /= divisor;
1495
         r = floor(r+.5);
3122
         r = floor(r+.5);
1496
 
3123
 
Line 1497... Line 3124...
1497
         /* A png_fixed_point is a 32 bit integer. */
3124
         /* A png_fixed_point is a 32-bit integer. */
1498
         if (r <= 2147483647. && r >= -2147483648.)
3125
         if (r <= 2147483647. && r >= -2147483648.)
1499
         {
3126
         {
1500
            *res = (png_fixed_point)r;
3127
            *res = (png_fixed_point)r;
1501
            return 1;
3128
            return 1;
1502
         }
3129
         }
Line 1538... Line 3165...
1538
            ++s32; /* carry */
3165
            ++s32; /* carry */
1539
 
3166
 
Line 1540... Line 3167...
1540
         if (s32 < D) /* else overflow */
3167
         if (s32 < D) /* else overflow */
1541
         {
3168
         {
1542
            /* s32.s00 is now the 64 bit product, do a standard
3169
            /* s32.s00 is now the 64-bit product, do a standard
1543
             * division, we know that s32 < D, so the maximum
3170
             * division, we know that s32 < D, so the maximum
1544
             * required shift is 31.
3171
             * required shift is 31.
1545
             */
3172
             */
1546
            int bitshift = 32;
3173
            int bitshift = 32;
1547
            png_fixed_point result = 0; /* NOTE: signed */
3174
            png_fixed_point result = 0; /* NOTE: signed */
Line 1593... Line 3220...
1593
/* The following is for when the caller doesn't much care about the
3220
/* The following is for when the caller doesn't much care about the
1594
 * result.
3221
 * result.
1595
 */
3222
 */
1596
png_fixed_point
3223
png_fixed_point
1597
png_muldiv_warn(png_structp png_ptr, png_fixed_point a, png_int_32 times,
3224
png_muldiv_warn(png_const_structrp png_ptr, png_fixed_point a, png_int_32 times,
1598
    png_int_32 divisor)
3225
    png_int_32 divisor)
1599
{
3226
{
1600
   png_fixed_point result;
3227
   png_fixed_point result;
1601
 
3228
 
Line 1602... Line 3229...
1602
   if (png_muldiv(&result, a, times, divisor))
3229
   if (png_muldiv(&result, a, times, divisor))
Line 1606... Line 3233...
1606
   return 0;
3233
   return 0;
1607
}
3234
}
1608
#endif
3235
#endif
1609
 
3236
 
Line 1610... Line 3237...
1610
#ifdef PNG_READ_GAMMA_SUPPORTED /* more fixed point functions for gammma */
3237
#ifdef PNG_GAMMA_SUPPORTED /* more fixed point functions for gamma */
1611
/* Calculate a reciprocal, return 0 on div-by-zero or overflow. */
3238
/* Calculate a reciprocal, return 0 on div-by-zero or overflow. */
1612
png_fixed_point
3239
png_fixed_point
1613
png_reciprocal(png_fixed_point a)
3240
png_reciprocal(png_fixed_point a)
1614
{
3241
{
1615
#ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED
3242
#ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED
Line 1626... Line 3253...
1626
 
3253
 
Line 1627... Line 3254...
1627
   return 0; /* error/overflow */
3254
   return 0; /* error/overflow */
1628
}
3255
}
Line -... Line 3256...
-
 
3256
 
-
 
3257
/* This is the shared test on whether a gamma value is 'significant' - whether
-
 
3258
 * it is worth doing gamma correction.
-
 
3259
 */
-
 
3260
int /* PRIVATE */
-
 
3261
png_gamma_significant(png_fixed_point gamma_val)
-
 
3262
{
-
 
3263
   return gamma_val < PNG_FP_1 - PNG_GAMMA_THRESHOLD_FIXED ||
-
 
3264
       gamma_val > PNG_FP_1 + PNG_GAMMA_THRESHOLD_FIXED;
-
 
3265
}
-
 
3266
#endif
-
 
3267
 
1629
 
3268
#ifdef PNG_READ_GAMMA_SUPPORTED
1630
/* A local convenience routine. */
3269
/* A local convenience routine. */
1631
static png_fixed_point
3270
static png_fixed_point
1632
png_product2(png_fixed_point a, png_fixed_point b)
3271
png_product2(png_fixed_point a, png_fixed_point b)
1633
{
3272
{
Line 1676... Line 3315...
1676
   return 0; /* overflow */
3315
   return 0; /* overflow */
1677
}
3316
}
1678
#endif /* READ_GAMMA */
3317
#endif /* READ_GAMMA */
Line 1679... Line -...
1679
 
-
 
1680
#ifdef PNG_CHECK_cHRM_SUPPORTED
-
 
1681
/* Added at libpng version 1.2.34 (Dec 8, 2008) and 1.4.0 (Jan 2,
-
 
1682
 * 2010: moved from pngset.c) */
-
 
1683
/*
-
 
1684
 *    Multiply two 32-bit numbers, V1 and V2, using 32-bit
-
 
1685
 *    arithmetic, to produce a 64 bit result in the HI/LO words.
-
 
1686
 *
-
 
1687
 *                  A B
-
 
1688
 *                x C D
-
 
1689
 *               ------
-
 
1690
 *              AD || BD
-
 
1691
 *        AC || CB || 0
-
 
1692
 *
-
 
1693
 *    where A and B are the high and low 16-bit words of V1,
-
 
1694
 *    C and D are the 16-bit words of V2, AD is the product of
-
 
1695
 *    A and D, and X || Y is (X << 16) + Y.
-
 
1696
*/
-
 
1697
 
-
 
1698
void /* PRIVATE */
-
 
1699
png_64bit_product (long v1, long v2, unsigned long *hi_product,
-
 
1700
    unsigned long *lo_product)
-
 
1701
{
-
 
1702
   int a, b, c, d;
-
 
1703
   long lo, hi, x, y;
-
 
1704
 
-
 
1705
   a = (v1 >> 16) & 0xffff;
-
 
1706
   b = v1 & 0xffff;
-
 
1707
   c = (v2 >> 16) & 0xffff;
-
 
1708
   d = v2 & 0xffff;
-
 
1709
 
-
 
1710
   lo = b * d;                   /* BD */
-
 
1711
   x = a * d + c * b;            /* AD + CB */
-
 
1712
   y = ((lo >> 16) & 0xffff) + x;
-
 
1713
 
-
 
1714
   lo = (lo & 0xffff) | ((y & 0xffff) << 16);
-
 
1715
   hi = (y >> 16) & 0xffff;
-
 
1716
 
-
 
1717
   hi += a * c;                  /* AC */
-
 
1718
 
-
 
1719
   *hi_product = (unsigned long)hi;
-
 
1720
   *lo_product = (unsigned long)lo;
-
 
1721
}
-
 
1722
#endif /* CHECK_cHRM */
-
 
1723
 
3318
 
1724
#ifdef PNG_READ_GAMMA_SUPPORTED /* gamma table code */
3319
#ifdef PNG_READ_GAMMA_SUPPORTED /* gamma table code */
1725
#ifndef PNG_FLOATING_ARITHMETIC_SUPPORTED
3320
#ifndef PNG_FLOATING_ARITHMETIC_SUPPORTED
1726
/* Fixed point gamma.
3321
/* Fixed point gamma.
-
 
3322
 *
-
 
3323
 * The code to calculate the tables used below can be found in the shell script
-
 
3324
 * contrib/tools/intgamma.sh
1727
 *
3325
 *
1728
 * To calculate gamma this code implements fast log() and exp() calls using only
3326
 * To calculate gamma this code implements fast log() and exp() calls using only
1729
 * fixed point arithmetic.  This code has sufficient precision for either 8 or
3327
 * fixed point arithmetic.  This code has sufficient precision for either 8-bit
1730
 * 16 bit sample values.
3328
 * or 16-bit sample values.
1731
 *
3329
 *
1732
 * The tables used here were calculated using simple 'bc' programs, but C double
3330
 * The tables used here were calculated using simple 'bc' programs, but C double
1733
 * precision floating point arithmetic would work fine.  The programs are given
-
 
1734
 * at the head of each table.
3331
 * precision floating point arithmetic would work fine.
1735
 *
3332
 *
1736
 * 8 bit log table
3333
 * 8-bit log table
1737
 *   This is a table of -log(value/255)/log(2) for 'value' in the range 128 to
3334
 *   This is a table of -log(value/255)/log(2) for 'value' in the range 128 to
1738
 *   255, so it's the base 2 logarithm of a normalized 8 bit floating point
3335
 *   255, so it's the base 2 logarithm of a normalized 8-bit floating point
1739
 *   mantissa.  The numbers are 32 bit fractions.
3336
 *   mantissa.  The numbers are 32-bit fractions.
1740
 */
3337
 */
1741
static png_uint_32
3338
static const png_uint_32
1742
png_8bit_l2[128] =
3339
png_8bit_l2[128] =
1743
{
-
 
1744
#  if PNG_DO_BC
-
 
1745
      for (i=128;i<256;++i) { .5 - l(i/255)/l(2)*65536*65536; }
-
 
1746
#  endif
3340
{
1747
   4270715492U, 4222494797U, 4174646467U, 4127164793U, 4080044201U, 4033279239U,
3341
   4270715492U, 4222494797U, 4174646467U, 4127164793U, 4080044201U, 4033279239U,
1748
   3986864580U, 3940795015U, 3895065449U, 3849670902U, 3804606499U, 3759867474U,
3342
   3986864580U, 3940795015U, 3895065449U, 3849670902U, 3804606499U, 3759867474U,
1749
   3715449162U, 3671346997U, 3627556511U, 3584073329U, 3540893168U, 3498011834U,
3343
   3715449162U, 3671346997U, 3627556511U, 3584073329U, 3540893168U, 3498011834U,
1750
   3455425220U, 3413129301U, 3371120137U, 3329393864U, 3287946700U, 3246774933U,
3344
   3455425220U, 3413129301U, 3371120137U, 3329393864U, 3287946700U, 3246774933U,
Line 1765... Line 3359...
1765
   479792461U, 453592303U, 427502463U, 401522014U, 375650043U, 349885648U,
3359
   479792461U, 453592303U, 427502463U, 401522014U, 375650043U, 349885648U,
1766
   324227938U, 298676034U, 273229066U, 247886176U, 222646516U, 197509248U,
3360
   324227938U, 298676034U, 273229066U, 247886176U, 222646516U, 197509248U,
1767
   172473545U, 147538590U, 122703574U, 97967701U, 73330182U, 48790236U,
3361
   172473545U, 147538590U, 122703574U, 97967701U, 73330182U, 48790236U,
1768
   24347096U, 0U
3362
   24347096U, 0U
1769
#if 0
3363
 
-
 
3364
#if 0
1770
   /* The following are the values for 16 bit tables - these work fine for the 8
3365
   /* The following are the values for 16-bit tables - these work fine for the
1771
    * bit conversions but produce very slightly larger errors in the 16 bit log
3366
    * 8-bit conversions but produce very slightly larger errors in the 16-bit
1772
    * (about 1.2 as opposed to 0.7 absolute error in the final value).  To use
3367
    * log (about 1.2 as opposed to 0.7 absolute error in the final value).  To
1773
    * these all the shifts below must be adjusted appropriately.
3368
    * use these all the shifts below must be adjusted appropriately.
1774
    */
3369
    */
1775
   65166, 64430, 63700, 62976, 62257, 61543, 60835, 60132, 59434, 58741, 58054,
3370
   65166, 64430, 63700, 62976, 62257, 61543, 60835, 60132, 59434, 58741, 58054,
1776
   57371, 56693, 56020, 55352, 54689, 54030, 53375, 52726, 52080, 51439, 50803,
3371
   57371, 56693, 56020, 55352, 54689, 54030, 53375, 52726, 52080, 51439, 50803,
1777
   50170, 49542, 48918, 48298, 47682, 47070, 46462, 45858, 45257, 44661, 44068,
3372
   50170, 49542, 48918, 48298, 47682, 47070, 46462, 45858, 45257, 44661, 44068,
1778
   43479, 42894, 42312, 41733, 41159, 40587, 40020, 39455, 38894, 38336, 37782,
3373
   43479, 42894, 42312, 41733, 41159, 40587, 40020, 39455, 38894, 38336, 37782,
1779
   37230, 36682, 36137, 35595, 35057, 34521, 33988, 33459, 32932, 32408, 31887,
3374
   37230, 36682, 36137, 35595, 35057, 34521, 33988, 33459, 32932, 32408, 31887,
Line 1793... Line 3388...
1793
   unsigned int lg2 = 0;
3388
   unsigned int lg2 = 0;
1794
   /* Each time 'x' is multiplied by 2, 1 must be subtracted off the final log,
3389
   /* Each time 'x' is multiplied by 2, 1 must be subtracted off the final log,
1795
    * because the log is actually negate that means adding 1.  The final
3390
    * because the log is actually negate that means adding 1.  The final
1796
    * returned value thus has the range 0 (for 255 input) to 7.994 (for 1
3391
    * returned value thus has the range 0 (for 255 input) to 7.994 (for 1
1797
    * input), return 7.99998 for the overflow (log 0) case - so the result is
3392
    * input), return -1 for the overflow (log 0) case, - so the result is
1798
    * always at most 19 bits.
3393
    * always at most 19 bits.
1799
    */
3394
    */
1800
   if ((x &= 0xff) == 0)
3395
   if ((x &= 0xff) == 0)
1801
      return 0xffffffff;
3396
      return -1;
1802
 
3397
 
Line 1803... Line 3398...
1803
   if ((x & 0xf0) == 0)
3398
   if ((x & 0xf0) == 0)
1804
      lg2  = 4, x <<= 4;
3399
      lg2  = 4, x <<= 4;
Line 1805... Line 3400...
1805
 
3400
 
Line 1812... Line 3407...
1812
   /* result is at most 19 bits, so this cast is safe: */
3407
   /* result is at most 19 bits, so this cast is safe: */
1813
   return (png_int_32)((lg2 << 16) + ((png_8bit_l2[x-128]+32768)>>16));
3408
   return (png_int_32)((lg2 << 16) + ((png_8bit_l2[x-128]+32768)>>16));
1814
}
3409
}
Line 1815... Line 3410...
1815
 
3410
 
1816
/* The above gives exact (to 16 binary places) log2 values for 8 bit images,
3411
/* The above gives exact (to 16 binary places) log2 values for 8-bit images,
1817
 * for 16 bit images we use the most significant 8 bits of the 16 bit value to
3412
 * for 16-bit images we use the most significant 8 bits of the 16-bit value to
1818
 * get an approximation then multiply the approximation by a correction factor
3413
 * get an approximation then multiply the approximation by a correction factor
1819
 * determined by the remaining up to 8 bits.  This requires an additional step
3414
 * determined by the remaining up to 8 bits.  This requires an additional step
1820
 * in the 16 bit case.
3415
 * in the 16-bit case.
1821
 *
3416
 *
1822
 * We want log2(value/65535), we have log2(v'/255), where:
3417
 * We want log2(value/65535), we have log2(v'/255), where:
1823
 *
3418
 *
1824
 *    value = v' * 256 + v''
3419
 *    value = v' * 256 + v''
1825
 *          = v' * f
3420
 *          = v' * f
1826
 *
3421
 *
1827
 * So f is value/v', which is equal to (256+v''/v') since v' is in the range 128
3422
 * So f is value/v', which is equal to (256+v''/v') since v' is in the range 128
1828
 * to 255 and v'' is in the range 0 to 255 f will be in the range 256 to less
3423
 * to 255 and v'' is in the range 0 to 255 f will be in the range 256 to less
1829
 * than 258.  The final factor also needs to correct for the fact that our 8 bit
3424
 * than 258.  The final factor also needs to correct for the fact that our 8-bit
1830
 * value is scaled by 255, whereas the 16 bit values must be scaled by 65535.
3425
 * value is scaled by 255, whereas the 16-bit values must be scaled by 65535.
1831
 *
3426
 *
1832
 * This gives a final formula using a calculated value 'x' which is value/v' and
3427
 * This gives a final formula using a calculated value 'x' which is value/v' and
1833
 * scaling by 65536 to match the above table:
3428
 * scaling by 65536 to match the above table:
1834
 *
3429
 *
1835
 *   log2(x/257) * 65536
3430
 *   log2(x/257) * 65536
1836
 *
3431
 *
1837
 * Since these numbers are so close to '1' we can use simple linear
3432
 * Since these numbers are so close to '1' we can use simple linear
1838
 * interpolation between the two end values 256/257 (result -368.61) and 258/257
3433
 * interpolation between the two end values 256/257 (result -368.61) and 258/257
1839
 * (result 367.179).  The values used below are scaled by a further 64 to give
3434
 * (result 367.179).  The values used below are scaled by a further 64 to give
1840
 * 16 bit precision in the interpolation:
3435
 * 16-bit precision in the interpolation:
1841
 *
3436
 *
1842
 * Start (256): -23591
3437
 * Start (256): -23591
1843
 * Zero  (257):      0
3438
 * Zero  (257):      0
1844
 * End   (258):  23499
3439
 * End   (258):  23499
Line 1849... Line 3444...
1849
   unsigned int lg2 = 0;
3444
   unsigned int lg2 = 0;
1850
 
3445
 
Line 1851... Line 3446...
1851
   /* As above, but now the input has 16 bits. */
3446
   /* As above, but now the input has 16 bits. */
1852
   if ((x &= 0xffff) == 0)
3447
   if ((x &= 0xffff) == 0)
1853
      return 0xffffffff;
3448
      return -1;
Line 1854... Line 3449...
1854
 
3449
 
1855
   if ((x & 0xff00) == 0)
3450
   if ((x & 0xff00) == 0)
Line 1856... Line 3451...
1856
      lg2  = 8, x <<= 8;
3451
      lg2  = 8, x <<= 8;
Line 1863... Line 3458...
1863
 
3458
 
Line 1864... Line 3459...
1864
   if ((x & 0x8000) == 0)
3459
   if ((x & 0x8000) == 0)
1865
      lg2 += 1, x <<= 1;
3460
      lg2 += 1, x <<= 1;
Line 1866... Line 3461...
1866
 
3461
 
1867
   /* Calculate the base logarithm from the top 8 bits as a 28 bit fractional
3462
   /* Calculate the base logarithm from the top 8 bits as a 28-bit fractional
1868
    * value.
3463
    * value.
1869
    */
3464
    */
1870
   lg2 <<= 28;
3465
   lg2 <<= 28;
Line 1893... Line 3488...
1893
   /* Safe, because the result can't have more than 20 bits: */
3488
   /* Safe, because the result can't have more than 20 bits: */
1894
   return (png_int_32)((lg2 + 2048) >> 12);
3489
   return (png_int_32)((lg2 + 2048) >> 12);
1895
}
3490
}
Line 1896... Line 3491...
1896
 
3491
 
1897
/* The 'exp()' case must invert the above, taking a 20 bit fixed point
3492
/* The 'exp()' case must invert the above, taking a 20-bit fixed point
1898
 * logarithmic value and returning a 16 or 8 bit number as appropriate.  In
3493
 * logarithmic value and returning a 16 or 8-bit number as appropriate.  In
1899
 * each case only the low 16 bits are relevant - the fraction - since the
3494
 * each case only the low 16 bits are relevant - the fraction - since the
1900
 * integer bits (the top 4) simply determine a shift.
3495
 * integer bits (the top 4) simply determine a shift.
1901
 *
3496
 *
1902
 * The worst case is the 16 bit distinction between 65535 and 65534, this
3497
 * The worst case is the 16-bit distinction between 65535 and 65534, this
1903
 * requires perhaps spurious accuracty in the decoding of the logarithm to
3498
 * requires perhaps spurious accuracty in the decoding of the logarithm to
1904
 * distinguish log2(65535/65534.5) - 10^-5 or 17 bits.  There is little chance
3499
 * distinguish log2(65535/65534.5) - 10^-5 or 17 bits.  There is little chance
1905
 * of getting this accuracy in practice.
3500
 * of getting this accuracy in practice.
1906
 *
3501
 *
1907
 * To deal with this the following exp() function works out the exponent of the
3502
 * To deal with this the following exp() function works out the exponent of the
1908
 * frational part of the logarithm by using an accurate 32 bit value from the
3503
 * frational part of the logarithm by using an accurate 32-bit value from the
1909
 * top four fractional bits then multiplying in the remaining bits.
3504
 * top four fractional bits then multiplying in the remaining bits.
1910
 */
3505
 */
1911
static png_uint_32
3506
static const png_uint_32
1912
png_32bit_exp[16] =
3507
png_32bit_exp[16] =
1913
{
-
 
1914
#  if PNG_DO_BC
-
 
1915
      for (i=0;i<16;++i) { .5 + e(-i/16*l(2))*2^32; }
-
 
1916
#  endif
3508
{
1917
   /* NOTE: the first entry is deliberately set to the maximum 32 bit value. */
3509
   /* NOTE: the first entry is deliberately set to the maximum 32-bit value. */
1918
   4294967295U, 4112874773U, 3938502376U, 3771522796U, 3611622603U, 3458501653U,
3510
   4294967295U, 4112874773U, 3938502376U, 3771522796U, 3611622603U, 3458501653U,
1919
   3311872529U, 3171459999U, 3037000500U, 2908241642U, 2784941738U, 2666869345U,
3511
   3311872529U, 3171459999U, 3037000500U, 2908241642U, 2784941738U, 2666869345U,
1920
   2553802834U, 2445529972U, 2341847524U, 2242560872U
3512
   2553802834U, 2445529972U, 2341847524U, 2242560872U
Line 1921... Line 3513...
1921
};
3513
};
1922
 
3514
 
1923
/* Adjustment table; provided to explain the numbers in the code below. */
3515
/* Adjustment table; provided to explain the numbers in the code below. */
1924
#if PNG_DO_BC
3516
#if 0
1925
for (i=11;i>=0;--i){ print i, " ", (1 - e(-(2^i)/65536*l(2))) * 2^(32-i), "\n"}
3517
for (i=11;i>=0;--i){ print i, " ", (1 - e(-(2^i)/65536*l(2))) * 2^(32-i), "\n"}
1926
   11 44937.64284865548751208448
3518
   11 44937.64284865548751208448
1927
   10 45180.98734845585101160448
3519
   10 45180.98734845585101160448
Line 1941... Line 3533...
1941
png_exp(png_fixed_point x)
3533
png_exp(png_fixed_point x)
1942
{
3534
{
1943
   if (x > 0 && x <= 0xfffff) /* Else overflow or zero (underflow) */
3535
   if (x > 0 && x <= 0xfffff) /* Else overflow or zero (underflow) */
1944
   {
3536
   {
1945
      /* Obtain a 4 bit approximation */
3537
      /* Obtain a 4-bit approximation */
1946
      png_uint_32 e = png_32bit_exp[(x >> 12) & 0xf];
3538
      png_uint_32 e = png_32bit_exp[(x >> 12) & 0xf];
1947
 
3539
 
Line 1948... Line 3540...
1948
      /* Incorporate the low 12 bits - these decrease the returned value by
3540
      /* Incorporate the low 12 bits - these decrease the returned value by
1949
       * multiplying by a number less than 1 if the bit is set.  The multiplier
3541
       * multiplying by a number less than 1 if the bit is set.  The multiplier
1950
       * is determined by the above table and the shift. Notice that the values
3542
       * is determined by the above table and the shift. Notice that the values
Line 1987... Line 3579...
1987
 
3579
 
Line 1988... Line 3580...
1988
static png_byte
3580
static png_byte
1989
png_exp8bit(png_fixed_point lg2)
3581
png_exp8bit(png_fixed_point lg2)
1990
{
3582
{
1991
   /* Get a 32 bit value: */
3583
   /* Get a 32-bit value: */
1992
   png_uint_32 x = png_exp(lg2);
3584
   png_uint_32 x = png_exp(lg2);
Line 1993... Line 3585...
1993
 
3585
 
1994
   /* Convert the 32 bit value to 0..255 by multiplying by 256-1, note that the
3586
   /* Convert the 32-bit value to 0..255 by multiplying by 256-1, note that the
1995
    * second, rounding, step can't overflow because of the first, subtraction,
3587
    * second, rounding, step can't overflow because of the first, subtraction,
1996
    * step.
3588
    * step.
1997
    */
3589
    */
1998
   x -= x >> 8;
3590
   x -= x >> 8;
1999
   return (png_byte)((x + 0x7fffffU) >> 24);
3591
   return (png_byte)((x + 0x7fffffU) >> 24);
Line 2000... Line 3592...
2000
}
3592
}
2001
 
3593
 
2002
static png_uint_16
3594
static png_uint_16
2003
png_exp16bit(png_fixed_point lg2)
3595
png_exp16bit(png_fixed_point lg2)
2004
{
3596
{
Line 2005... Line 3597...
2005
   /* Get a 32 bit value: */
3597
   /* Get a 32-bit value: */
2006
   png_uint_32 x = png_exp(lg2);
3598
   png_uint_32 x = png_exp(lg2);
2007
 
3599
 
2008
   /* Convert the 32 bit value to 0..65535 by multiplying by 65536-1: */
3600
   /* Convert the 32-bit value to 0..65535 by multiplying by 65536-1: */
2009
   x -= x >> 16;
3601
   x -= x >> 16;
Line 2057... Line 3649...
2057
   return (png_uint_16)value;
3649
   return (png_uint_16)value;
2058
}
3650
}
Line 2059... Line 3651...
2059
 
3651
 
2060
/* This does the right thing based on the bit_depth field of the
3652
/* This does the right thing based on the bit_depth field of the
2061
 * png_struct, interpreting values as 8 or 16 bit.  While the result
3653
 * png_struct, interpreting values as 8-bit or 16-bit.  While the result
2062
 * is nominally a 16 bit value if bit depth is 8 then the result is
3654
 * is nominally a 16-bit value if bit depth is 8 then the result is
2063
 * 8 bit (as are the arguments.)
3655
 * 8-bit (as are the arguments.)
2064
 */
3656
 */
2065
png_uint_16 /* PRIVATE */
3657
png_uint_16 /* PRIVATE */
2066
png_gamma_correct(png_structp png_ptr, unsigned int value,
3658
png_gamma_correct(png_structrp png_ptr, unsigned int value,
2067
    png_fixed_point gamma_val)
3659
    png_fixed_point gamma_val)
2068
{
3660
{
2069
   if (png_ptr->bit_depth == 8)
3661
   if (png_ptr->bit_depth == 8)
Line 2070... Line 3662...
2070
      return png_gamma_8bit_correct(value, gamma_val);
3662
      return png_gamma_8bit_correct(value, gamma_val);
2071
 
3663
 
2072
   else
3664
   else
Line 2073... Line -...
2073
      return png_gamma_16bit_correct(value, gamma_val);
-
 
2074
}
-
 
2075
 
-
 
2076
/* This is the shared test on whether a gamma value is 'significant' - whether
-
 
2077
 * it is worth doing gamma correction.
-
 
2078
 */
-
 
2079
int /* PRIVATE */
-
 
2080
png_gamma_significant(png_fixed_point gamma_val)
-
 
2081
{
-
 
2082
   return gamma_val < PNG_FP_1 - PNG_GAMMA_THRESHOLD_FIXED ||
-
 
2083
       gamma_val > PNG_FP_1 + PNG_GAMMA_THRESHOLD_FIXED;
3665
      return png_gamma_16bit_correct(value, gamma_val);
2084
}
3666
}
2085
 
3667
 
2086
/* Internal function to build a single 16 bit table - the table consists of
3668
/* Internal function to build a single 16-bit table - the table consists of
2087
 * 'num' 256 entry subtables, where 'num' is determined by 'shift' - the amount
3669
 * 'num' 256 entry subtables, where 'num' is determined by 'shift' - the amount
2088
 * to shift the input values right (or 16-number_of_signifiant_bits).
3670
 * to shift the input values right (or 16-number_of_signifiant_bits).
2089
 *
3671
 *
2090
 * The caller is responsible for ensuring that the table gets cleaned up on
3672
 * The caller is responsible for ensuring that the table gets cleaned up on
2091
 * png_error (i.e. if one of the mallocs below fails) - i.e. the *table argument
3673
 * png_error (i.e. if one of the mallocs below fails) - i.e. the *table argument
2092
 * should be somewhere that will be cleaned.
3674
 * should be somewhere that will be cleaned.
2093
 */
3675
 */
2094
static void
3676
static void
2095
png_build_16bit_table(png_structp png_ptr, png_uint_16pp *ptable,
3677
png_build_16bit_table(png_structrp png_ptr, png_uint_16pp *ptable,
2096
   PNG_CONST unsigned int shift, PNG_CONST png_fixed_point gamma_val)
3678
   PNG_CONST unsigned int shift, PNG_CONST png_fixed_point gamma_val)
2097
{
3679
{
2098
   /* Various values derived from 'shift': */
3680
   /* Various values derived from 'shift': */
2099
   PNG_CONST unsigned int num = 1U << (8U - shift);
3681
   PNG_CONST unsigned int num = 1U << (8U - shift);
Line 2100... Line 3682...
2100
   PNG_CONST unsigned int max = (1U << (16U - shift))-1U;
3682
   PNG_CONST unsigned int max = (1U << (16U - shift))-1U;
2101
   PNG_CONST unsigned int max_by_2 = 1U << (15U-shift);
3683
   PNG_CONST unsigned int max_by_2 = 1U << (15U-shift);
Line 2102... Line 3684...
2102
   unsigned int i;
3684
   unsigned int i;
2103
 
3685
 
2104
   png_uint_16pp table = *ptable =
3686
   png_uint_16pp table = *ptable =
2105
       (png_uint_16pp)png_calloc(png_ptr, num * png_sizeof(png_uint_16p));
3687
       (png_uint_16pp)png_calloc(png_ptr, num * (sizeof (png_uint_16p)));
Line 2106... Line 3688...
2106
 
3688
 
2107
   for (i = 0; i < num; i++)
3689
   for (i = 0; i < num; i++)
2108
   {
3690
   {
2109
      png_uint_16p sub_table = table[i] =
3691
      png_uint_16p sub_table = table[i] =
2110
          (png_uint_16p)png_malloc(png_ptr, 256 * png_sizeof(png_uint_16));
3692
          (png_uint_16p)png_malloc(png_ptr, 256 * (sizeof (png_uint_16)));
2111
 
3693
 
2112
      /* The 'threshold' test is repeated here because it can arise for one of
3694
      /* The 'threshold' test is repeated here because it can arise for one of
Line 2159... Line 3741...
2159
/* NOTE: this function expects the *inverse* of the overall gamma transformation
3741
/* NOTE: this function expects the *inverse* of the overall gamma transformation
2160
 * required.
3742
 * required.
2161
 */
3743
 */
2162
static void
3744
static void
2163
png_build_16to8_table(png_structp png_ptr, png_uint_16pp *ptable,
3745
png_build_16to8_table(png_structrp png_ptr, png_uint_16pp *ptable,
2164
   PNG_CONST unsigned int shift, PNG_CONST png_fixed_point gamma_val)
3746
   PNG_CONST unsigned int shift, PNG_CONST png_fixed_point gamma_val)
2165
{
3747
{
2166
   PNG_CONST unsigned int num = 1U << (8U - shift);
3748
   PNG_CONST unsigned int num = 1U << (8U - shift);
2167
   PNG_CONST unsigned int max = (1U << (16U - shift))-1U;
3749
   PNG_CONST unsigned int max = (1U << (16U - shift))-1U;
2168
   unsigned int i;
3750
   unsigned int i;
2169
   png_uint_32 last;
3751
   png_uint_32 last;
Line 2170... Line 3752...
2170
 
3752
 
2171
   png_uint_16pp table = *ptable =
3753
   png_uint_16pp table = *ptable =
Line 2172... Line 3754...
2172
       (png_uint_16pp)png_calloc(png_ptr, num * png_sizeof(png_uint_16p));
3754
       (png_uint_16pp)png_calloc(png_ptr, num * (sizeof (png_uint_16p)));
2173
 
3755
 
2174
   /* 'num' is the number of tables and also the number of low bits of low
3756
   /* 'num' is the number of tables and also the number of low bits of low
2175
    * bits of the input 16 bit value used to select a table.  Each table is
3757
    * bits of the input 16-bit value used to select a table.  Each table is
2176
    * itself index by the high 8 bits of the value.
3758
    * itself index by the high 8 bits of the value.
2177
    */
3759
    */
2178
   for (i = 0; i < num; i++)
3760
   for (i = 0; i < num; i++)
Line 2179... Line 3761...
2179
      table[i] = (png_uint_16p)png_malloc(png_ptr,
3761
      table[i] = (png_uint_16p)png_malloc(png_ptr,
2180
          256 * png_sizeof(png_uint_16));
3762
          256 * (sizeof (png_uint_16)));
2181
 
3763
 
2182
   /* 'gamma_val' is set to the reciprocal of the value calculated above, so
3764
   /* 'gamma_val' is set to the reciprocal of the value calculated above, so
2183
    * pow(out,g) is an *input* value.  'last' is the last input value set.
3765
    * pow(out,g) is an *input* value.  'last' is the last input value set.
2184
    *
3766
    *
2185
    * In the loop 'i' is used to find output values.  Since the output is 8
3767
    * In the loop 'i' is used to find output values.  Since the output is
2186
    * bit there are only 256 possible values.  The tables are set up to
3768
    * 8-bit there are only 256 possible values.  The tables are set up to
2187
    * select the closest possible output value for each input by finding
3769
    * select the closest possible output value for each input by finding
2188
    * the input value at the boundary between each pair of output values
3770
    * the input value at the boundary between each pair of output values
2189
    * and filling the table up to that boundary with the lower output
3771
    * and filling the table up to that boundary with the lower output
2190
    * value.
3772
    * value.
2191
    *
3773
    *
2192
    * The boundary values are 0.5,1.5..253.5,254.5.  Since these are 9 bit
3774
    * The boundary values are 0.5,1.5..253.5,254.5.  Since these are 9-bit
2193
    * values the code below uses a 16 bit value in i; the values start at
3775
    * values the code below uses a 16-bit value in i; the values start at
2194
    * 128.5 (for 0.5) and step by 257, for a total of 254 values (the last
3776
    * 128.5 (for 0.5) and step by 257, for a total of 254 values (the last
2195
    * entries are filled with 255).  Start i at 128 and fill all 'last'
3777
    * entries are filled with 255).  Start i at 128 and fill all 'last'
2196
    * table entries <= 'max'
3778
    * table entries <= 'max'
2197
    */
3779
    */
2198
   last = 0;
3780
   last = 0;
2199
   for (i = 0; i < 255; ++i) /* 8 bit output value */
3781
   for (i = 0; i < 255; ++i) /* 8-bit output value */
Line 2200... Line 3782...
2200
   {
3782
   {
2201
      /* Find the corresponding maximum input value */
3783
      /* Find the corresponding maximum input value */
Line 2202... Line 3784...
2202
      png_uint_16 out = (png_uint_16)(i * 257U); /* 16 bit output value */
3784
      png_uint_16 out = (png_uint_16)(i * 257U); /* 16-bit output value */
Line 2221... Line 3803...
2221
      last++;
3803
      last++;
2222
   }
3804
   }
2223
}
3805
}
2224
 
3806
 
Line 2225... Line 3807...
2225
/* Build a single 8 bit table: same as the 16 bit case but much simpler (and
3807
/* Build a single 8-bit table: same as the 16-bit case but much simpler (and
2226
 * typically much faster).  Note that libpng currently does no sBIT processing
3808
 * typically much faster).  Note that libpng currently does no sBIT processing
2227
 * (apparently contrary to the spec) so a 256 entry table is always generated.
3809
 * (apparently contrary to the spec) so a 256 entry table is always generated.
2228
 */
3810
 */
2229
static void
3811
static void
2230
png_build_8bit_table(png_structp png_ptr, png_bytepp ptable,
3812
png_build_8bit_table(png_structrp png_ptr, png_bytepp ptable,
2231
   PNG_CONST png_fixed_point gamma_val)
3813
   PNG_CONST png_fixed_point gamma_val)
2232
{
3814
{
2233
   unsigned int i;
3815
   unsigned int i;
2234
   png_bytep table = *ptable = (png_bytep)png_malloc(png_ptr, 256);
3816
   png_bytep table = *ptable = (png_bytep)png_malloc(png_ptr, 256);
Line 2239... Line 3821...
2239
   else for (i=0; i<256; ++i)
3821
   else for (i=0; i<256; ++i)
2240
      table[i] = (png_byte)i;
3822
      table[i] = (png_byte)i;
2241
}
3823
}
Line -... Line 3824...
-
 
3824
 
-
 
3825
/* Used from png_read_destroy and below to release the memory used by the gamma
-
 
3826
 * tables.
-
 
3827
 */
-
 
3828
void /* PRIVATE */
-
 
3829
png_destroy_gamma_table(png_structrp png_ptr)
-
 
3830
{
-
 
3831
   png_free(png_ptr, png_ptr->gamma_table);
-
 
3832
   png_ptr->gamma_table = NULL;
-
 
3833
 
-
 
3834
   if (png_ptr->gamma_16_table != NULL)
-
 
3835
   {
-
 
3836
      int i;
-
 
3837
      int istop = (1 << (8 - png_ptr->gamma_shift));
-
 
3838
      for (i = 0; i < istop; i++)
-
 
3839
      {
-
 
3840
         png_free(png_ptr, png_ptr->gamma_16_table[i]);
-
 
3841
      }
-
 
3842
   png_free(png_ptr, png_ptr->gamma_16_table);
-
 
3843
   png_ptr->gamma_16_table = NULL;
-
 
3844
   }
-
 
3845
 
-
 
3846
#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \
-
 
3847
   defined(PNG_READ_ALPHA_MODE_SUPPORTED) || \
-
 
3848
   defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
-
 
3849
   png_free(png_ptr, png_ptr->gamma_from_1);
-
 
3850
   png_ptr->gamma_from_1 = NULL;
-
 
3851
   png_free(png_ptr, png_ptr->gamma_to_1);
-
 
3852
   png_ptr->gamma_to_1 = NULL;
-
 
3853
 
-
 
3854
   if (png_ptr->gamma_16_from_1 != NULL)
-
 
3855
   {
-
 
3856
      int i;
-
 
3857
      int istop = (1 << (8 - png_ptr->gamma_shift));
-
 
3858
      for (i = 0; i < istop; i++)
-
 
3859
      {
-
 
3860
         png_free(png_ptr, png_ptr->gamma_16_from_1[i]);
-
 
3861
      }
-
 
3862
   png_free(png_ptr, png_ptr->gamma_16_from_1);
-
 
3863
   png_ptr->gamma_16_from_1 = NULL;
-
 
3864
   }
-
 
3865
   if (png_ptr->gamma_16_to_1 != NULL)
-
 
3866
   {
-
 
3867
      int i;
-
 
3868
      int istop = (1 << (8 - png_ptr->gamma_shift));
-
 
3869
      for (i = 0; i < istop; i++)
-
 
3870
      {
-
 
3871
         png_free(png_ptr, png_ptr->gamma_16_to_1[i]);
-
 
3872
      }
-
 
3873
   png_free(png_ptr, png_ptr->gamma_16_to_1);
-
 
3874
   png_ptr->gamma_16_to_1 = NULL;
-
 
3875
   }
-
 
3876
#endif /* READ_BACKGROUND || READ_ALPHA_MODE || RGB_TO_GRAY */
-
 
3877
}
2242
 
3878
 
2243
/* We build the 8- or 16-bit gamma tables here.  Note that for 16-bit
3879
/* We build the 8- or 16-bit gamma tables here.  Note that for 16-bit
2244
 * tables, we don't make a full table if we are reducing to 8-bit in
3880
 * tables, we don't make a full table if we are reducing to 8-bit in
2245
 * the future.  Note also how the gamma_16 tables are segmented so that
3881
 * the future.  Note also how the gamma_16 tables are segmented so that
2246
 * we don't need to allocate > 64K chunks for a full 16-bit table.
3882
 * we don't need to allocate > 64K chunks for a full 16-bit table.
2247
 */
3883
 */
2248
void /* PRIVATE */
3884
void /* PRIVATE */
2249
png_build_gamma_table(png_structp png_ptr, int bit_depth)
3885
png_build_gamma_table(png_structrp png_ptr, int bit_depth)
2250
{
3886
{
Line -... Line 3887...
-
 
3887
  png_debug(1, "in png_build_gamma_table");
-
 
3888
 
-
 
3889
  /* Remove any existing table; this copes with multiple calls to
-
 
3890
   * png_read_update_info.  The warning is because building the gamma tables
-
 
3891
   * multiple times is a performance hit - it's harmless but the ability to call
-
 
3892
   * png_read_update_info() multiple times is new in 1.5.6 so it seems sensible
-
 
3893
   * to warn if the app introduces such a hit.
-
 
3894
   */
-
 
3895
  if (png_ptr->gamma_table != NULL || png_ptr->gamma_16_table != NULL)
-
 
3896
  {
-
 
3897
    png_warning(png_ptr, "gamma table being rebuilt");
-
 
3898
    png_destroy_gamma_table(png_ptr);
2251
  png_debug(1, "in png_build_gamma_table");
3899
  }
2252
 
3900
 
2253
  if (bit_depth <= 8)
3901
  if (bit_depth <= 8)
2254
  {
3902
  {
2255
     png_build_8bit_table(png_ptr, &png_ptr->gamma_table,
3903
     png_build_8bit_table(png_ptr, &png_ptr->gamma_table,
Line 2256... Line 3904...
2256
         png_ptr->screen_gamma > 0 ?  png_reciprocal2(png_ptr->gamma,
3904
         png_ptr->screen_gamma > 0 ?  png_reciprocal2(png_ptr->colorspace.gamma,
-
 
3905
         png_ptr->screen_gamma) : PNG_FP_1);
2257
         png_ptr->screen_gamma) : PNG_FP_1);
3906
 
2258
 
3907
#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \
2259
#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \
3908
   defined(PNG_READ_ALPHA_MODE_SUPPORTED) || \
2260
   defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
3909
   defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
2261
     if (png_ptr->transformations & ((PNG_BACKGROUND) | PNG_RGB_TO_GRAY))
3910
     if (png_ptr->transformations & (PNG_COMPOSE | PNG_RGB_TO_GRAY))
Line 2262... Line 3911...
2262
     {
3911
     {
2263
        png_build_8bit_table(png_ptr, &png_ptr->gamma_to_1,
3912
        png_build_8bit_table(png_ptr, &png_ptr->gamma_to_1,
2264
            png_reciprocal(png_ptr->gamma));
3913
            png_reciprocal(png_ptr->colorspace.gamma));
2265
 
3914
 
2266
        png_build_8bit_table(png_ptr, &png_ptr->gamma_from_1,
3915
        png_build_8bit_table(png_ptr, &png_ptr->gamma_from_1,
2267
            png_ptr->screen_gamma > 0 ?  png_reciprocal(png_ptr->screen_gamma) :
3916
            png_ptr->screen_gamma > 0 ?  png_reciprocal(png_ptr->screen_gamma) :
2268
            png_ptr->gamma/* Probably doing rgb_to_gray */);
3917
            png_ptr->colorspace.gamma/* Probably doing rgb_to_gray */);
2269
     }
3918
     }
2270
#endif /* PNG_READ_BACKGROUND_SUPPORTED || PNG_RGB_TO_GRAY_SUPPORTED */
3919
#endif /* READ_BACKGROUND || READ_ALPHA_MODE || RGB_TO_GRAY */
Line 2285... Line 3934...
2285
     }
3934
     }
2286
     else
3935
     else
2287
        sig_bit = png_ptr->sig_bit.gray;
3936
        sig_bit = png_ptr->sig_bit.gray;
2288
 
3937
 
Line 2289... Line 3938...
2289
     /* 16 bit gamma code uses this equation:
3938
     /* 16-bit gamma code uses this equation:
2290
      *
3939
      *
2291
      *   ov = table[(iv & 0xff) >> gamma_shift][iv >> 8]
3940
      *   ov = table[(iv & 0xff) >> gamma_shift][iv >> 8]
2292
      *
3941
      *
2293
      * Where 'iv' is the input color value and 'ov' is the output value -
3942
      * Where 'iv' is the input color value and 'ov' is the output value -
2294
      * pow(iv, gamma).
3943
      * pow(iv, gamma).
Line 2300... Line 3949...
2300
      *   table[low bits][high 8 bits]
3949
      *   table[low bits][high 8 bits]
2301
      *
3950
      *
2302
      * So the table 'n' corresponds to all those 'iv' of:
3951
      * So the table 'n' corresponds to all those 'iv' of:
2303
      *
3952
      *
2304
      *   ..<(n+1 << gamma_shift)-1>
3953
      *   ..<(n+1 << gamma_shift)-1>
2305
      *
3954
      *
2306
      */
3955
      */
2307
     if (sig_bit > 0 && sig_bit < 16U)
3956
     if (sig_bit > 0 && sig_bit < 16U)
2308
        shift = (png_byte)(16U - sig_bit); /* shift == insignificant bits */
3957
        shift = (png_byte)(16U - sig_bit); /* shift == insignificant bits */
2309
 
3958
 
Line 2310... Line 3959...
2310
     else
3959
     else
2311
        shift = 0; /* keep all 16 bits */
3960
        shift = 0; /* keep all 16 bits */
Line 2312... Line 3961...
2312
 
3961
 
2313
     if (png_ptr->transformations & PNG_16_TO_8)
3962
     if (png_ptr->transformations & (PNG_16_TO_8 | PNG_SCALE_16_TO_8))
2314
     {
3963
     {
2315
        /* PNG_MAX_GAMMA_8 is the number of bits to keep - effectively
3964
        /* PNG_MAX_GAMMA_8 is the number of bits to keep - effectively
2316
         * the significant bits in the *input* when the output will
3965
         * the significant bits in the *input* when the output will
2317
         * eventually be 8 bits.  By default it is 11.
3966
         * eventually be 8 bits.  By default it is 11.
Line 2325... Line 3974...
2325
 
3974
 
Line 2326... Line 3975...
2326
     png_ptr->gamma_shift = shift;
3975
     png_ptr->gamma_shift = shift;
Line 2327... Line 3976...
2327
 
3976
 
-
 
3977
#ifdef PNG_16BIT_SUPPORTED
-
 
3978
     /* NOTE: prior to 1.5.4 this test used to include PNG_BACKGROUND (now
-
 
3979
      * PNG_COMPOSE).  This effectively smashed the background calculation for
-
 
3980
      * 16-bit output because the 8-bit table assumes the result will be reduced
-
 
3981
      * to 8 bits.
2328
#ifdef PNG_16BIT_SUPPORTED
3982
      */
2329
     if (png_ptr->transformations & (PNG_16_TO_8 | PNG_BACKGROUND))
3983
     if (png_ptr->transformations & (PNG_16_TO_8 | PNG_SCALE_16_TO_8))
2330
#endif
3984
#endif
2331
         png_build_16to8_table(png_ptr, &png_ptr->gamma_16_table, shift,
3985
         png_build_16to8_table(png_ptr, &png_ptr->gamma_16_table, shift,
2332
         png_ptr->screen_gamma > 0 ? png_product2(png_ptr->gamma,
3986
         png_ptr->screen_gamma > 0 ? png_product2(png_ptr->colorspace.gamma,
Line 2333... Line 3987...
2333
         png_ptr->screen_gamma) : PNG_FP_1);
3987
         png_ptr->screen_gamma) : PNG_FP_1);
2334
 
3988
 
2335
#ifdef PNG_16BIT_SUPPORTED
3989
#ifdef PNG_16BIT_SUPPORTED
2336
     else
3990
     else
2337
         png_build_16bit_table(png_ptr, &png_ptr->gamma_16_table, shift,
3991
         png_build_16bit_table(png_ptr, &png_ptr->gamma_16_table, shift,
2338
         png_ptr->screen_gamma > 0 ? png_reciprocal2(png_ptr->gamma,
3992
         png_ptr->screen_gamma > 0 ? png_reciprocal2(png_ptr->colorspace.gamma,
Line 2339... Line 3993...
2339
         png_ptr->screen_gamma) : PNG_FP_1);
3993
         png_ptr->screen_gamma) : PNG_FP_1);
-
 
3994
#endif
2340
#endif
3995
 
2341
 
3996
#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \
2342
#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \
3997
   defined(PNG_READ_ALPHA_MODE_SUPPORTED) || \
2343
   defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
3998
   defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
2344
     if (png_ptr->transformations & (PNG_BACKGROUND | PNG_RGB_TO_GRAY))
3999
     if (png_ptr->transformations & (PNG_COMPOSE | PNG_RGB_TO_GRAY))
Line 2345... Line 4000...
2345
     {
4000
     {
2346
        png_build_16bit_table(png_ptr, &png_ptr->gamma_16_to_1, shift,
4001
        png_build_16bit_table(png_ptr, &png_ptr->gamma_16_to_1, shift,
2347
            png_reciprocal(png_ptr->gamma));
4002
            png_reciprocal(png_ptr->colorspace.gamma));
2348
 
4003
 
2349
        /* Notice that the '16 from 1' table should be full precision, however
4004
        /* Notice that the '16 from 1' table should be full precision, however
2350
         * the lookup on this table still uses gamma_shift, so it can't be.
4005
         * the lookup on this table still uses gamma_shift, so it can't be.
2351
         * TODO: fix this.
4006
         * TODO: fix this.
2352
         */
4007
         */
2353
        png_build_16bit_table(png_ptr, &png_ptr->gamma_16_from_1, shift,
4008
        png_build_16bit_table(png_ptr, &png_ptr->gamma_16_from_1, shift,
2354
            png_ptr->screen_gamma > 0 ? png_reciprocal(png_ptr->screen_gamma) :
4009
            png_ptr->screen_gamma > 0 ? png_reciprocal(png_ptr->screen_gamma) :
2355
            png_ptr->gamma/* Probably doing rgb_to_gray */);
4010
            png_ptr->colorspace.gamma/* Probably doing rgb_to_gray */);
2356
     }
4011
     }
-
 
4012
#endif /* READ_BACKGROUND || READ_ALPHA_MODE || RGB_TO_GRAY */
-
 
4013
  }
-
 
4014
}
-
 
4015
#endif /* READ_GAMMA */
-
 
4016
 
-
 
4017
/* HARDWARE OPTION SUPPORT */
-
 
4018
#ifdef PNG_SET_OPTION_SUPPORTED
-
 
4019
int PNGAPI
-
 
4020
png_set_option(png_structrp png_ptr, int option, int onoff)
-
 
4021
{
-
 
4022
   if (png_ptr != NULL && option >= 0 && option < PNG_OPTION_NEXT &&
-
 
4023
      (option & 1) == 0)
-
 
4024
   {
-
 
4025
      int mask = 3 << option;
-
 
4026
      int setting = (2 + (onoff != 0)) << option;
-
 
4027
      int current = png_ptr->options;
-
 
4028
 
-
 
4029
      png_ptr->options = (png_byte)((current & ~mask) | setting);
-
 
4030
 
-
 
4031
      return (current & mask) >> option;
-
 
4032
   }
-
 
4033
 
-
 
4034
   return PNG_OPTION_INVALID;
-
 
4035
}
-
 
4036
#endif
-
 
4037
 
-
 
4038
/* sRGB support */
-
 
4039
#if defined(PNG_SIMPLIFIED_READ_SUPPORTED) ||\
-
 
4040
   defined(PNG_SIMPLIFIED_WRITE_SUPPORTED)
-
 
4041
/* sRGB conversion tables; these are machine generated with the code in
-
 
4042
 * contrib/tools/makesRGB.c.  The actual sRGB transfer curve defined in the
-
 
4043
 * specification (see the article at http://en.wikipedia.org/wiki/SRGB)
-
 
4044
 * is used, not the gamma=1/2.2 approximation use elsewhere in libpng.
-
 
4045
 * The sRGB to linear table is exact (to the nearest 16 bit linear fraction).
-
 
4046
 * The inverse (linear to sRGB) table has accuracies as follows:
-
 
4047
 *
-
 
4048
 * For all possible (255*65535+1) input values:
-
 
4049
 *
-
 
4050
 *    error: -0.515566 - 0.625971, 79441 (0.475369%) of readings inexact
-
 
4051
 *
-
 
4052
 * For the input values corresponding to the 65536 16-bit values:
-
 
4053
 *
-
 
4054
 *    error: -0.513727 - 0.607759, 308 (0.469978%) of readings inexact
-
 
4055
 *
-
 
4056
 * In all cases the inexact readings are off by one.
-
 
4057
 */
-
 
4058
 
-
 
4059
#ifdef PNG_SIMPLIFIED_READ_SUPPORTED
-
 
4060
/* The convert-to-sRGB table is only currently required for read. */
-
 
4061
const png_uint_16 png_sRGB_table[256] =
-
 
4062
{
-
 
4063
   0,20,40,60,80,99,119,139,
-
 
4064
   159,179,199,219,241,264,288,313,
-
 
4065
   340,367,396,427,458,491,526,562,
-
 
4066
   599,637,677,718,761,805,851,898,
-
 
4067
   947,997,1048,1101,1156,1212,1270,1330,
-
 
4068
   1391,1453,1517,1583,1651,1720,1790,1863,
-
 
4069
   1937,2013,2090,2170,2250,2333,2418,2504,
-
 
4070
   2592,2681,2773,2866,2961,3058,3157,3258,
-
 
4071
   3360,3464,3570,3678,3788,3900,4014,4129,
-
 
4072
   4247,4366,4488,4611,4736,4864,4993,5124,
-
 
4073
   5257,5392,5530,5669,5810,5953,6099,6246,
-
 
4074
   6395,6547,6700,6856,7014,7174,7335,7500,
-
 
4075
   7666,7834,8004,8177,8352,8528,8708,8889,
-
 
4076
   9072,9258,9445,9635,9828,10022,10219,10417,
-
 
4077
   10619,10822,11028,11235,11446,11658,11873,12090,
-
 
4078
   12309,12530,12754,12980,13209,13440,13673,13909,
-
 
4079
   14146,14387,14629,14874,15122,15371,15623,15878,
-
 
4080
   16135,16394,16656,16920,17187,17456,17727,18001,
-
 
4081
   18277,18556,18837,19121,19407,19696,19987,20281,
-
 
4082
   20577,20876,21177,21481,21787,22096,22407,22721,
-
 
4083
   23038,23357,23678,24002,24329,24658,24990,25325,
-
 
4084
   25662,26001,26344,26688,27036,27386,27739,28094,
-
 
4085
   28452,28813,29176,29542,29911,30282,30656,31033,
-
 
4086
   31412,31794,32179,32567,32957,33350,33745,34143,
-
 
4087
   34544,34948,35355,35764,36176,36591,37008,37429,
-
 
4088
   37852,38278,38706,39138,39572,40009,40449,40891,
-
 
4089
   41337,41785,42236,42690,43147,43606,44069,44534,
-
 
4090
   45002,45473,45947,46423,46903,47385,47871,48359,
-
 
4091
   48850,49344,49841,50341,50844,51349,51858,52369,
-
 
4092
   52884,53401,53921,54445,54971,55500,56032,56567,
-
 
4093
   57105,57646,58190,58737,59287,59840,60396,60955,
-
 
4094
   61517,62082,62650,63221,63795,64372,64952,65535
-
 
4095
};
-
 
4096
 
-
 
4097
#endif /* simplified read only */
-
 
4098
 
-
 
4099
/* The base/delta tables are required for both read and write (but currently
-
 
4100
 * only the simplified versions.)
-
 
4101
 */
-
 
4102
const png_uint_16 png_sRGB_base[512] =
-
 
4103
{
-
 
4104
   128,1782,3383,4644,5675,6564,7357,8074,
-
 
4105
   8732,9346,9921,10463,10977,11466,11935,12384,
-
 
4106
   12816,13233,13634,14024,14402,14769,15125,15473,
-
 
4107
   15812,16142,16466,16781,17090,17393,17690,17981,
-
 
4108
   18266,18546,18822,19093,19359,19621,19879,20133,
-
 
4109
   20383,20630,20873,21113,21349,21583,21813,22041,
-
 
4110
   22265,22487,22707,22923,23138,23350,23559,23767,
-
 
4111
   23972,24175,24376,24575,24772,24967,25160,25352,
-
 
4112
   25542,25730,25916,26101,26284,26465,26645,26823,
-
 
4113
   27000,27176,27350,27523,27695,27865,28034,28201,
-
 
4114
   28368,28533,28697,28860,29021,29182,29341,29500,
-
 
4115
   29657,29813,29969,30123,30276,30429,30580,30730,
-
 
4116
   30880,31028,31176,31323,31469,31614,31758,31902,
-
 
4117
   32045,32186,32327,32468,32607,32746,32884,33021,
-
 
4118
   33158,33294,33429,33564,33697,33831,33963,34095,
-
 
4119
   34226,34357,34486,34616,34744,34873,35000,35127,
-
 
4120
   35253,35379,35504,35629,35753,35876,35999,36122,
-
 
4121
   36244,36365,36486,36606,36726,36845,36964,37083,
-
 
4122
   37201,37318,37435,37551,37668,37783,37898,38013,
-
 
4123
   38127,38241,38354,38467,38580,38692,38803,38915,
-
 
4124
   39026,39136,39246,39356,39465,39574,39682,39790,
-
 
4125
   39898,40005,40112,40219,40325,40431,40537,40642,
-
 
4126
   40747,40851,40955,41059,41163,41266,41369,41471,
-
 
4127
   41573,41675,41777,41878,41979,42079,42179,42279,
-
 
4128
   42379,42478,42577,42676,42775,42873,42971,43068,
-
 
4129
   43165,43262,43359,43456,43552,43648,43743,43839,
-
 
4130
   43934,44028,44123,44217,44311,44405,44499,44592,
-
 
4131
   44685,44778,44870,44962,45054,45146,45238,45329,
-
 
4132
   45420,45511,45601,45692,45782,45872,45961,46051,
-
 
4133
   46140,46229,46318,46406,46494,46583,46670,46758,
-
 
4134
   46846,46933,47020,47107,47193,47280,47366,47452,
-
 
4135
   47538,47623,47709,47794,47879,47964,48048,48133,
-
 
4136
   48217,48301,48385,48468,48552,48635,48718,48801,
-
 
4137
   48884,48966,49048,49131,49213,49294,49376,49458,
-
 
4138
   49539,49620,49701,49782,49862,49943,50023,50103,
-
 
4139
   50183,50263,50342,50422,50501,50580,50659,50738,
-
 
4140
   50816,50895,50973,51051,51129,51207,51285,51362,
-
 
4141
   51439,51517,51594,51671,51747,51824,51900,51977,
-
 
4142
   52053,52129,52205,52280,52356,52432,52507,52582,
-
 
4143
   52657,52732,52807,52881,52956,53030,53104,53178,
-
 
4144
   53252,53326,53400,53473,53546,53620,53693,53766,
-
 
4145
   53839,53911,53984,54056,54129,54201,54273,54345,
-
 
4146
   54417,54489,54560,54632,54703,54774,54845,54916,
-
 
4147
   54987,55058,55129,55199,55269,55340,55410,55480,
-
 
4148
   55550,55620,55689,55759,55828,55898,55967,56036,
-
 
4149
   56105,56174,56243,56311,56380,56448,56517,56585,
-
 
4150
   56653,56721,56789,56857,56924,56992,57059,57127,
-
 
4151
   57194,57261,57328,57395,57462,57529,57595,57662,
-
 
4152
   57728,57795,57861,57927,57993,58059,58125,58191,
-
 
4153
   58256,58322,58387,58453,58518,58583,58648,58713,
-
 
4154
   58778,58843,58908,58972,59037,59101,59165,59230,
-
 
4155
   59294,59358,59422,59486,59549,59613,59677,59740,
-
 
4156
   59804,59867,59930,59993,60056,60119,60182,60245,
-
 
4157
   60308,60370,60433,60495,60558,60620,60682,60744,
-
 
4158
   60806,60868,60930,60992,61054,61115,61177,61238,
-
 
4159
   61300,61361,61422,61483,61544,61605,61666,61727,
-
 
4160
   61788,61848,61909,61969,62030,62090,62150,62211,
-
 
4161
   62271,62331,62391,62450,62510,62570,62630,62689,
-
 
4162
   62749,62808,62867,62927,62986,63045,63104,63163,
-
 
4163
   63222,63281,63340,63398,63457,63515,63574,63632,
-
 
4164
   63691,63749,63807,63865,63923,63981,64039,64097,
-
 
4165
   64155,64212,64270,64328,64385,64443,64500,64557,
-
 
4166
   64614,64672,64729,64786,64843,64900,64956,65013,
-
 
4167
   65070,65126,65183,65239,65296,65352,65409,65465
-
 
4168
};
-
 
4169
 
-
 
4170
const png_byte png_sRGB_delta[512] =
-
 
4171
{
-
 
4172
   207,201,158,129,113,100,90,82,77,72,68,64,61,59,56,54,
-
 
4173
   52,50,49,47,46,45,43,42,41,40,39,39,38,37,36,36,
-
 
4174
   35,34,34,33,33,32,32,31,31,30,30,30,29,29,28,28,
-
 
4175
   28,27,27,27,27,26,26,26,25,25,25,25,24,24,24,24,
-
 
4176
   23,23,23,23,23,22,22,22,22,22,22,21,21,21,21,21,
-
 
4177
   21,20,20,20,20,20,20,20,20,19,19,19,19,19,19,19,
-
 
4178
   19,18,18,18,18,18,18,18,18,18,18,17,17,17,17,17,
-
 
4179
   17,17,17,17,17,17,16,16,16,16,16,16,16,16,16,16,
-
 
4180
   16,16,16,16,15,15,15,15,15,15,15,15,15,15,15,15,
-
 
4181
   15,15,15,15,14,14,14,14,14,14,14,14,14,14,14,14,
-
 
4182
   14,14,14,14,14,14,14,13,13,13,13,13,13,13,13,13,
-
 
4183
   13,13,13,13,13,13,13,13,13,13,13,13,13,13,12,12,
-
 
4184
   12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,
-
 
4185
   12,12,12,12,12,12,12,12,12,12,12,12,11,11,11,11,
-
 
4186
   11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
-
 
4187
   11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
-
 
4188
   11,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
-
 
4189
   10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
-
 
4190
   10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
-
 
4191
   10,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
-
 
4192
   9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
-
 
4193
   9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
-
 
4194
   9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
-
 
4195
   9,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
-
 
4196
   8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
-
 
4197
   8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
-
 
4198
   8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
-
 
4199
   8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
-
 
4200
   8,8,8,8,8,8,8,8,8,7,7,7,7,7,7,7,
-
 
4201
   7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
-
 
4202
   7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
-
 
4203
   7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
-
 
4204
};
-
 
4205
#endif /* SIMPLIFIED READ/WRITE sRGB support */
-
 
4206
 
-
 
4207
/* SIMPLIFIED READ/WRITE SUPPORT */
-
 
4208
#if defined(PNG_SIMPLIFIED_READ_SUPPORTED) ||\
-
 
4209
   defined(PNG_SIMPLIFIED_WRITE_SUPPORTED)
-
 
4210
static int
-
 
4211
png_image_free_function(png_voidp argument)
-
 
4212
{
-
 
4213
   png_imagep image = png_voidcast(png_imagep, argument);
-
 
4214
   png_controlp cp = image->opaque;
-
 
4215
   png_control c;
-
 
4216
 
-
 
4217
   /* Double check that we have a png_ptr - it should be impossible to get here
-
 
4218
    * without one.
-
 
4219
    */
-
 
4220
   if (cp->png_ptr == NULL)
-
 
4221
      return 0;
-
 
4222
 
-
 
4223
   /* First free any data held in the control structure. */
-
 
4224
#  ifdef PNG_STDIO_SUPPORTED
-
 
4225
      if (cp->owned_file)
-
 
4226
      {
-
 
4227
         FILE *fp = png_voidcast(FILE*, cp->png_ptr->io_ptr);
-
 
4228
         cp->owned_file = 0;
-
 
4229
 
-
 
4230
         /* Ignore errors here. */
-
 
4231
         if (fp != NULL)
-
 
4232
         {
-
 
4233
            cp->png_ptr->io_ptr = NULL;
-
 
4234
            (void)fclose(fp);
-
 
4235
         }
-
 
4236
      }
-
 
4237
#  endif
-
 
4238
 
-
 
4239
   /* Copy the control structure so that the original, allocated, version can be
-
 
4240
    * safely freed.  Notice that a png_error here stops the remainder of the
-
 
4241
    * cleanup, but this is probably fine because that would indicate bad memory
-
 
4242
    * problems anyway.
-
 
4243
    */
-
 
4244
   c = *cp;
-
 
4245
   image->opaque = &c;
-
 
4246
   png_free(c.png_ptr, cp);
-
 
4247
 
-
 
4248
   /* Then the structures, calling the correct API. */
-
 
4249
   if (c.for_write)
-
 
4250
   {
-
 
4251
#     ifdef PNG_SIMPLIFIED_WRITE_SUPPORTED
-
 
4252
         png_destroy_write_struct(&c.png_ptr, &c.info_ptr);
-
 
4253
#     else
-
 
4254
         png_error(c.png_ptr, "simplified write not supported");
-
 
4255
#     endif
-
 
4256
   }
-
 
4257
   else
-
 
4258
   {
-
 
4259
#     ifdef PNG_SIMPLIFIED_READ_SUPPORTED
-
 
4260
         png_destroy_read_struct(&c.png_ptr, &c.info_ptr, NULL);
-
 
4261
#     else
-
 
4262
         png_error(c.png_ptr, "simplified read not supported");
-
 
4263
#     endif
-
 
4264
   }
-
 
4265
 
-
 
4266
   /* Success. */
-
 
4267
   return 1;
-
 
4268
}
-
 
4269
 
-
 
4270
void PNGAPI
-
 
4271
png_image_free(png_imagep image)
-
 
4272
{
-
 
4273
   /* Safely call the real function, but only if doing so is safe at this point
-
 
4274
    * (if not inside an error handling context).  Otherwise assume
-
 
4275
    * png_safe_execute will call this API after the return.
-
 
4276
    */
-
 
4277
   if (image != NULL && image->opaque != NULL &&
-
 
4278
      image->opaque->error_buf == NULL)
-
 
4279
   {
-
 
4280
      /* Ignore errors here: */
-
 
4281
      (void)png_safe_execute(image, png_image_free_function, image);
-
 
4282
      image->opaque = NULL;
-
 
4283
   }
-
 
4284
}
-
 
4285
 
-
 
4286
int /* PRIVATE */
-
 
4287
png_image_error(png_imagep image, png_const_charp error_message)
-
 
4288
{
-
 
4289
   /* Utility to log an error. */
-
 
4290
   png_safecat(image->message, (sizeof image->message), 0, error_message);
-
 
4291
   image->warning_or_error |= PNG_IMAGE_ERROR;
-
 
4292
   png_image_free(image);
2357
#endif /* PNG_READ_BACKGROUND_SUPPORTED || PNG_RGB_TO_GRAY_SUPPORTED */
4293
   return 0;