removing CRCs from the acTl chunk and making all the chunks not-safe-for-copy. r=asmith15@learn.senecac.on.ca

This commit is contained in:
pavlov%pavlov.net 2007-03-21 18:55:05 +00:00
parent 5c851310ae
commit 042fe230a9
9 changed files with 158 additions and 204 deletions

View File

@ -51,9 +51,9 @@ PNG_tEXt;
PNG_tIME;
PNG_tRNS;
PNG_zTXt;
PNG_acTl;
PNG_fcTl;
PNG_fdAt;
PNG_acTL;
PNG_fcTL;
PNG_fdAT;
#ifdef PNG_READ_SUPPORTED
/* arrays to facilitate easy interlacing - use pass (0 - 6) as index */

View File

@ -1013,8 +1013,8 @@ typedef png_info FAR * FAR * png_infopp;
#define PNG_INFO_sPLT 0x2000 /* ESR, 1.0.6 */
#define PNG_INFO_sCAL 0x4000 /* ESR, 1.0.6 */
#define PNG_INFO_IDAT 0x8000L /* ESR, 1.0.6 */
#define PNG_INFO_acTl 0x10000L
#define PNG_INFO_fcTl 0x20000L
#define PNG_INFO_acTL 0x10000L
#define PNG_INFO_fcTL 0x20000L
/* This is used for the transformation routines, as some of them
* change these values for the row. It also should enable using
@ -1387,9 +1387,7 @@ struct png_struct_def
#if defined(PNG_APNG_SUPPORTED)
png_uint_32 apng_flags;
png_uint_32 IHDR_crc; /* read or written */
png_uint_32 PLTE_crc; /* read or written */
png_uint_32 next_seq_num; /* next fcTl/fdAt chunk sequence number */
png_uint_32 next_seq_num; /* next fcTL/fdAT chunk sequence number */
png_uint_32 first_frame_width;
png_uint_32 first_frame_height;
#endif
@ -1413,7 +1411,7 @@ struct png_struct_def
/* For png_struct.apng_flags: */
#define PNG_FIRST_FRAME_HIDDEN 0x0001
/* dispose_op flags from render_op inside fcTl */
/* dispose_op flags from render_op inside fcTL */
#define PNG_RENDER_OP_DISPOSE_MASK 0x07
#define PNG_RENDER_OP_DISPOSE_NONE 0x01
#define PNG_RENDER_OP_DISPOSE_BACKGROUND 0x02
@ -2431,24 +2429,24 @@ extern PNG_EXPORT(void,png_set_sCAL_s) PNGARG((png_structp png_ptr,
#endif /* PNG_sCAL_SUPPORTED || PNG_WRITE_sCAL_SUPPORTED */
#if defined(PNG_APNG_SUPPORTED)
extern PNG_EXPORT(png_uint_32,png_get_acTl) PNGARG((png_structp png_ptr,
extern PNG_EXPORT(png_uint_32,png_get_acTL) PNGARG((png_structp png_ptr,
png_infop info_ptr, png_uint_32 *num_frames, png_uint_32 *num_iterations));
extern PNG_EXPORT(png_uint_32,png_set_acTl) PNGARG((png_structp png_ptr,
extern PNG_EXPORT(png_uint_32,png_set_acTL) PNGARG((png_structp png_ptr,
png_infop info_ptr, png_uint_32 num_frames, png_uint_32 num_iterations));
extern PNG_EXPORT(png_uint_32,png_get_num_frames) PNGARG((png_structp png_ptr,
png_infop info_ptr));
extern PNG_EXPORT(png_uint_32,png_get_num_iterations)
PNGARG((png_structp png_ptr, png_infop info_ptr));
extern PNG_EXPORT(png_uint_32,png_get_next_frame_fcTl)
extern PNG_EXPORT(png_uint_32,png_get_next_frame_fcTL)
PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 *width,
png_uint_32 *height, png_uint_32 *x_offset, png_uint_32 *y_offset,
png_uint_16 *delay_num, png_uint_16 *delay_den, png_byte *render_op));
extern PNG_EXPORT(png_uint_32,png_set_next_frame_fcTl)
extern PNG_EXPORT(png_uint_32,png_set_next_frame_fcTL)
PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 width,
png_uint_32 height, png_uint_32 x_offset, png_uint_32 y_offset,
png_uint_16 delay_num, png_uint_16 delay_den, png_byte render_op));
extern PNG_EXPORT(void,png_ensure_fcTl_is_valid)
extern PNG_EXPORT(void,png_ensure_fcTL_is_valid)
PNGARG((png_structp png_ptr,
png_uint_32 width, png_uint_32 height,
png_uint_32 x_offset, png_uint_32 y_offset,
@ -2780,8 +2778,8 @@ extern PNG_EXPORT(void,png_save_uint_16)
#define PNG_BACKGROUND_IS_GRAY 0x800
#define PNG_HAVE_PNG_SIGNATURE 0x1000
#define PNG_HAVE_CHUNK_AFTER_IDAT 0x2000 /* Have another chunk after IDAT */
#define PNG_HAVE_acTl 0x4000
#define PNG_HAVE_fcTl 0x8000L
#define PNG_HAVE_acTL 0x4000
#define PNG_HAVE_fcTL 0x8000L
/* flags for the transformations the PNG library does on the image data */
#define PNG_BGR 0x0001
@ -2925,9 +2923,9 @@ extern PNG_EXPORT(void,png_save_uint_16)
#define PNG_tIME const png_byte png_tIME[5] = {116, 73, 77, 69, '\0'}
#define PNG_tRNS const png_byte png_tRNS[5] = {116, 82, 78, 83, '\0'}
#define PNG_zTXt const png_byte png_zTXt[5] = {122, 84, 88, 116, '\0'}
#define PNG_acTl const png_byte png_acTl[5] = { 97, 99, 84, 108, '\0'}
#define PNG_fcTl const png_byte png_fcTl[5] = {102, 99, 84, 108, '\0'}
#define PNG_fdAt const png_byte png_fdAt[5] = {102, 100, 65, 116, '\0'}
#define PNG_acTL const png_byte png_acTL[5] = { 97, 99, 84, 76, '\0'}
#define PNG_fcTL const png_byte png_fcTL[5] = {102, 99, 84, 76, '\0'}
#define PNG_fdAT const png_byte png_fdAT[5] = {102, 100, 65, 84, '\0'}
#ifdef PNG_USE_GLOBAL_ARRAYS
PNG_EXPORT_VAR (const png_byte FARDATA) png_IHDR[5];
@ -2951,9 +2949,9 @@ PNG_EXPORT_VAR (const png_byte FARDATA) png_tEXt[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_tIME[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_tRNS[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_zTXt[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_acTl[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_fcTl[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_fdAt[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_acTL[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_fcTL[5];
PNG_EXPORT_VAR (const png_byte FARDATA) png_fdAT[5];
#endif /* PNG_USE_GLOBAL_ARRAYS */
#if defined(PNG_1_0_X) || defined (PNG_1_2_X)
@ -3229,10 +3227,10 @@ PNG_EXTERN void png_write_sCAL_s PNGARG((png_structp png_ptr,
#endif
#if defined(PNG_WRITE_APNG_SUPPORTED)
PNG_EXTERN void png_write_acTl PNGARG((png_structp png_ptr,
PNG_EXTERN void png_write_acTL PNGARG((png_structp png_ptr,
png_uint_32 num_frames, png_uint_32 num_iterations));
PNG_EXTERN void png_write_fcTl PNGARG((png_structp png_ptr,
PNG_EXTERN void png_write_fcTL PNGARG((png_structp png_ptr,
png_uint_32 width, png_uint_32 height,
png_uint_32 x_offset, png_uint_32 y_offset,
png_uint_16 delay_num, png_uint_16 delay_den, png_byte render_op));
@ -3519,11 +3517,11 @@ PNG_EXTERN void png_handle_zTXt PNGARG((png_structp png_ptr, png_infop info_ptr,
#endif
#if defined(PNG_READ_APNG_SUPPORTED)
PNG_EXTERN void png_handle_acTl PNGARG((png_structp png_ptr, png_infop info_ptr,
PNG_EXTERN void png_handle_acTL PNGARG((png_structp png_ptr, png_infop info_ptr,
png_uint_32 length));
PNG_EXTERN void png_handle_fcTl PNGARG((png_structp png_ptr, png_infop info_ptr,
PNG_EXTERN void png_handle_fcTL PNGARG((png_structp png_ptr, png_infop info_ptr,
png_uint_32 length));
PNG_EXTERN void png_handle_fdAt PNGARG((png_structp png_ptr, png_infop info_ptr,
PNG_EXTERN void png_handle_fdAT PNGARG((png_structp png_ptr, png_infop info_ptr,
png_uint_32 length));
PNG_EXTERN void png_ensure_sequence_number PNGARG((png_structp png_ptr,
png_uint_32 length));

View File

@ -796,13 +796,13 @@ png_get_tRNS(png_structp png_ptr, png_infop info_ptr,
#if defined(PNG_APNG_SUPPORTED)
png_uint_32 PNGAPI
png_get_acTl(png_structp png_ptr, png_infop info_ptr,
png_get_acTL(png_structp png_ptr, png_infop info_ptr,
png_uint_32 *num_frames, png_uint_32 *num_iterations)
{
png_debug1(1, "in %s retrieval function\n", "acTl");
png_debug1(1, "in %s retrieval function\n", "acTL");
if (png_ptr != NULL && info_ptr != NULL &&
(info_ptr->valid & PNG_INFO_acTl) &&
(info_ptr->valid & PNG_INFO_acTL) &&
num_frames != NULL && num_iterations != NULL)
{
*num_frames = info_ptr->num_frames;
@ -834,16 +834,16 @@ png_get_num_iterations(png_structp png_ptr, png_infop info_ptr)
}
png_uint_32 PNGAPI
png_get_next_frame_fcTl(png_structp png_ptr, png_infop info_ptr,
png_get_next_frame_fcTL(png_structp png_ptr, png_infop info_ptr,
png_uint_32 *width, png_uint_32 *height,
png_uint_32 *x_offset, png_uint_32 *y_offset,
png_uint_16 *delay_num, png_uint_16 *delay_den,
png_byte *render_op)
{
png_debug1(1, "in %s retrieval function\n", "fcTl");
png_debug1(1, "in %s retrieval function\n", "fcTL");
if (png_ptr != NULL && info_ptr != NULL &&
(info_ptr->valid & PNG_INFO_fcTl) &&
(info_ptr->valid & PNG_INFO_fcTL) &&
width != NULL && height != NULL &&
x_offset != NULL && x_offset != NULL &&
delay_num != NULL && delay_den != NULL && render_op != NULL)
@ -937,8 +937,8 @@ png_first_frame_is_hidden(png_structp png_ptr, png_infop info_ptr)
png_debug(1, "in png_first_frame_is_hidden()\n");
if (png_ptr != NULL && info_ptr != NULL &&
info_ptr->valid & PNG_INFO_acTl &&
!(info_ptr->valid & PNG_INFO_fcTl))
info_ptr->valid & PNG_INFO_acTL &&
!(info_ptr->valid & PNG_INFO_fcTL))
return 1;
return 0;

View File

@ -191,9 +191,9 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
PNG_zTXt;
#endif
#if defined(PNG_READ_APNG_SUPPORTED)
PNG_acTl;
PNG_fcTl;
PNG_fdAt;
PNG_acTL;
PNG_fcTL;
PNG_fdAT;
#endif
#endif /* PNG_USE_LOCAL_ARRAYS */
/* First we make sure we have enough data for the 4 byte chunk name
@ -226,7 +226,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
{
/* discard trailing IDATs for the first frame */
if (png_ptr->mode & PNG_HAVE_fcTl || png_ptr->num_frames_read > 1)
if (png_ptr->mode & PNG_HAVE_fcTL || png_ptr->num_frames_read > 1)
png_error(png_ptr, "out of place IDAT");
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
@ -238,7 +238,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
return;
}
else if (!png_memcmp(png_ptr->chunk_name, png_fdAt, 4))
else if (!png_memcmp(png_ptr->chunk_name, png_fdAT, 4))
{
if (png_ptr->buffer_size < 4)
{
@ -247,11 +247,11 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
}
png_ensure_sequence_number(png_ptr, 4);
if (!(png_ptr->mode & PNG_HAVE_fcTl))
if (!(png_ptr->mode & PNG_HAVE_fcTL))
{
/* discard trailing fdAts for frames other than the first */
/* discard trailing fdATs for frames other than the first */
if (png_ptr->num_frames_read < 2)
png_error(png_ptr, "out of place fdAt");
png_error(png_ptr, "out of place fdAT");
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
{
@ -272,7 +272,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
return;
}
}
else if(!png_memcmp(png_ptr->chunk_name, png_fcTl, 4))
else if(!png_memcmp(png_ptr->chunk_name, png_fcTL, 4))
{
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
{
@ -281,12 +281,12 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
}
png_read_reset(png_ptr);
png_ptr->mode &= ~PNG_HAVE_fcTl;
png_ptr->mode &= ~PNG_HAVE_fcTL;
png_handle_fcTl(png_ptr, info_ptr, png_ptr->push_length);
png_handle_fcTL(png_ptr, info_ptr, png_ptr->push_length);
if (!(png_ptr->mode & PNG_HAVE_fcTl))
png_error(png_ptr, "missing required fcTl chunk");
if (!(png_ptr->mode & PNG_HAVE_fcTL))
png_error(png_ptr, "missing required fcTL chunk");
png_read_reinit(png_ptr, info_ptr);
png_progressive_read_reset(png_ptr);
@ -591,32 +591,32 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
}
#endif
#if defined(PNG_READ_APNG_SUPPORTED)
else if (!png_memcmp(png_ptr->chunk_name, png_acTl, 4))
else if (!png_memcmp(png_ptr->chunk_name, png_acTL, 4))
{
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
{
png_push_save_buffer(png_ptr);
return;
}
png_handle_acTl(png_ptr, info_ptr, png_ptr->push_length);
png_handle_acTL(png_ptr, info_ptr, png_ptr->push_length);
}
else if (!png_memcmp(png_ptr->chunk_name, png_fcTl, 4))
else if (!png_memcmp(png_ptr->chunk_name, png_fcTL, 4))
{
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
{
png_push_save_buffer(png_ptr);
return;
}
png_handle_fcTl(png_ptr, info_ptr, png_ptr->push_length);
png_handle_fcTL(png_ptr, info_ptr, png_ptr->push_length);
}
else if (!png_memcmp(png_ptr->chunk_name, png_fdAt, 4))
else if (!png_memcmp(png_ptr->chunk_name, png_fdAT, 4))
{
if (png_ptr->push_length + 4 > png_ptr->buffer_size)
{
png_push_save_buffer(png_ptr);
return;
}
png_handle_fdAt(png_ptr, info_ptr, png_ptr->push_length);
png_handle_fdAT(png_ptr, info_ptr, png_ptr->push_length);
}
#endif /* PNG_READ_APNG_SUPPORTED */
else
@ -790,7 +790,7 @@ png_push_read_IDAT(png_structp png_ptr)
#ifdef PNG_USE_LOCAL_ARRAYS
PNG_IDAT;
#if defined(PNG_READ_APNG_SUPPORTED)
PNG_fdAt;
PNG_fdAT;
PNG_IEND;
#endif
#endif
@ -811,7 +811,7 @@ png_push_read_IDAT(png_structp png_ptr)
png_ptr->mode |= PNG_HAVE_CHUNK_HEADER;
#if defined(PNG_READ_APNG_SUPPORTED)
if (png_memcmp(png_ptr->chunk_name, (png_bytep)png_fdAt, 4)
if (png_memcmp(png_ptr->chunk_name, (png_bytep)png_fdAT, 4)
&& png_ptr->num_frames_read > 0)
{
if (png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)

View File

@ -398,9 +398,9 @@ png_read_info(png_structp png_ptr, png_infop info_ptr)
PNG_zTXt;
#endif
#if defined(PNG_READ_APNG_SUPPORTED)
PNG_acTl;
PNG_fcTl;
PNG_fdAt;
PNG_acTL;
PNG_fcTL;
PNG_fdAT;
#endif
#endif /* PNG_USE_LOCAL_ARRAYS */
png_byte chunk_length[4];
@ -528,12 +528,12 @@ png_read_info(png_structp png_ptr, png_infop info_ptr)
png_handle_iTXt(png_ptr, info_ptr, length);
#endif
#if defined(PNG_READ_APNG_SUPPORTED)
else if (!png_memcmp(png_ptr->chunk_name, png_acTl, 4))
png_handle_acTl(png_ptr, info_ptr, length);
else if (!png_memcmp(png_ptr->chunk_name, png_fcTl, 4))
png_handle_fcTl(png_ptr, info_ptr, length);
else if (!png_memcmp(png_ptr->chunk_name, png_fdAt, 4))
png_handle_fdAt(png_ptr, info_ptr, length);
else if (!png_memcmp(png_ptr->chunk_name, png_acTL, 4))
png_handle_acTL(png_ptr, info_ptr, length);
else if (!png_memcmp(png_ptr->chunk_name, png_fcTL, 4))
png_handle_fcTL(png_ptr, info_ptr, length);
else if (!png_memcmp(png_ptr->chunk_name, png_fdAT, 4))
png_handle_fdAT(png_ptr, info_ptr, length);
#endif
else
png_handle_unknown(png_ptr, info_ptr, length);
@ -545,30 +545,30 @@ png_read_info(png_structp png_ptr, png_infop info_ptr)
void PNGAPI
png_read_frame_head(png_structp png_ptr, png_infop info_ptr)
{
png_byte have_chunk_after_DAT; /* after IDAT or after fdAt */
png_byte have_chunk_after_DAT; /* after IDAT or after fdAT */
png_debug(0, "Reading frame head\n");
if (!(png_ptr->mode & PNG_HAVE_acTl))
if (!(png_ptr->mode & PNG_HAVE_acTL))
png_error(png_ptr, "attempt to png_read_frame_head() but "
"no acTl present");
"no acTL present");
/* do nothing for the main IDAT */
if (png_ptr->num_frames_read == 0)
return;
png_crc_finish(png_ptr, 0); /* CRC from last IDAT or fdAt chunk */
png_crc_finish(png_ptr, 0); /* CRC from last IDAT or fdAT chunk */
png_read_reset(png_ptr);
png_ptr->mode &= ~PNG_HAVE_fcTl;
png_ptr->mode &= ~PNG_HAVE_fcTL;
have_chunk_after_DAT = 0;
for (;;)
{
#ifdef PNG_USE_LOCAL_ARRAYS
PNG_IDAT;
PNG_fdAt;
PNG_fcTl;
PNG_fdAT;
PNG_fcTL;
#endif
png_byte chunk_length[4];
png_uint_32 length;
@ -586,19 +586,19 @@ png_read_frame_head(png_structp png_ptr, png_infop info_ptr)
png_error(png_ptr, "png_read_frame_head(): out of place IDAT");
png_crc_finish(png_ptr, length);
}
else if (!png_memcmp(png_ptr->chunk_name, png_fcTl, 4))
else if (!png_memcmp(png_ptr->chunk_name, png_fcTL, 4))
{
png_handle_fcTl(png_ptr, info_ptr, length);
png_handle_fcTL(png_ptr, info_ptr, length);
have_chunk_after_DAT = 1;
}
else if (!png_memcmp(png_ptr->chunk_name, png_fdAt, 4))
else if (!png_memcmp(png_ptr->chunk_name, png_fdAT, 4))
{
png_ensure_sequence_number(png_ptr, length);
/* discard trailing fdAts for frames other than the first */
/* discard trailing fdATs for frames other than the first */
if (!have_chunk_after_DAT && png_ptr->num_frames_read > 1)
png_crc_finish(png_ptr, length - 4);
else if(png_ptr->mode & PNG_HAVE_fcTl)
else if(png_ptr->mode & PNG_HAVE_fcTL)
{
png_ptr->idat_size = length - 4;
png_ptr->mode |= PNG_HAVE_IDAT;
@ -606,7 +606,7 @@ png_read_frame_head(png_structp png_ptr, png_infop info_ptr)
break;
}
else
png_error(png_ptr, "png_read_frame_head(): out of place fdAt");
png_error(png_ptr, "png_read_frame_head(): out of place fdAT");
}
else
{
@ -653,7 +653,7 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
#ifdef PNG_USE_LOCAL_ARRAYS
PNG_IDAT;
#if defined(PNG_READ_APNG_SUPPORTED)
PNG_fdAt;
PNG_fdAT;
PNG_IEND;
#endif
const int png_pass_dsp_mask[7] = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff};
@ -810,7 +810,7 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
{
if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4))
png_error(png_ptr, "Not enough image data");
if (png_memcmp(png_ptr->chunk_name, png_fdAt, 4))
if (png_memcmp(png_ptr->chunk_name, png_fdAT, 4))
{
png_warning(png_ptr, "Skipped (ignored) a chunk "
"between APNG chunks");
@ -1095,9 +1095,9 @@ png_read_end(png_structp png_ptr, png_infop info_ptr)
PNG_zTXt;
#endif
#if defined(PNG_READ_APNG_SUPPORTED)
PNG_acTl;
PNG_fcTl;
PNG_fdAt;
PNG_acTL;
PNG_fcTL;
PNG_fdAT;
#endif
#endif /* PNG_USE_LOCAL_ARRAYS */
@ -1206,12 +1206,12 @@ png_read_end(png_structp png_ptr, png_infop info_ptr)
png_handle_iTXt(png_ptr, info_ptr, length);
#endif
#if defined(PNG_READ_APNG_SUPPORTED)
else if (!png_memcmp(png_ptr->chunk_name, png_acTl, 4))
png_handle_acTl(png_ptr, info_ptr, length);
else if (!png_memcmp(png_ptr->chunk_name, png_fcTl, 4))
png_handle_fcTl(png_ptr, info_ptr, length);
else if (!png_memcmp(png_ptr->chunk_name, png_fdAt, 4))
png_handle_fdAt(png_ptr, info_ptr, length);
else if (!png_memcmp(png_ptr->chunk_name, png_acTL, 4))
png_handle_acTL(png_ptr, info_ptr, length);
else if (!png_memcmp(png_ptr->chunk_name, png_fcTL, 4))
png_handle_fcTL(png_ptr, info_ptr, length);
else if (!png_memcmp(png_ptr->chunk_name, png_fdAT, 4))
png_handle_fdAT(png_ptr, info_ptr, length);
#endif
else
png_handle_unknown(png_ptr, info_ptr, length);

View File

@ -364,7 +364,6 @@ png_handle_IHDR(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
interlace_type = buf[12];
#if defined(PNG_READ_APNG_SUPPORTED)
png_ptr->IHDR_crc = png_ptr->crc;
png_ptr->first_frame_width = width;
png_ptr->first_frame_height = height;
#endif
@ -527,19 +526,6 @@ png_handle_PLTE(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
png_set_PLTE(png_ptr, info_ptr, palette, num);
#if defined(PNG_READ_APNG_SUPPORTED)
if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
{
if (png_ptr->mode & PNG_HAVE_acTl)
{
if (png_ptr->crc != png_ptr->PLTE_crc)
png_error(png_ptr, "PLTE checksum does not match that in acTl");
}
else
png_ptr->PLTE_crc = png_ptr->crc;
}
#endif
#if defined(PNG_READ_tRNS_SUPPORTED)
if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
{
@ -2151,78 +2137,58 @@ png_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
#if defined(PNG_READ_APNG_SUPPORTED)
void /* PRIVATE */
png_handle_acTl(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
png_handle_acTL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
{
png_byte data[16];
png_byte data[8];
png_uint_32 num_frames;
png_uint_32 num_iterations;
png_uint_32 didSet;
png_uint_32 IHDR_crc;
png_uint_32 PLTE_crc;
png_debug(1, "in png_handle_acTl\n");
png_debug(1, "in png_handle_acTL\n");
if (!(png_ptr->mode & PNG_HAVE_IHDR))
{
png_error(png_ptr, "Missing IHDR before acTl");
png_error(png_ptr, "Missing IHDR before acTL");
}
else if (png_ptr->mode & PNG_HAVE_IDAT)
{
png_warning(png_ptr, "Invalid acTl after IDAT skipped");
png_warning(png_ptr, "Invalid acTL after IDAT skipped");
png_crc_finish(png_ptr, length);
return;
}
else if (png_ptr->mode & PNG_HAVE_acTl)
else if (png_ptr->mode & PNG_HAVE_acTL)
{
png_warning(png_ptr, "Duplicate acTl skipped");
png_warning(png_ptr, "Duplicate acTL skipped");
png_crc_finish(png_ptr, length);
return;
}
else if (length != 16)
else if (length != 8)
{
png_warning(png_ptr, "acTl with invalid length skipped");
png_warning(png_ptr, "acTL with invalid length skipped");
png_crc_finish(png_ptr, length);
return;
}
png_crc_read(png_ptr, data, 16);
png_crc_read(png_ptr, data, 8);
png_crc_finish(png_ptr, 0);
num_frames = png_get_uint_31(png_ptr, data);
num_iterations = png_get_uint_31(png_ptr, data + 4);
IHDR_crc = png_get_uint_32(data + 8);
PLTE_crc = png_get_uint_32(data + 12);
if (IHDR_crc != png_ptr->IHDR_crc)
{
png_warning(png_ptr, "acTl with invalid IHDR checksum skipped");
return;
}
if (png_ptr->mode & PNG_HAVE_PLTE)
{
if (PLTE_crc != png_ptr->PLTE_crc)
{
png_warning(png_ptr, "acTl with invalid PLTE checksum skipped");
return;
}
}
else
png_ptr->PLTE_crc = PLTE_crc;
/* the set function will do error checking on num_frames */
didSet = png_set_acTl(png_ptr, info_ptr, num_frames, num_iterations);
didSet = png_set_acTL(png_ptr, info_ptr, num_frames, num_iterations);
if(didSet)
{
png_ptr->mode |= PNG_HAVE_acTl;
png_ptr->mode |= PNG_HAVE_acTL;
/* if there is an fcTl this flag will be unset in png_handle_fcTl() */
/* if there is an fcTL this flag will be unset in png_handle_fcTL() */
if (num_frames > 1)
png_ptr->apng_flags |= PNG_FIRST_FRAME_HIDDEN;
}
}
void /* PRIVATE */
png_handle_fcTl(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
png_handle_fcTL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
{
png_byte data[21];
png_uint_32 width;
@ -2233,30 +2199,30 @@ png_handle_fcTl(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
png_uint_16 delay_den;
png_byte render_op;
png_debug(1, "in png_handle_fcTl\n");
png_debug(1, "in png_handle_fcTL\n");
if (!(png_ptr->mode & PNG_HAVE_IHDR))
{
png_error(png_ptr, "Missing IHDR before fcTl");
png_error(png_ptr, "Missing IHDR before fcTL");
}
else if (png_ptr->mode & PNG_HAVE_IDAT)
{
/* for any frames other then the first this message may be misleading,
* but correct. PNG_HAVE_IDAT is unset before the frame head is read
* i can't think of a better message */
png_warning(png_ptr, "Invalid fcTl after IDAT skipped");
png_warning(png_ptr, "Invalid fcTL after IDAT skipped");
png_crc_finish(png_ptr, length);
return;
}
else if (png_ptr->mode & PNG_HAVE_fcTl)
else if (png_ptr->mode & PNG_HAVE_fcTL)
{
png_warning(png_ptr, "Duplicate fcTl within one frame skipped");
png_warning(png_ptr, "Duplicate fcTL within one frame skipped");
png_crc_finish(png_ptr, length);
return;
}
else if (length != 25)
{
png_warning(png_ptr, "fcTl with invalid length skipped");
png_warning(png_ptr, "fcTL with invalid length skipped");
png_crc_finish(png_ptr, length);
return;
}
@ -2275,35 +2241,35 @@ png_handle_fcTl(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
render_op = data[20];
if (png_ptr->num_frames_read == 0 && (x_offset != 0 || y_offset != 0))
png_error(png_ptr, "fcTl for the first frame must have zero offset");
png_error(png_ptr, "fcTL for the first frame must have zero offset");
if (png_ptr->num_frames_read == 0 &&
(width != info_ptr->width || height != info_ptr->height))
png_error(png_ptr, "size in first frame's fcTl must match "
png_error(png_ptr, "size in first frame's fcTL must match "
"the size in IHDR");
/* the set function will do more error checking */
png_set_next_frame_fcTl(png_ptr, info_ptr, width, height,
png_set_next_frame_fcTL(png_ptr, info_ptr, width, height,
x_offset, y_offset, delay_num, delay_den,
render_op);
png_read_reinit(png_ptr, info_ptr);
png_ptr->mode |= PNG_HAVE_fcTl;
png_ptr->mode |= PNG_HAVE_fcTL;
png_ptr->apng_flags &= ~PNG_FIRST_FRAME_HIDDEN;
}
void /* PRIVATE */
png_handle_fdAt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
png_handle_fdAT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
{
png_ensure_sequence_number(png_ptr, length);
/* This function is only called from png_read_end(), png_read_info(),
* and png_push_read_chunk() which means that:
* - the user doesn't want to read this frame
* - or this is an out-of-place fdAt
* - or this is an out-of-place fdAT
* in either case it is safe to ignore the chunk with a warning */
png_warning(png_ptr, "ignoring fdAt chunk");
png_warning(png_ptr, "ignoring fdAT chunk");
png_crc_finish(png_ptr, length - 4);
}
@ -2314,13 +2280,13 @@ png_ensure_sequence_number(png_structp png_ptr, png_uint_32 length)
png_uint_32 sequence_number;
if (length < 4)
png_error(png_ptr, "invalid fcTl or fdAt chunk found");
png_error(png_ptr, "invalid fcTL or fdAT chunk found");
png_crc_read(png_ptr, data, 4);
sequence_number = png_get_uint_31(png_ptr, data);
if (sequence_number != png_ptr->next_seq_num)
png_error(png_ptr, "fcTl or fdAt chunk with out-of-order sequence "
png_error(png_ptr, "fcTL or fdAT chunk with out-of-order sequence "
"number found");
png_ptr->next_seq_num++;

View File

@ -364,7 +364,7 @@ png_set_IHDR(png_structp png_ptr, png_infop info_ptr,
info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth,width);
#if defined(PNG_APNG_SUPPORTED)
/* for non-animated png. this may be overritten from an acTl chunk later */
/* for non-animated png. this may be overritten from an acTL chunk later */
info_ptr->num_frames = 1;
#endif
}
@ -1000,34 +1000,34 @@ png_set_sPLT(png_structp png_ptr,
#if defined(PNG_APNG_SUPPORTED)
png_uint_32 PNGAPI
png_set_acTl(png_structp png_ptr, png_infop info_ptr,
png_set_acTL(png_structp png_ptr, png_infop info_ptr,
png_uint_32 num_frames, png_uint_32 num_iterations)
{
png_debug1(1, "in %s storage function\n", "acTl");
png_debug1(1, "in %s storage function\n", "acTL");
if (png_ptr == NULL || info_ptr == NULL)
{
png_warning(png_ptr,
"Call to png_set_acTl() with NULL png_ptr "
"Call to png_set_acTL() with NULL png_ptr "
"or info_ptr ignored");
return (0);
}
if(num_frames == 0)
{
png_warning(png_ptr,
"Ignoring attempt to set acTl with num_frames zero");
"Ignoring attempt to set acTL with num_frames zero");
return (0);
}
if(num_frames > PNG_UINT_31_MAX)
{
png_warning(png_ptr,
"Ignoring attempt to set acTl with num_frames > 2^31-1");
"Ignoring attempt to set acTL with num_frames > 2^31-1");
return (0);
}
if(num_iterations > PNG_UINT_31_MAX)
{
png_warning(png_ptr,
"Ignoring attempt to set acTl with num_iterations "
"Ignoring attempt to set acTL with num_iterations "
"> 2^31-1");
return (0);
}
@ -1035,30 +1035,30 @@ png_set_acTl(png_structp png_ptr, png_infop info_ptr,
info_ptr->num_frames = num_frames;
info_ptr->num_iterations = num_iterations;
info_ptr->valid |= PNG_INFO_acTl;
info_ptr->valid |= PNG_INFO_acTL;
return (1);
}
/* delay_num and delay_den can hold any values including zero */
png_uint_32 PNGAPI
png_set_next_frame_fcTl(png_structp png_ptr, png_infop info_ptr,
png_set_next_frame_fcTL(png_structp png_ptr, png_infop info_ptr,
png_uint_32 width, png_uint_32 height,
png_uint_32 x_offset, png_uint_32 y_offset,
png_uint_16 delay_num, png_uint_16 delay_den,
png_byte render_op)
{
png_debug1(1, "in %s storage function\n", "fcTl");
png_debug1(1, "in %s storage function\n", "fcTL");
if (png_ptr == NULL || info_ptr == NULL)
{
png_warning(png_ptr,
"Call to png_set_fcTl() with NULL png_ptr or info_ptr "
"Call to png_set_fcTL() with NULL png_ptr or info_ptr "
"ignored");
return (0);
}
png_ensure_fcTl_is_valid(png_ptr, width, height, x_offset, y_offset,
png_ensure_fcTL_is_valid(png_ptr, width, height, x_offset, y_offset,
delay_num, delay_den, render_op);
info_ptr->next_frame_width = width;
@ -1069,13 +1069,13 @@ png_set_next_frame_fcTl(png_structp png_ptr, png_infop info_ptr,
info_ptr->next_frame_delay_den = delay_den;
info_ptr->next_frame_render_op = render_op;
info_ptr->valid |= PNG_INFO_fcTl;
info_ptr->valid |= PNG_INFO_fcTL;
return (1);
}
void /* PRIVATE */
png_ensure_fcTl_is_valid(png_structp png_ptr,
png_ensure_fcTL_is_valid(png_structp png_ptr,
png_uint_32 width, png_uint_32 height,
png_uint_32 x_offset, png_uint_32 y_offset,
png_uint_16 delay_num, png_uint_16 delay_den,
@ -1086,16 +1086,16 @@ png_ensure_fcTl_is_valid(png_structp png_ptr,
png_error(png_ptr, "width and/or height for a frame greater than"
"the ones in IHDR");
if (width > PNG_UINT_31_MAX)
png_error(png_ptr, "invalid width in fcTl (> 2^31-1)");
png_error(png_ptr, "invalid width in fcTL (> 2^31-1)");
if (height > PNG_UINT_31_MAX)
png_error(png_ptr, "invalid height in fcTl (> 2^31-1)");
png_error(png_ptr, "invalid height in fcTL (> 2^31-1)");
if (x_offset > PNG_UINT_31_MAX)
png_error(png_ptr, "invalid x_offset in fcTl (> 2^31-1)");
png_error(png_ptr, "invalid x_offset in fcTL (> 2^31-1)");
if (y_offset > PNG_UINT_31_MAX)
png_error(png_ptr, "invalid y_offset in fcTl (> 2^31-1)");
png_error(png_ptr, "invalid y_offset in fcTL (> 2^31-1)");
if (render_op & 0xF0)
/* Bits 4 through 7 are reserved and must be set to zero (APNG spec) */
png_error(png_ptr, "invalid render_op in fcTl");
png_error(png_ptr, "invalid render_op in fcTL");
if (render_op & 0x08 && png_ptr->color_type == PNG_COLOR_TYPE_GRAY)
png_error(png_ptr, "APNG_RENDER_OP_BLEND_FLAG is not valid for "
"color type 'greyscale without alpha'");
@ -1105,11 +1105,11 @@ png_ensure_fcTl_is_valid(png_structp png_ptr,
png_error(png_ptr, "APNG_RENDER_OP_BLEND_FLAG is not valid for "
"color type 'truecolor without alpha'");
if (!(render_op & PNG_RENDER_OP_DISPOSE_MASK))
png_error(png_ptr, "no DISPOSE_ flag found in fcTl");
png_error(png_ptr, "no DISPOSE_ flag found in fcTL");
if ( (render_op & PNG_RENDER_OP_DISPOSE_MASK) != PNG_RENDER_OP_DISPOSE_NONE &&
(render_op & PNG_RENDER_OP_DISPOSE_MASK) != PNG_RENDER_OP_DISPOSE_BACKGROUND &&
(render_op & PNG_RENDER_OP_DISPOSE_MASK) != PNG_RENDER_OP_DISPOSE_PREVIOUS)
png_error(png_ptr, "multiple DISPOSE_ flags set in fcTl");
png_error(png_ptr, "multiple DISPOSE_ flags set in fcTL");
}
#endif /* PNG_APNG_SUPPORTED */

View File

@ -262,8 +262,8 @@ png_write_info(png_structp png_ptr, png_infop info_ptr)
}
#endif
#if defined(PNG_WRITE_APNG_SUPPORTED)
if (info_ptr->valid & PNG_INFO_acTl)
png_write_acTl(png_ptr, info_ptr->num_frames, info_ptr->num_iterations);
if (info_ptr->valid & PNG_INFO_acTL)
png_write_acTL(png_ptr, info_ptr->num_frames, info_ptr->num_iterations);
#endif
#if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED)
if (info_ptr->unknown_chunks_num)
@ -1531,15 +1531,15 @@ png_write_frame_head(png_structp png_ptr, png_infop info_ptr,
/* there is a chance this has been set after png_write_info was called,
* so it would be set but not written. is there a way to be sure? */
if (!(info_ptr->valid & PNG_INFO_acTl))
png_error(png_ptr, "png_write_frame_head(): acTl not set");
if (!(info_ptr->valid & PNG_INFO_acTL))
png_error(png_ptr, "png_write_frame_head(): acTL not set");
png_write_reset(png_ptr);
png_write_reinit(png_ptr, info_ptr, width, height);
if ( !(png_ptr->num_frames_written == 0 && first_frame_hidden) )
png_write_fcTl(png_ptr, width, height, x_offset, y_offset,
png_write_fcTL(png_ptr, width, height, x_offset, y_offset,
delay_num, delay_den, render_op);
}

View File

@ -492,7 +492,6 @@ png_write_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height,
png_write_chunk(png_ptr, (png_bytep)png_IHDR, buf, (png_size_t)13);
#if defined(PNG_WRITE_APNG_SUPPORTED)
png_ptr->IHDR_crc = png_ptr->crc;
png_ptr->first_frame_width = width;
png_ptr->first_frame_height = height;
#endif
@ -600,13 +599,6 @@ png_write_PLTE(png_structp png_ptr, png_colorp palette, png_uint_32 num_pal)
#endif
png_write_chunk_end(png_ptr);
png_ptr->mode |= PNG_HAVE_PLTE;
#if defined(PNG_WRITE_APNG_SUPPORTED)
if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
{
png_ptr->PLTE_crc = png_ptr->crc;
}
#endif
}
/* write an IDAT chunk */
@ -616,7 +608,7 @@ png_write_IDAT(png_structp png_ptr, png_bytep data, png_size_t length)
#ifdef PNG_USE_LOCAL_ARRAYS
PNG_IDAT;
#if defined(PNG_WRITE_APNG_SUPPORTED)
PNG_fdAt;
PNG_fdAT;
#endif
#endif
png_debug(1, "in png_write_IDAT\n");
@ -669,7 +661,7 @@ png_write_IDAT(png_structp png_ptr, png_bytep data, png_size_t length)
{
png_byte buf[4];
png_write_chunk_start(png_ptr, (png_bytep)png_fdAt, 4 + length);
png_write_chunk_start(png_ptr, (png_bytep)png_fdAT, 4 + length);
png_save_uint_32(buf, png_ptr->next_seq_num);
png_write_chunk_data(png_ptr, buf, 4);
@ -1732,57 +1724,55 @@ png_write_tIME(png_structp png_ptr, png_timep mod_time)
#if defined(PNG_WRITE_APNG_SUPPORTED)
void /* PRIVATE */
png_write_acTl(png_structp png_ptr,
png_write_acTL(png_structp png_ptr,
png_uint_32 num_frames, png_uint_32 num_iterations)
{
#ifdef PNG_USE_LOCAL_ARRAYS
PNG_acTl;
PNG_acTL;
#endif
png_byte data[16];
png_debug(1, "in png_write_acTl\n");
png_debug(1, "in png_write_acTL\n");
if (num_frames == 0)
png_error(png_ptr, "png_write_acTl: invalid number of frames (0)");
png_error(png_ptr, "png_write_acTL: invalid number of frames (0)");
if (num_frames > PNG_UINT_31_MAX)
png_error(png_ptr, "png_write_acTl: invalid number of frames "
png_error(png_ptr, "png_write_acTL: invalid number of frames "
"(> 2^31-1)");
if (num_iterations > PNG_UINT_31_MAX)
png_error(png_ptr, "png_write_acTl: invalid number of iterations "
png_error(png_ptr, "png_write_acTL: invalid number of iterations "
"(> 2^31-1)");
png_ptr->num_frames_to_write = num_frames;
png_save_uint_32(data, num_frames);
png_save_uint_32(data + 4, num_iterations);
png_save_uint_32(data + 8, png_ptr->IHDR_crc);
png_save_uint_32(data + 12, png_ptr->PLTE_crc);
png_write_chunk(png_ptr, (png_bytep)png_acTl, data, (png_size_t)16);
png_write_chunk(png_ptr, (png_bytep)png_acTL, data, (png_size_t)8);
}
void /* PRIVATE */
png_write_fcTl(png_structp png_ptr, png_uint_32 width, png_uint_32 height,
png_write_fcTL(png_structp png_ptr, png_uint_32 width, png_uint_32 height,
png_uint_32 x_offset, png_uint_32 y_offset,
png_uint_16 delay_num, png_uint_16 delay_den, png_byte render_op)
{
#ifdef PNG_USE_LOCAL_ARRAYS
PNG_fcTl;
PNG_fcTL;
#endif
png_byte data[25];
png_debug(1, "in png_write_fcTl\n");
png_debug(1, "in png_write_fcTL\n");
if (png_ptr->num_frames_written == 0 && (x_offset != 0 || y_offset != 0))
png_error(png_ptr, "x and/or y offset for the first frame aren't 0\n");
if (png_ptr->num_frames_written == 0 &&
(width != png_ptr->first_frame_width ||
height != png_ptr->first_frame_height))
png_error(png_ptr, "width and/or height in the first frame's fcTl "
png_error(png_ptr, "width and/or height in the first frame's fcTL "
"don't match the ones in IHDR\n");
/* more error checking */
png_ensure_fcTl_is_valid(png_ptr, width, height, x_offset, y_offset,
png_ensure_fcTL_is_valid(png_ptr, width, height, x_offset, y_offset,
delay_num, delay_den, render_op);
png_save_uint_32(data, png_ptr->next_seq_num);
@ -1794,7 +1784,7 @@ png_write_fcTl(png_structp png_ptr, png_uint_32 width, png_uint_32 height,
png_save_uint_16(data + 22, delay_den);
data[24] = render_op;
png_write_chunk(png_ptr, (png_bytep)png_fcTl, data, (png_size_t)25);
png_write_chunk(png_ptr, (png_bytep)png_fcTL, data, (png_size_t)25);
png_ptr->next_seq_num++;
}
@ -2877,7 +2867,7 @@ png_write_reinit(png_structp png_ptr, png_infop info_ptr,
if (png_ptr->num_frames_written == 0 &&
(width != png_ptr->first_frame_width ||
height != png_ptr->first_frame_height))
png_error(png_ptr, "width and/or height in the first frame's fcTl "
png_error(png_ptr, "width and/or height in the first frame's fcTL "
"don't match the ones in IHDR\n");
if (width > png_ptr->first_frame_width ||
height > png_ptr->first_frame_height)