[devel] 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 (and to prevent anyone from being tempted to use PNG_DIVIDE_BY_255() there).
This commit is contained in:
parent
2a087220dd
commit
768429bbc1
8
ANNOUNCE
8
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
|
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.
|
||||||
@ -708,7 +708,11 @@ version 1.4.0beta104 [November 22, 2009]
|
|||||||
Removed png_longjmp_ptr from scripts/*.def and libpng.3
|
Removed png_longjmp_ptr from scripts/*.def and libpng.3
|
||||||
Rebuilt configure scripts with autoconf-2.65
|
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
|
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
|
||||||
(subscription required; visit
|
(subscription required; visit
|
||||||
|
6
CHANGES
6
CHANGES
@ -2395,7 +2395,11 @@ version 1.4.0beta104 [November 22, 2009]
|
|||||||
Removed png_longjmp_ptr from scripts/*.def and libpng.3
|
Removed png_longjmp_ptr from scripts/*.def and libpng.3
|
||||||
Rebuilt configure scripts with autoconf-2.65
|
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
|
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
|
||||||
(subscription required; visit
|
(subscription required; visit
|
||||||
|
26
png.h
26
png.h
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* png.h - header file for PNG reference library
|
/* 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
|
* Copyright (c) 1998-2009 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||||
@ -11,7 +11,7 @@
|
|||||||
* Authors and maintainers:
|
* Authors and maintainers:
|
||||||
* libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat
|
* 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.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.
|
* See also "Contributing Authors", below.
|
||||||
*
|
*
|
||||||
* Note about libpng version numbers:
|
* Note about libpng version numbers:
|
||||||
@ -163,7 +163,7 @@
|
|||||||
*
|
*
|
||||||
* This code is released under the libpng license.
|
* 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
|
* Copyright (c) 2004, 2006-2007 Glenn Randers-Pehrson, and are
|
||||||
* distributed according to the same disclaimer and license as libpng-1.2.5
|
* distributed according to the same disclaimer and license as libpng-1.2.5
|
||||||
* with the following individual added to the list of Contributing Authors:
|
* 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 */
|
/* Version information for png.h - this should match the version in png.c */
|
||||||
#define PNG_LIBPNG_VER_STRING "1.4.0beta105"
|
#define PNG_LIBPNG_VER_STRING "1.4.0beta105"
|
||||||
#define PNG_HEADER_VERSION_STRING \
|
#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_SONUM 14
|
||||||
#define PNG_LIBPNG_VER_DLLNUM 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); \
|
(png_uint_32)(alpha)) + (png_uint_32)32768L); \
|
||||||
(composite) = (png_uint_16)((temp + (temp >> 16)) >> 16); }
|
(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 */
|
#else /* Standard method using integer division */
|
||||||
|
|
||||||
# define png_composite(composite, fg, alpha, bg) \
|
# 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)(bg)*(png_uint_32)(65535L - (png_uint_32)(alpha)) + \
|
||||||
(png_uint_32)32767) / (png_uint_32)65535L)
|
(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 */
|
#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
|
#ifdef PNG_USE_READ_MACROS
|
||||||
/* Inline macros to do direct reads of bytes from the input buffer.
|
/* 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
|
* The png_get_int_32() routine assumes we are using two's complement
|
||||||
|
43
pngrtran.c
43
pngrtran.c
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
/* pngrtran.c - transforms the data in a row for PNG readers
|
/* 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
|
* Copyright (c) 1998-2009 Glenn Randers-Pehrson
|
||||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
* (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
|
else
|
||||||
{
|
{
|
||||||
back.red = (png_byte)(pow(
|
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(
|
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(
|
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(
|
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(
|
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(
|
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++)
|
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 sp = row + row_info->rowbytes;
|
||||||
png_bytep dp = sp;
|
png_bytep dp = sp;
|
||||||
png_uint_16 a = 0;
|
png_uint_16 a = 0;
|
||||||
png_uint_32 i;
|
png_uint_32 i;
|
||||||
|
|
||||||
for (i = 0; i < row_width; i++)
|
for (i = 0; i < row_width; i++)
|
||||||
{
|
{
|
||||||
a = *(--sp); --dp;
|
a = *(--sp); --dp;
|
||||||
|
sp--; *(--dp) = PNG_8_BIT_PREMULTIPLY((*sp), a);
|
||||||
*(--dp) = (*(--sp) * a) / 255;
|
sp--; *(--dp) = PNG_8_BIT_PREMULTIPLY((*sp), a);
|
||||||
*(--dp) = (*(--sp) * a) / 255;
|
sp--; *(--dp) = PNG_8_BIT_PREMULTIPLY((*sp), a);
|
||||||
*(--dp) = (*(--sp) * a) / 255;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* This premultiplies the pixels with the alpha channel in RRGGBBAA */
|
/* 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 sp = (png_uint_16p)(row + row_info->rowbytes);
|
||||||
png_uint_16p dp = sp;
|
png_uint_16p dp = sp;
|
||||||
png_uint_32 a = 0;
|
png_uint_32 a = 0;
|
||||||
png_uint_32 i;
|
png_uint_32 i;
|
||||||
|
|
||||||
for (i = 0; i < row_width; i++)
|
for (i = 0; i < row_width; i++)
|
||||||
{
|
{
|
||||||
a = *(--sp); --dp;
|
a = *(--sp); --dp;
|
||||||
*(--dp) = (png_uint_16) ((*(--sp) * a) / 65535);
|
sp--; *(--dp) = PNG_16_BIT_PREMULTIPLY((*sp), a);
|
||||||
*(--dp) = (png_uint_16) ((*(--sp) * a) / 65535);
|
sp--; *(--dp) = PNG_16_BIT_PREMULTIPLY((*sp), a);
|
||||||
*(--dp) = (png_uint_16) ((*(--sp) * a) / 65535);
|
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 sp = row + row_info->rowbytes;
|
||||||
png_bytep dp = sp;
|
png_bytep dp = sp;
|
||||||
png_uint_16 a = 0;
|
png_uint_16 a = 0;
|
||||||
png_uint_32 i;
|
png_uint_32 i;
|
||||||
|
|
||||||
for (i = 0; i < row_width; i++)
|
for (i = 0; i < row_width; i++)
|
||||||
{
|
{
|
||||||
a = *(--sp); --dp;
|
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 */
|
/* 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++)
|
for (i = 0; i < row_width; i++)
|
||||||
{
|
{
|
||||||
a = *(--sp); --dp;
|
a = *(--sp); --dp;
|
||||||
*(--dp) = (png_uint_16) ((*(--sp) * a) / 65535);
|
sp--; *(--dp) = PNG_16_BIT_PREMULTIPLY((*sp), a);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user