[libpng15] Add ability to call png_read_update_info multiple times to pngvalid.c
This commit is contained in:
parent
07772cba07
commit
57cbcf6b8f
5
ANNOUNCE
5
ANNOUNCE
@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
Libpng 1.5.6beta06 - October 14, 2011
|
Libpng 1.5.6beta06 - October 15, 2011
|
||||||
|
|
||||||
This is not intended to be a public release. It will be replaced
|
This is not intended to be a public release. It will be replaced
|
||||||
within a few weeks by a public version or by another test version.
|
within a few weeks by a public version or by another test version.
|
||||||
@ -70,10 +70,11 @@ Version 1.5.6beta05 [October 12, 2011]
|
|||||||
previously possible because the png_struct buffer was always misaligned.
|
previously possible because the png_struct buffer was always misaligned.
|
||||||
Fixed bug in png_write_chunk_header() debug print, introduced in 1.5.6beta01.
|
Fixed bug in png_write_chunk_header() debug print, introduced in 1.5.6beta01.
|
||||||
|
|
||||||
Version 1.5.6beta06 [October 14, 2011]
|
Version 1.5.6beta06 [October 15, 2011]
|
||||||
Removed two redundant tests for unitialized row.
|
Removed two redundant tests for unitialized row.
|
||||||
Fixed a relatively harmless memory overwrite in compressed text writing
|
Fixed a relatively harmless memory overwrite in compressed text writing
|
||||||
with a 1 byte zlib buffer.
|
with a 1 byte zlib buffer.
|
||||||
|
Add ability to call png_read_update_info multiple times to pngvalid.c
|
||||||
Fixes for multiple calls to png_read_update_info. These fixes attend to
|
Fixes for multiple calls to png_read_update_info. These fixes attend to
|
||||||
most of the errors revealed in pngvalid, however doing the gamma work
|
most of the errors revealed in pngvalid, however doing the gamma work
|
||||||
twice results in inaccuracies that can't be easily fixed. There is now
|
twice results in inaccuracies that can't be easily fixed. There is now
|
||||||
|
3
CHANGES
3
CHANGES
@ -3631,10 +3631,11 @@ Version 1.5.6beta05 [October 12, 2011]
|
|||||||
previously possible because the png_struct buffer was always misaligned.
|
previously possible because the png_struct buffer was always misaligned.
|
||||||
Fixed bug in png_write_chunk_header() debug print, introduced in 1.5.6beta01.
|
Fixed bug in png_write_chunk_header() debug print, introduced in 1.5.6beta01.
|
||||||
|
|
||||||
Version 1.5.6beta06 [October 14, 2011]
|
Version 1.5.6beta06 [October 15, 2011]
|
||||||
Removed two redundant tests for unitialized row.
|
Removed two redundant tests for unitialized row.
|
||||||
Fixed a relatively harmless memory overwrite in compressed text writing
|
Fixed a relatively harmless memory overwrite in compressed text writing
|
||||||
with a 1 byte zlib buffer.
|
with a 1 byte zlib buffer.
|
||||||
|
Add ability to call png_read_update_info multiple times to pngvalid.c.
|
||||||
Fixes for multiple calls to png_read_update_info. These fixes attend to
|
Fixes for multiple calls to png_read_update_info. These fixes attend to
|
||||||
most of the errors revealed in pngvalid, however doing the gamma work
|
most of the errors revealed in pngvalid, however doing the gamma work
|
||||||
twice results in inaccuracies that can't be easily fixed. There is now
|
twice results in inaccuracies that can't be easily fixed. There is now
|
||||||
|
70
pngvalid.c
70
pngvalid.c
@ -1715,6 +1715,11 @@ typedef struct png_modifier
|
|||||||
double error_indexed;
|
double error_indexed;
|
||||||
|
|
||||||
/* Flags: */
|
/* Flags: */
|
||||||
|
/* Whether to call png_read_update_info, not png_read_start_image, and how
|
||||||
|
* many times to call it.
|
||||||
|
*/
|
||||||
|
int use_update_info;
|
||||||
|
|
||||||
/* Whether or not to interlace. */
|
/* Whether or not to interlace. */
|
||||||
int interlace_type :9; /* int, but must store '1' */
|
int interlace_type :9; /* int, but must store '1' */
|
||||||
|
|
||||||
@ -1798,6 +1803,7 @@ modifier_init(png_modifier *pm)
|
|||||||
pm->error_gray_2 = pm->error_gray_4 = pm->error_gray_8 = 0;
|
pm->error_gray_2 = pm->error_gray_4 = pm->error_gray_8 = 0;
|
||||||
pm->error_gray_16 = pm->error_color_8 = pm->error_color_16 = 0;
|
pm->error_gray_16 = pm->error_color_8 = pm->error_color_16 = 0;
|
||||||
pm->error_indexed = 0;
|
pm->error_indexed = 0;
|
||||||
|
pm->use_update_info = 0;
|
||||||
pm->interlace_type = PNG_INTERLACE_NONE;
|
pm->interlace_type = PNG_INTERLACE_NONE;
|
||||||
pm->test_standard = 0;
|
pm->test_standard = 0;
|
||||||
pm->test_size = 0;
|
pm->test_size = 0;
|
||||||
@ -3884,6 +3890,7 @@ typedef struct standard_display
|
|||||||
int do_interlace; /* Do interlacing internally */
|
int do_interlace; /* Do interlacing internally */
|
||||||
int is_transparent; /* Transparency information was present. */
|
int is_transparent; /* Transparency information was present. */
|
||||||
int speed; /* Doing a speed test */
|
int speed; /* Doing a speed test */
|
||||||
|
int use_update_info;/* Call update_info, not start_image */
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
png_uint_16 red;
|
png_uint_16 red;
|
||||||
@ -3897,7 +3904,7 @@ typedef struct standard_display
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
standard_display_init(standard_display *dp, png_store* ps, png_uint_32 id,
|
standard_display_init(standard_display *dp, png_store* ps, png_uint_32 id,
|
||||||
int do_interlace)
|
int do_interlace, int use_update_info)
|
||||||
{
|
{
|
||||||
memset(dp, 0, sizeof *dp);
|
memset(dp, 0, sizeof *dp);
|
||||||
|
|
||||||
@ -3921,6 +3928,7 @@ standard_display_init(standard_display *dp, png_store* ps, png_uint_32 id,
|
|||||||
dp->do_interlace = do_interlace;
|
dp->do_interlace = do_interlace;
|
||||||
dp->is_transparent = 0;
|
dp->is_transparent = 0;
|
||||||
dp->speed = ps->speed;
|
dp->speed = ps->speed;
|
||||||
|
dp->use_update_info = use_update_info;
|
||||||
dp->npalette = 0;
|
dp->npalette = 0;
|
||||||
/* Preset the transparent color to black: */
|
/* Preset the transparent color to black: */
|
||||||
memset(&dp->transparent, 0, sizeof dp->transparent);
|
memset(&dp->transparent, 0, sizeof dp->transparent);
|
||||||
@ -4278,7 +4286,16 @@ standard_info_imp(standard_display *dp, png_structp pp, png_infop pi,
|
|||||||
/* And the info callback has to call this (or png_read_update_info - see
|
/* And the info callback has to call this (or png_read_update_info - see
|
||||||
* below in the png_modifier code for that variant.
|
* below in the png_modifier code for that variant.
|
||||||
*/
|
*/
|
||||||
png_start_read_image(pp);
|
if (dp->use_update_info)
|
||||||
|
{
|
||||||
|
/* For debugging the effect of multiple calls: */
|
||||||
|
int i = dp->use_update_info;
|
||||||
|
while (i-- > 0)
|
||||||
|
png_read_update_info(pp, pi);
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
png_start_read_image(pp);
|
||||||
|
|
||||||
/* Validate the height, width and rowbytes plus ensure that sufficient buffer
|
/* Validate the height, width and rowbytes plus ensure that sufficient buffer
|
||||||
* exists for decoding the image.
|
* exists for decoding the image.
|
||||||
@ -4496,7 +4513,7 @@ standard_end(png_structp pp, png_infop pi)
|
|||||||
/* A single test run checking the standard image to ensure it is not damaged. */
|
/* A single test run checking the standard image to ensure it is not damaged. */
|
||||||
static void
|
static void
|
||||||
standard_test(png_store* PNG_CONST psIn, png_uint_32 PNG_CONST id,
|
standard_test(png_store* PNG_CONST psIn, png_uint_32 PNG_CONST id,
|
||||||
int do_interlace)
|
int do_interlace, int use_update_info)
|
||||||
{
|
{
|
||||||
standard_display d;
|
standard_display d;
|
||||||
context(psIn, fault);
|
context(psIn, fault);
|
||||||
@ -4504,7 +4521,7 @@ standard_test(png_store* PNG_CONST psIn, png_uint_32 PNG_CONST id,
|
|||||||
/* Set up the display (stack frame) variables from the arguments to the
|
/* Set up the display (stack frame) variables from the arguments to the
|
||||||
* function and initialize the locals that are filled in later.
|
* function and initialize the locals that are filled in later.
|
||||||
*/
|
*/
|
||||||
standard_display_init(&d, psIn, id, do_interlace);
|
standard_display_init(&d, psIn, id, do_interlace, use_update_info);
|
||||||
|
|
||||||
/* Everything is protected by a Try/Catch. The functions called also
|
/* Everything is protected by a Try/Catch. The functions called also
|
||||||
* typically have local Try/Catch blocks.
|
* typically have local Try/Catch blocks.
|
||||||
@ -4591,7 +4608,7 @@ test_standard(png_modifier* PNG_CONST pm, png_byte PNG_CONST colour_type,
|
|||||||
interlace_type < PNG_INTERLACE_LAST; ++interlace_type)
|
interlace_type < PNG_INTERLACE_LAST; ++interlace_type)
|
||||||
{
|
{
|
||||||
standard_test(&pm->this, FILEID(colour_type, DEPTH(bdlo), 0/*palette*/,
|
standard_test(&pm->this, FILEID(colour_type, DEPTH(bdlo), 0/*palette*/,
|
||||||
interlace_type, 0, 0, 0), 0/*do_interlace*/);
|
interlace_type, 0, 0, 0), 0/*do_interlace*/, pm->use_update_info);
|
||||||
|
|
||||||
if (fail(pm))
|
if (fail(pm))
|
||||||
return 0;
|
return 0;
|
||||||
@ -4650,25 +4667,29 @@ test_size(png_modifier* PNG_CONST pm, png_byte PNG_CONST colour_type,
|
|||||||
* to validate.
|
* to validate.
|
||||||
*/
|
*/
|
||||||
standard_test(&pm->this, FILEID(colour_type, DEPTH(bdlo), 0/*palette*/,
|
standard_test(&pm->this, FILEID(colour_type, DEPTH(bdlo), 0/*palette*/,
|
||||||
PNG_INTERLACE_NONE, w, h, 0), 0/*do_interlace*/);
|
PNG_INTERLACE_NONE, w, h, 0), 0/*do_interlace*/,
|
||||||
|
pm->use_update_info);
|
||||||
|
|
||||||
if (fail(pm))
|
if (fail(pm))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
standard_test(&pm->this, FILEID(colour_type, DEPTH(bdlo), 0/*palette*/,
|
standard_test(&pm->this, FILEID(colour_type, DEPTH(bdlo), 0/*palette*/,
|
||||||
PNG_INTERLACE_NONE, w, h, 1), 0/*do_interlace*/);
|
PNG_INTERLACE_NONE, w, h, 1), 0/*do_interlace*/,
|
||||||
|
pm->use_update_info);
|
||||||
|
|
||||||
if (fail(pm))
|
if (fail(pm))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
standard_test(&pm->this, FILEID(colour_type, DEPTH(bdlo), 0/*palette*/,
|
standard_test(&pm->this, FILEID(colour_type, DEPTH(bdlo), 0/*palette*/,
|
||||||
PNG_INTERLACE_ADAM7, w, h, 0), 0/*do_interlace*/);
|
PNG_INTERLACE_ADAM7, w, h, 0), 0/*do_interlace*/,
|
||||||
|
pm->use_update_info);
|
||||||
|
|
||||||
if (fail(pm))
|
if (fail(pm))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
standard_test(&pm->this, FILEID(colour_type, DEPTH(bdlo), 0/*palette*/,
|
standard_test(&pm->this, FILEID(colour_type, DEPTH(bdlo), 0/*palette*/,
|
||||||
PNG_INTERLACE_ADAM7, w, h, 1), 0/*do_interlace*/);
|
PNG_INTERLACE_ADAM7, w, h, 1), 0/*do_interlace*/,
|
||||||
|
pm->use_update_info);
|
||||||
|
|
||||||
if (fail(pm))
|
if (fail(pm))
|
||||||
return 0;
|
return 0;
|
||||||
@ -4678,13 +4699,15 @@ test_size(png_modifier* PNG_CONST pm, png_byte PNG_CONST colour_type,
|
|||||||
* to the code used in the non-interlaced case too.
|
* to the code used in the non-interlaced case too.
|
||||||
*/
|
*/
|
||||||
standard_test(&pm->this, FILEID(colour_type, DEPTH(bdlo), 0/*palette*/,
|
standard_test(&pm->this, FILEID(colour_type, DEPTH(bdlo), 0/*palette*/,
|
||||||
PNG_INTERLACE_NONE, w, h, 0), 1/*do_interlace*/);
|
PNG_INTERLACE_NONE, w, h, 0), 1/*do_interlace*/,
|
||||||
|
pm->use_update_info);
|
||||||
|
|
||||||
if (fail(pm))
|
if (fail(pm))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
standard_test(&pm->this, FILEID(colour_type, DEPTH(bdlo), 0/*palette*/,
|
standard_test(&pm->this, FILEID(colour_type, DEPTH(bdlo), 0/*palette*/,
|
||||||
PNG_INTERLACE_ADAM7, w, h, 0), 1/*do_interlace*/);
|
PNG_INTERLACE_ADAM7, w, h, 0), 1/*do_interlace*/,
|
||||||
|
pm->use_update_info);
|
||||||
|
|
||||||
if (fail(pm))
|
if (fail(pm))
|
||||||
return 0;
|
return 0;
|
||||||
@ -5159,7 +5182,8 @@ transform_display_init(transform_display *dp, png_modifier *pm, png_uint_32 id,
|
|||||||
memset(dp, 0, sizeof dp);
|
memset(dp, 0, sizeof dp);
|
||||||
|
|
||||||
/* Standard fields */
|
/* Standard fields */
|
||||||
standard_display_init(&dp->this, &pm->this, id, 0/*do_interlace*/);
|
standard_display_init(&dp->this, &pm->this, id, 0/*do_interlace*/,
|
||||||
|
1/*use_update_info*/);
|
||||||
|
|
||||||
/* Parameter fields */
|
/* Parameter fields */
|
||||||
dp->pm = pm;
|
dp->pm = pm;
|
||||||
@ -5180,7 +5204,13 @@ transform_info_imp(transform_display *dp, png_structp pp, png_infop pi)
|
|||||||
dp->transform_list->set(dp->transform_list, dp, pp, pi);
|
dp->transform_list->set(dp->transform_list, dp, pp, pi);
|
||||||
|
|
||||||
/* Update the info structure for these transforms: */
|
/* Update the info structure for these transforms: */
|
||||||
png_read_update_info(pp, pi);
|
{
|
||||||
|
int i = dp->this.use_update_info;
|
||||||
|
/* Always do one call, even if use_update_info is 0. */
|
||||||
|
do
|
||||||
|
png_read_update_info(pp, pi);
|
||||||
|
while (--i > 0);
|
||||||
|
}
|
||||||
|
|
||||||
/* And get the output information into the standard_display */
|
/* And get the output information into the standard_display */
|
||||||
standard_info_part2(&dp->this, pp, pi, 1/*images*/);
|
standard_info_part2(&dp->this, pp, pi, 1/*images*/);
|
||||||
@ -7012,7 +7042,8 @@ gamma_display_init(gamma_display *dp, png_modifier *pm, png_uint_32 id,
|
|||||||
double background_gamma)
|
double background_gamma)
|
||||||
{
|
{
|
||||||
/* Standard fields */
|
/* Standard fields */
|
||||||
standard_display_init(&dp->this, &pm->this, id, 0/*do_interlace*/);
|
standard_display_init(&dp->this, &pm->this, id, 0/*do_interlace*/,
|
||||||
|
1/*use_update_info*/);
|
||||||
|
|
||||||
/* Parameter fields */
|
/* Parameter fields */
|
||||||
dp->pm = pm;
|
dp->pm = pm;
|
||||||
@ -7141,7 +7172,13 @@ gamma_info_imp(gamma_display *dp, png_structp pp, png_infop pi)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
png_read_update_info(pp, pi);
|
{
|
||||||
|
int i = dp->this.use_update_info;
|
||||||
|
/* Always do one call, even if use_update_info is 0. */
|
||||||
|
do
|
||||||
|
png_read_update_info(pp, pi);
|
||||||
|
while (--i > 0);
|
||||||
|
}
|
||||||
|
|
||||||
/* Now we may get a different cbRow: */
|
/* Now we may get a different cbRow: */
|
||||||
standard_info_part2(&dp->this, pp, pi, 1 /*images*/);
|
standard_info_part2(&dp->this, pp, pi, 1 /*images*/);
|
||||||
@ -9372,6 +9409,9 @@ int main(int argc, PNG_CONST char **argv)
|
|||||||
else if (strcmp(*argv, "--progressive-read") == 0)
|
else if (strcmp(*argv, "--progressive-read") == 0)
|
||||||
pm.this.progressive = 1;
|
pm.this.progressive = 1;
|
||||||
|
|
||||||
|
else if (strcmp(*argv, "--use-update-info") == 0)
|
||||||
|
++pm.use_update_info; /* Can call multiple times */
|
||||||
|
|
||||||
else if (strcmp(*argv, "--interlace") == 0)
|
else if (strcmp(*argv, "--interlace") == 0)
|
||||||
pm.interlace_type = PNG_INTERLACE_ADAM7;
|
pm.interlace_type = PNG_INTERLACE_ADAM7;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user