From 413138a5ca2774895c03512b5948d80a7c19e760 Mon Sep 17 00:00:00 2001 From: Glenn Randers-Pehrson Date: Mon, 13 Jun 2011 22:07:37 -0500 Subject: [PATCH] [devel] Added png_set_chop_16() API. --- ANNOUNCE | 20 ++++++----- CHANGES | 4 +++ libpng-manual.txt | 6 ++-- libpng.3 | 21 ++++++----- png.c | 12 +++---- png.h | 27 +++++++------- pngrtran.c | 68 ++++++++++++++++++++++++++--------- scripts/pnglibconf.dfa | 1 - scripts/pnglibconf.h.prebuilt | 1 - 9 files changed, 105 insertions(+), 55 deletions(-) diff --git a/ANNOUNCE b/ANNOUNCE index fc933e807..20ec4cf14 100644 --- a/ANNOUNCE +++ b/ANNOUNCE @@ -1,5 +1,5 @@ -Libpng 1.5.4beta01 - June 14, 2011 +Libpng 1.5.4beta02 - June 14, 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. @@ -9,20 +9,20 @@ Files available for download: Source files with LF line endings (for Unix/Linux) and with a "configure" script - 1.5.4beta01.tar.xz (LZMA-compressed, recommended) - 1.5.4beta01.tar.gz - 1.5.4beta01.tar.bz2 + 1.5.4beta02.tar.xz (LZMA-compressed, recommended) + 1.5.4beta02.tar.gz + 1.5.4beta02.tar.bz2 Source files with CRLF line endings (for Windows), without the "configure" script - lp154b01.7z (LZMA-compressed, recommended) - lp154b01.zip + lp154b02.7z (LZMA-compressed, recommended) + lp154b02.zip Other information: - 1.5.4beta01-README.txt - 1.5.4beta01-LICENSE.txt + 1.5.4beta02-README.txt + 1.5.4beta02-LICENSE.txt Changes since the last public release (1.5.2): @@ -193,6 +193,10 @@ Version 1.5.4beta01 [June 14, 2011] outside of an unknown-chunk block in png.h because they are also needed for other uses. +Version 1.5.4beta02 [June 14, 2011] + Fixed and clarified LEGACY 16-to-8 scaling code. + Added png_set_chop_16() API. + Send comments/corrections/commendations to png-mng-implement at lists.sf.net: (subscription required; visit https://lists.sourceforge.net/lists/listinfo/png-mng-implement diff --git a/CHANGES b/CHANGES index 9e802c480..1b2b9b61e 100644 --- a/CHANGES +++ b/CHANGES @@ -3456,6 +3456,10 @@ Version 1.5.4beta01 [June 14, 2011] outside of an unknown-chunk block in png.h because they are also needed for other uses. +Version 1.5.4beta02 [June 14, 2011] + Fixed and clarified LEGACY 16-to-8 scaling code. + Added png_set_chop_16() API. + Send comments/corrections/commendations to png-mng-implement at lists.sf.net (subscription required; visit https://lists.sourceforge.net/lists/listinfo/png-mng-implement diff --git a/libpng-manual.txt b/libpng-manual.txt index 0a94c4dfa..fdd4fb5cc 100644 --- a/libpng-manual.txt +++ b/libpng-manual.txt @@ -1,6 +1,6 @@ libpng-manual.txt - A description on how to use and modify libpng - libpng version 1.5.4beta01 - June 14, 2011 + libpng version 1.5.4beta02 - June 14, 2011 Updated and distributed by Glenn Randers-Pehrson Copyright (c) 1998-2011 Glenn Randers-Pehrson @@ -11,7 +11,7 @@ libpng-manual.txt - A description on how to use and modify libpng Based on: - libpng versions 0.97, January 1998, through 1.5.4beta01 - June 14, 2011 + libpng versions 0.97, January 1998, through 1.5.4beta02 - June 14, 2011 Updated and distributed by Glenn Randers-Pehrson Copyright (c) 1998-2011 Glenn Randers-Pehrson @@ -4423,7 +4423,7 @@ Since the PNG Development group is an ad-hoc body, we can't make an official declaration. This is your unofficial assurance that libpng from version 0.71 and -upward through 1.5.4beta01 are Y2K compliant. It is my belief that earlier +upward through 1.5.4beta02 are Y2K compliant. It is my belief that earlier versions were also Y2K compliant. Libpng only has three year fields. One is a 2-byte unsigned integer that diff --git a/libpng.3 b/libpng.3 index a78c80383..f17fd7e75 100644 --- a/libpng.3 +++ b/libpng.3 @@ -1,6 +1,6 @@ .TH LIBPNG 3 "June 14, 2011" .SH NAME -libpng \- Portable Network Graphics (PNG) Reference Library 1.5.4beta01 +libpng \- Portable Network Graphics (PNG) Reference Library 1.5.4beta02 .SH SYNOPSIS \fI\fB @@ -672,6 +672,10 @@ libpng \- Portable Network Graphics (PNG) Reference Library 1.5.4beta01 \fI\fB +\fBvoid png_set_strip_16 (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + \fBvoid png_set_chunk_malloc_max (png_structp \fP\fIpng_ptr\fP\fB, png_alloc_size_t \fIuser_chunk_cache_max\fP\fB);\fP \fI\fB @@ -951,7 +955,7 @@ Following is a copy of the libpng-manual.txt file that accompanies libpng. .SH LIBPNG.TXT libpng-manual.txt - A description on how to use and modify libpng - libpng version 1.5.4beta01 - June 14, 2011 + libpng version 1.5.4beta02 - June 14, 2011 Updated and distributed by Glenn Randers-Pehrson Copyright (c) 1998-2011 Glenn Randers-Pehrson @@ -962,7 +966,7 @@ libpng-manual.txt - A description on how to use and modify libpng Based on: - libpng versions 0.97, January 1998, through 1.5.4beta01 - June 14, 2011 + libpng versions 0.97, January 1998, through 1.5.4beta02 - June 14, 2011 Updated and distributed by Glenn Randers-Pehrson Copyright (c) 1998-2011 Glenn Randers-Pehrson @@ -5374,7 +5378,7 @@ Since the PNG Development group is an ad-hoc body, we can't make an official declaration. This is your unofficial assurance that libpng from version 0.71 and -upward through 1.5.4beta01 are Y2K compliant. It is my belief that earlier +upward through 1.5.4beta02 are Y2K compliant. It is my belief that earlier versions were also Y2K compliant. Libpng only has three year fields. One is a 2-byte unsigned integer that @@ -5565,8 +5569,9 @@ the first widely used release: 1.5.2 15 10502 15.so.15.2[.0] 1.5.3beta01-10 15 10503 15.so.15.3[.0] 1.5.3rc01-02 15 10503 15.so.15.3[.0] - 1.5.3beta11 [no 1.5.3] 15 10503 15.so.15.3[.0] - 1.5.4beta01 15 10504 15.so.15.4[.0] + 1.5.3beta11 15 10503 15.so.15.3[.0] + 1.5.3 [omitted] + 1.5.4beta01-02 15 10504 15.so.15.4[.0] Henceforth the source version will match the shared-library minor and patch numbers; the shared-library major version number will be @@ -5623,7 +5628,7 @@ possible without all of you. Thanks to Frank J. T. Wojcik for helping with the documentation. -Libpng version 1.5.4beta01 - June 14, 2011: +Libpng version 1.5.4beta02 - June 14, 2011: Initially created in 1995 by Guy Eric Schalnat, then of Group 42, Inc. Currently maintained by Glenn Randers-Pehrson (glennrp at users.sourceforge.net). @@ -5646,7 +5651,7 @@ this sentence. This code is released under the libpng license. -libpng versions 1.2.6, August 15, 2004, through 1.5.4beta01, June 14, 2011, are +libpng versions 1.2.6, August 15, 2004, through 1.5.4beta02, June 14, 2011, are Copyright (c) 2004,2006-2007 Glenn Randers-Pehrson, and are distributed according to the same disclaimer and license as libpng-1.2.5 with the following individual added to the list of Contributing Authors diff --git a/png.c b/png.c index 5fece6ec7..22e644e99 100644 --- a/png.c +++ b/png.c @@ -1,7 +1,7 @@ /* png.c - location for general purpose libpng functions * - * Last changed in libpng 1.5.3 [(PENDING RELEASE)] + * Last changed in libpng 1.5.4 [(PENDING RELEASE)] * Copyright (c) 1998-2011 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) @@ -14,7 +14,7 @@ #include "pngpriv.h" /* Generate a compiler error if there is an old png.h in the search path. */ -typedef png_libpng_version_1_5_4beta01 Your_png_h_is_not_version_1_5_4beta01; +typedef png_libpng_version_1_5_4beta02 Your_png_h_is_not_version_1_5_4beta02; /* Tells libpng that we have already handled the first "num_bytes" bytes * of the PNG file signature. If the PNG data is embedded into another @@ -617,13 +617,13 @@ png_get_copyright(png_const_structp png_ptr) #else # ifdef __STDC__ return PNG_STRING_NEWLINE \ - "libpng version 1.5.4beta01 - June 14, 2011" PNG_STRING_NEWLINE \ + "libpng version 1.5.4beta02 - June 14, 2011" PNG_STRING_NEWLINE \ "Copyright (c) 1998-2011 Glenn Randers-Pehrson" PNG_STRING_NEWLINE \ "Copyright (c) 1996-1997 Andreas Dilger" PNG_STRING_NEWLINE \ "Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc." \ PNG_STRING_NEWLINE; # else - return "libpng version 1.5.4beta01 - June 14, 2011\ + return "libpng version 1.5.4beta02 - June 14, 2011\ Copyright (c) 1998-2011 Glenn Randers-Pehrson\ Copyright (c) 1996-1997 Andreas Dilger\ Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc."; @@ -2369,7 +2369,7 @@ png_build_gamma_table(png_structp png_ptr, int bit_depth) else shift = 0; /* keep all 16 bits */ - if (png_ptr->transformations & PNG_16_TO_8) + if (png_ptr->transformations & (PNG_16_TO_8 | PNG_CHOP_16_TO_8)) { /* PNG_MAX_GAMMA_8 is the number of bits to keep - effectively * the significant bits in the *input* when the output will @@ -2390,7 +2390,7 @@ png_build_gamma_table(png_structp png_ptr, int bit_depth) * 16-bit output because the 8-bit table assumes the result will be reduced * to 8 bits. */ - if (png_ptr->transformations & PNG_16_TO_8) + if (png_ptr->transformations & (PNG_16_TO_8 | PNG_CHOP_16_TO_8)) #endif png_build_16to8_table(png_ptr, &png_ptr->gamma_16_table, shift, png_ptr->screen_gamma > 0 ? png_product2(png_ptr->gamma, diff --git a/png.h b/png.h index f5d868112..65e407f5a 100644 --- a/png.h +++ b/png.h @@ -1,7 +1,7 @@ /* png.h - header file for PNG reference library * - * libpng version 1.5.4beta01 - June 14, 2011 + * libpng version 1.5.4beta02 - June 14, 2011 * Copyright (c) 1998-2011 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) @@ -11,7 +11,7 @@ * Authors and maintainers: * libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat * libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger - * libpng versions 0.97, January 1998, through 1.5.4beta01 - June 14, 2011: Glenn + * libpng versions 0.97, January 1998, through 1.5.4beta02 - June 14, 2011: Glenn * See also "Contributing Authors", below. * * Note about libpng version numbers: @@ -152,8 +152,9 @@ * 1.5.2 15 10502 15.so.15.2[.0] * 1.5.3beta01-10 15 10503 15.so.15.3[.0] * 1.5.3rc01-02 15 10503 15.so.15.3[.0] - * 1.5.3beta11 [no 1.5.3] 15 10503 15.so.15.3[.0] - * 1.5.4beta01 15 10504 15.so.15.4[.0] + * 1.5.3beta11 15 10503 15.so.15.3[.0] + * 1.5.3 [omitted] + * 1.5.4beta01-02 15 10504 15.so.15.4[.0] * * Henceforth the source version will match the shared-library major * and minor numbers; the shared-library major version number will be @@ -185,7 +186,7 @@ * * This code is released under the libpng license. * - * libpng versions 1.2.6, August 15, 2004, through 1.5.4beta01, June 14, 2011, are + * libpng versions 1.2.6, August 15, 2004, through 1.5.4beta02, June 14, 2011, are * Copyright (c) 2004, 2006-2011 Glenn Randers-Pehrson, and are * distributed according to the same disclaimer and license as libpng-1.2.5 * with the following individual added to the list of Contributing Authors: @@ -303,7 +304,7 @@ * an official declaration. * * This is your unofficial assurance that libpng from version 0.71 and - * upward through 1.5.4beta01 are Y2K compliant. It is my belief that + * upward through 1.5.4beta02 are Y2K compliant. It is my belief that * earlier versions were also Y2K compliant. * * Libpng only has two year fields. One is a 2-byte unsigned integer @@ -358,9 +359,9 @@ */ /* Version information for png.h - this should match the version in png.c */ -#define PNG_LIBPNG_VER_STRING "1.5.4beta01" +#define PNG_LIBPNG_VER_STRING "1.5.4beta02" #define PNG_HEADER_VERSION_STRING \ - " libpng version 1.5.4beta01 - June 14, 2011\n" + " libpng version 1.5.4beta02 - June 14, 2011\n" #define PNG_LIBPNG_VER_SONUM 15 #define PNG_LIBPNG_VER_DLLNUM 15 @@ -373,7 +374,7 @@ * PNG_LIBPNG_VER_STRING, omitting any leading zero: */ -#define PNG_LIBPNG_VER_BUILD 01 +#define PNG_LIBPNG_VER_BUILD 02 /* Release Status */ #define PNG_LIBPNG_BUILD_ALPHA 1 @@ -520,7 +521,7 @@ extern "C" { /* This triggers a compiler error in png.c, if png.c and png.h * do not agree upon the version number. */ -typedef char* png_libpng_version_1_5_4beta01; +typedef char* png_libpng_version_1_5_4beta02; /* Three color definitions. The order of the red, green, and blue, (and the * exact size) is not important, although the size of the fields need to @@ -1422,8 +1423,10 @@ PNG_FIXED_EXPORT(215, void, png_set_background_fixed, (png_structp png_ptr, #endif #ifdef PNG_READ_16_TO_8_SUPPORTED -/* Strip the second byte of information from a 16-bit depth file. */ +/* Scale a 16-bit depth file down to 8-bit, accurately. */ PNG_EXPORT(48, void, png_set_strip_16, (png_structp png_ptr)); +/* Strip the second byte of information from a 16-bit depth file. */ +PNG_EXPORT(229, void, png_set_chop_16, (png_structp png_ptr)); #endif #ifdef PNG_READ_QUANTIZE_SUPPORTED @@ -2566,7 +2569,7 @@ PNG_EXPORT(207, void, png_save_uint_16, (png_bytep buf, unsigned int i)); * scripts/symbols.def as well. */ #ifdef PNG_EXPORT_LAST_ORDINAL - PNG_EXPORT_LAST_ORDINAL(228); + PNG_EXPORT_LAST_ORDINAL(229); #endif #ifdef __cplusplus diff --git a/pngrtran.c b/pngrtran.c index 4ed4b4c7c..867145fea 100644 --- a/pngrtran.c +++ b/pngrtran.c @@ -133,7 +133,7 @@ png_set_background(png_structp png_ptr, #endif /* READ_BACKGROUND */ #ifdef PNG_READ_16_TO_8_SUPPORTED -/* Strip 16-bit depth files to 8-bit depth */ +/* Scale 16-bit depth files to 8-bit depth */ void PNGAPI png_set_strip_16(png_structp png_ptr) { @@ -143,6 +143,20 @@ png_set_strip_16(png_structp png_ptr) return; png_ptr->transformations |= PNG_16_TO_8; + png_ptr->transformations &= ~PNG_CHOP_16_TO_8; +} + +/* Chop 16-bit depth files to 8-bit depth */ +void PNGAPI +png_set_chop_16(png_structp png_ptr) +{ + png_debug(1, "in png_set_chop_16"); + + if (png_ptr == NULL) + return; + + png_ptr->transformations |= PNG_CHOP_16_TO_8; + png_ptr->transformations &= ~PNG_16_TO_8; } #endif @@ -1312,7 +1326,7 @@ png_init_read_transformations(png_structp png_ptr) * 6) PNG_GAMMA * 7) PNG_STRIP_ALPHA (if compose) * 8) PNG_ENCODE_ALPHA - * 9) PNG_16_TO_8 (strip16) + * 9) PNG_16_TO_8 or PNG_CHOP_16_TO_8 (strip16/chop16) * 10) PNG_QUANTIZE (converts to palette) * 11) PNG_EXPAND_16 * 12) PNG_GRAY_TO_RGB iff PNG_BACKGROUND_IS_GRAY @@ -1851,13 +1865,15 @@ png_read_transform_info(png_structp png_ptr, png_infop info_ptr) #ifdef PNG_READ_16_TO_8_SUPPORTED #ifdef PNG_READ_16BIT_SUPPORTED - if ((png_ptr->transformations & PNG_16_TO_8) && (info_ptr->bit_depth == 16)) + if ((png_ptr->transformations & (PNG_16_TO_8 | PNG_CHOP_16_TO_8)) && + (info_ptr->bit_depth == 16)) info_ptr->bit_depth = 8; #else /* Force chopping 16-bit input down to 8 */ if (info_ptr->bit_depth == 16) { - png_ptr->transformations |=PNG_16_TO_8; + if (!(png_ptr->transformations & PNG_CHOP_16_TO_8)) + png_ptr->transformations |=PNG_16_TO_8; info_ptr->bit_depth = 8; } #endif @@ -2123,6 +2139,8 @@ png_do_read_transformations(png_structp png_ptr) #ifdef PNG_READ_16_TO_8_SUPPORTED if (png_ptr->transformations & PNG_16_TO_8) + png_do_scale_16_to_8(&(png_ptr->row_info), png_ptr->row_buf + 1); + else if (png_ptr->transformations & PNG_CHOP_16_TO_8) png_do_chop(&(png_ptr->row_info), png_ptr->row_buf + 1); #endif @@ -2453,11 +2471,11 @@ png_do_unshift(png_row_infop row_info, png_bytep row, #endif #ifdef PNG_READ_16_TO_8_SUPPORTED -/* Chop rows of bit depth 16 down to 8 */ +/* Scale rows of bit depth 16 down to 8 accurately */ void /* PRIVATE */ -png_do_chop(png_row_infop row_info, png_bytep row) +png_do_scale_16_to_8(png_row_infop row_info, png_bytep row) { - png_debug(1, "in png_do_chop"); + png_debug(1, "in png_do_scale_16_to_8"); if (row_info->bit_depth == 16) { @@ -2500,15 +2518,7 @@ png_do_chop(png_row_infop row_info, png_bytep row) */ png_int_32 tmp = *sp++; /* must be signed! */ -#ifdef PNG_LEGACY_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED - tmp += (((int)*sp++ - tmp) > 128) ? 1 : 0; -#else -# ifdef PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED tmp += (((int)*sp++ - tmp + 128) * 65535) >> 24; -# else - sp++; -# endif -#endif *dp++ = (png_byte)tmp; } @@ -2517,7 +2527,33 @@ png_do_chop(png_row_infop row_info, png_bytep row) row_info->rowbytes = row_info->width * row_info->channels; } } -#endif + +void /* PRIVATE */ +/* Simply discard the low byte. This was the default behavior prior + * to libpng-1.5.4. + */ +png_do_chop(png_row_infop row_info, png_bytep row) +{ + png_debug(1, "in png_do_chop"); + + if (row_info->bit_depth == 16) + { + png_bytep sp = row; /* source */ + png_bytep dp = row; /* destinaton */ + png_bytep ep = sp + row_info->rowbytes; /* end+1 */ + + while (sp < ep) + { + *dp++ = *sp++; + sp++; + } + + row_info->bit_depth = 8; + row_info->pixel_depth = (png_byte)(8 * row_info->channels); + row_info->rowbytes = row_info->width * row_info->channels; + } +} +#endif /* PNG_READ_16_TO_8_SUPPORTED */ #ifdef PNG_READ_SWAP_ALPHA_SUPPORTED void /* PRIVATE */ diff --git a/scripts/pnglibconf.dfa b/scripts/pnglibconf.dfa index 429c632ef..db4ae5bc7 100644 --- a/scripts/pnglibconf.dfa +++ b/scripts/pnglibconf.dfa @@ -347,7 +347,6 @@ option INCH_CONVERSIONS option BUILD_GRAYSCALE_PALETTE option READ_16_TO_8_ACCURATE_SCALE requires READ -option LEGACY_READ_16_TO_8_ACCURATE_SCALE disabled # IN DEVELOPMENT # These are currently experimental features; define them if you want diff --git a/scripts/pnglibconf.h.prebuilt b/scripts/pnglibconf.h.prebuilt index 54331ec3f..dd470dd9f 100644 --- a/scripts/pnglibconf.h.prebuilt +++ b/scripts/pnglibconf.h.prebuilt @@ -61,7 +61,6 @@ #define PNG_INFO_IMAGE_SUPPORTED #define PNG_IO_STATE_SUPPORTED #define PNG_iTXt_SUPPORTED -/*#undef PNG_LEGACY_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED*/ #define PNG_MNG_FEATURES_SUPPORTED #define PNG_oFFs_SUPPORTED #define PNG_pCAL_SUPPORTED