diff --git a/ANNOUNCE b/ANNOUNCE index c32316662..1855e660e 100644 --- a/ANNOUNCE +++ b/ANNOUNCE @@ -1,5 +1,5 @@ -Libpng 1.4.0beta105 - November 22, 2009 +Libpng 1.4.0beta105 - November 24, 2009 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. @@ -708,7 +708,11 @@ version 1.4.0beta104 [November 22, 2009] Removed png_longjmp_ptr from scripts/*.def and libpng.3 Rebuilt configure scripts with autoconf-2.65 -version 1.4.0beta105 [November 22, 2009] +version 1.4.0beta105 [November 24, 2009] + Use fast integer PNG_DIVIDE_BY_255() or PNG_DIVIDE_BY_65535() to accomplish + alpha premultiplication when PNG_READ_COMPOSITE_NODIV_SUPPORTED is defined. + Changed "/255" to "/255.0" in background calculations to make it clear + that the 255 is used as a double. Send comments/corrections/commendations to png-mng-implement at lists.sf.net (subscription required; visit diff --git a/CHANGES b/CHANGES index 927f37fa7..9afbe94ad 100644 --- a/CHANGES +++ b/CHANGES @@ -2395,7 +2395,11 @@ version 1.4.0beta104 [November 22, 2009] Removed png_longjmp_ptr from scripts/*.def and libpng.3 Rebuilt configure scripts with autoconf-2.65 -version 1.4.0beta105 [November 22, 2009] +version 1.4.0beta105 [November 24, 2009] + Use fast integer PNG_DIVIDE_BY_255() or PNG_DIVIDE_BY_65535() to accomplish + alpha premultiplication when PNG_READ_COMPOSITE_NODIV_SUPPORTED is defined. + Changed "/255" to "/255.0" in background calculations to make it clear + that the 255 is used as a double. Send comments/corrections/commendations to png-mng-implement at lists.sf.net (subscription required; visit diff --git a/png.h b/png.h index 9ef61fd08..cba91dd88 100644 --- a/png.h +++ b/png.h @@ -1,7 +1,7 @@ /* png.h - header file for PNG reference library * - * libpng version 1.4.0beta105 - November 22, 2009 + * libpng version 1.4.0beta105 - November 24, 2009 * Copyright (c) 1998-2009 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.4.0beta105 - November 22, 2009: Glenn + * libpng versions 0.97, January 1998, through 1.4.0beta105 - November 24, 2009: Glenn * See also "Contributing Authors", below. * * Note about libpng version numbers: @@ -163,7 +163,7 @@ * * This code is released under the libpng license. * - * libpng versions 1.2.6, August 15, 2004, through 1.4.0beta105, November 22, 2009, are + * libpng versions 1.2.6, August 15, 2004, through 1.4.0beta105, November 24, 2009, 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: @@ -339,7 +339,7 @@ /* Version information for png.h - this should match the version in png.c */ #define PNG_LIBPNG_VER_STRING "1.4.0beta105" #define PNG_HEADER_VERSION_STRING \ - " libpng version 1.4.0beta105 - November 22, 2009\n" + " libpng version 1.4.0beta105 - November 24, 2009\n" #define PNG_LIBPNG_VER_SONUM 14 #define PNG_LIBPNG_VER_DLLNUM 14 @@ -2474,6 +2474,15 @@ extern PNG_EXPORT(png_bytep,png_get_io_chunk_name) (png_uint_32)(alpha)) + (png_uint_32)32768L); \ (composite) = (png_uint_16)((temp + (temp >> 16)) >> 16); } +#ifdef PNG_READ_PREMULTIPLY_ALPHA_SUPPORTED +#define PNG_DIVIDE_BY_255(v) \ + ((png_byte)(((png_uint_16)v + \ + (((png_uint_16)v + 128) >> 8) + 128) >> 8)) +#define PNG_DIVIDE_BY_65535(v) \ + ((png_byte)(((png_uint_32)v + \ + (((png_uint_32)v + 32768L) >> 16) + 32768L) >> 16)) +#endif + #else /* Standard method using integer division */ # define png_composite(composite, fg, alpha, bg) \ @@ -2486,8 +2495,17 @@ extern PNG_EXPORT(png_bytep,png_get_io_chunk_name) (png_uint_32)(bg)*(png_uint_32)(65535L - (png_uint_32)(alpha)) + \ (png_uint_32)32767) / (png_uint_32)65535L) +#define PNG_DIVIDE_BY_255(v) (((png_uint_16)v)/255) +#define PNG_DIVIDE_BY_65535(v) ((png_uint_32)v)/65535) #endif /* PNG_READ_COMPOSITE_NODIV_SUPPORTED */ +#ifdef PNG_READ_PREMULTIPLY_ALPHA_SUPPORTED +#define PNG_8_BIT_PREMULTIPLY(color,alpha) \ + PNG_DIVIDE_BY_255((color)*(alpha)) +#define PNG_16_BIT_PREMULTIPLY(color,alpha)\ + PNG_DIVIDE_BY_65535((color)*(alpha)) +#endif + #ifdef PNG_USE_READ_MACROS /* Inline macros to do direct reads of bytes from the input buffer. * The png_get_int_32() routine assumes we are using two's complement diff --git a/pngrtran.c b/pngrtran.c index 2b0004f7f..12b9bf571 100644 --- a/pngrtran.c +++ b/pngrtran.c @@ -1,7 +1,7 @@ /* pngrtran.c - transforms the data in a row for PNG readers * - * Last changed in libpng 1.4.0 [November 22, 2009] + * Last changed in libpng 1.4.0 [November 24, 2009] * Copyright (c) 1998-2009 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.) @@ -957,19 +957,19 @@ png_init_read_transformations(png_structp png_ptr) else { back.red = (png_byte)(pow( - (double)png_ptr->background.red/255, gs) * 255.0 + .5); + (double)png_ptr->background.red/255.0, gs) * 255.0 + .5); back.green = (png_byte)(pow( - (double)png_ptr->background.green/255, gs) * 255.0 + .5); + (double)png_ptr->background.green/255.0, gs) * 255.0 + .5); back.blue = (png_byte)(pow( - (double)png_ptr->background.blue/255, gs) * 255.0 + .5); + (double)png_ptr->background.blue/255.0, gs) * 255.0 + .5); } back_1.red = (png_byte)(pow( - (double)png_ptr->background.red/255, g) * 255.0 + .5); + (double)png_ptr->background.red/255.0, g) * 255.0 + .5); back_1.green = (png_byte)(pow( - (double)png_ptr->background.green/255, g) * 255.0 + .5); + (double)png_ptr->background.green/255.0, g) * 255.0 + .5); back_1.blue = (png_byte)(pow( - (double)png_ptr->background.blue/255, g) * 255.0 + .5); + (double)png_ptr->background.blue/255.0, g) * 255.0 + .5); } for (i = 0; i < num_palette; i++) { @@ -2015,16 +2015,15 @@ png_do_read_premultiply_alpha(png_row_infop row_info, png_bytep row) { png_bytep sp = row + row_info->rowbytes; png_bytep dp = sp; - png_uint_16 a = 0; + png_uint_16 a = 0; png_uint_32 i; for (i = 0; i < row_width; i++) { - a = *(--sp); --dp; - - *(--dp) = (*(--sp) * a) / 255; - *(--dp) = (*(--sp) * a) / 255; - *(--dp) = (*(--sp) * a) / 255; + a = *(--sp); --dp; + sp--; *(--dp) = PNG_8_BIT_PREMULTIPLY((*sp), a); + sp--; *(--dp) = PNG_8_BIT_PREMULTIPLY((*sp), a); + sp--; *(--dp) = PNG_8_BIT_PREMULTIPLY((*sp), a); } } /* This premultiplies the pixels with the alpha channel in RRGGBBAA */ @@ -2032,15 +2031,15 @@ png_do_read_premultiply_alpha(png_row_infop row_info, png_bytep row) { png_uint_16p sp = (png_uint_16p)(row + row_info->rowbytes); png_uint_16p dp = sp; - png_uint_32 a = 0; + png_uint_32 a = 0; png_uint_32 i; for (i = 0; i < row_width; i++) { - a = *(--sp); --dp; - *(--dp) = (png_uint_16) ((*(--sp) * a) / 65535); - *(--dp) = (png_uint_16) ((*(--sp) * a) / 65535); - *(--dp) = (png_uint_16) ((*(--sp) * a) / 65535); + a = *(--sp); --dp; + sp--; *(--dp) = PNG_16_BIT_PREMULTIPLY((*sp), a); + sp--; *(--dp) = PNG_16_BIT_PREMULTIPLY((*sp), a); + sp--; *(--dp) = PNG_16_BIT_PREMULTIPLY((*sp), a); } } } @@ -2052,12 +2051,12 @@ png_do_read_premultiply_alpha(png_row_infop row_info, png_bytep row) png_bytep sp = row + row_info->rowbytes; png_bytep dp = sp; png_uint_16 a = 0; - png_uint_32 i; + png_uint_32 i; for (i = 0; i < row_width; i++) { a = *(--sp); --dp; - *(--dp) = (*(--sp) * a) / 255; + sp--; *(--dp) = PNG_8_BIT_PREMULTIPLY((*sp), a); } } /* This premultiplies the pixels with the alpha channel in GGAA */ @@ -2070,8 +2069,8 @@ png_do_read_premultiply_alpha(png_row_infop row_info, png_bytep row) for (i = 0; i < row_width; i++) { - a = *(--sp); --dp; - *(--dp) = (png_uint_16) ((*(--sp) * a) / 65535); + a = *(--sp); --dp; + sp--; *(--dp) = PNG_16_BIT_PREMULTIPLY((*sp), a); } } }