From c3b3240a03d546e313ab0149453aa4496ff48ca3 Mon Sep 17 00:00:00 2001 From: Glenn Randers-Pehrson Date: Fri, 1 Apr 2011 22:10:41 -0500 Subject: [PATCH] [devel] Improved the optimization of the zlib CMF byte (see libpng-1.2.6beta03). --- ANNOUNCE | 5 +++-- CHANGES | 3 ++- pngwutil.c | 16 +++++++++++++--- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/ANNOUNCE b/ANNOUNCE index 1ed965e2f..cef2d7bab 100644 --- a/ANNOUNCE +++ b/ANNOUNCE @@ -1,5 +1,5 @@ -Libpng 1.5.3beta02 - April 1, 2011 +Libpng 1.5.3beta02 - April 2, 2011 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. @@ -31,10 +31,11 @@ Version 1.5.3beta01 [April 1, 2011] Added API functions to set parameters for zlib compression of non-IDAT chunks. -Version 1.5.3beta02 [April 1, 2011] +Version 1.5.3beta02 [April 2, 2011] Updated scripts/symbols.def with new API functions. Only compile the new zlib re-initializing code when text or iCCP is supported, using PNG_WRITE_COMPRESSED_TEXT_SUPPORTED macro. + Improved the optimization of the zlib CMF byte (see libpng-1.2.6beta03). Send comments/corrections/commendations to png-mng-implement at lists.sf.net: (subscription required; visit diff --git a/CHANGES b/CHANGES index d2c3134f0..632098959 100644 --- a/CHANGES +++ b/CHANGES @@ -3292,10 +3292,11 @@ Version 1.5.3beta01 [April 1, 2011] Added API functions to set parameters for zlib compression of non-IDAT chunks. -Version 1.5.3beta02 [April 1, 2011] +Version 1.5.3beta02 [April 2, 2011] Updated scripts/symbols.def with new API functions. Only compile the new zlib re-initializing code when text or iCCP is supported, using PNG_WRITE_COMPRESSED_TEXT_SUPPORTED macro. + Improved the optimization of the zlib CMF byte (see libpng-1.2.6beta03). Send comments/corrections/commendations to png-mng-implement at lists.sf.net (subscription required; visit diff --git a/pngwutil.c b/pngwutil.c index bf5872ff8..31fea3722 100644 --- a/pngwutil.c +++ b/pngwutil.c @@ -839,13 +839,23 @@ png_write_IDAT(png_structp png_ptr, png_bytep data, png_size_t length) if (length >= 2 && png_ptr->height < 16384 && png_ptr->width < 16384) { - /* Compute the maximum possible length of the datastream - * - * To do: verify that this works with interlaced files + /* Compute the maximum possible length of the datastream */ + + /* Number of pixels, plus for each row a filter byte and possible + * padding byte */ png_uint_32 uncompressed_idat_size = png_ptr->height * ((png_ptr->width * png_ptr->channels * png_ptr->bit_depth + 15) >> 3); + + /* If it's interlaced, each block of 8 rows is sent as up to + * 14 rows, i.e., 6 additional rows, each with a filter byte + * and possibly a padding byte + */ + if (png_ptr->interlaced) + uncompressed_idat_size += ((png_ptr->height + 7)/8) * + (png_ptr->bit_depth < 8 ? 12 : 6); + unsigned int z_cinfo = z_cmf >> 4; unsigned int half_z_window_size = 1 << (z_cinfo + 7); while (uncompressed_idat_size <= half_z_window_size &&