diff --git a/ANNOUNCE b/ANNOUNCE index a3cd3de41..af13e2426 100644 --- a/ANNOUNCE +++ b/ANNOUNCE @@ -198,6 +198,8 @@ Version 1.5.4beta02 [June 14, 2011] Added png_set_chop_16() API, to match inaccurate results from previous libpng versions. Removed the ACCURATE and LEGACY options (they are no longer useable) + Use the old scaling method for background if png_set_chop_16() was + called. Send comments/corrections/commendations to png-mng-implement at lists.sf.net: (subscription required; visit diff --git a/CHANGES b/CHANGES index b77e43da8..0d4e02b35 100644 --- a/CHANGES +++ b/CHANGES @@ -3461,6 +3461,8 @@ Version 1.5.4beta02 [June 14, 2011] Added png_set_chop_16() API, to match inaccurate results from previous libpng versions. Removed the ACCURATE and LEGACY options (they are no longer useable) + Use the old scaling method for background if png_set_chop_16() was + called. Send comments/corrections/commendations to png-mng-implement at lists.sf.net (subscription required; visit diff --git a/pngrtran.c b/pngrtran.c index 488e7cd0f..01f5463cd 100644 --- a/pngrtran.c +++ b/pngrtran.c @@ -1453,12 +1453,25 @@ png_init_read_transformations(png_structp png_ptr) * The PNG_BACKGROUND_EXPAND code above does not expand to 16 bits at * present, so that case is ok (until do_expand_16 is moved.) */ + + if (png_ptr->transformations & PNG_CHOP_16_TO_8) + { # define CHOP(x) (x)=((png_uint_16)(((png_uint_32)(x)*255+32895) >> 16)) CHOP(png_ptr->background.red); CHOP(png_ptr->background.green); CHOP(png_ptr->background.blue); CHOP(png_ptr->background.gray); # undef CHOP + } + else /* Use pre-libpng-1.5.4 inaccurate "ACCURATE" scaling */ + { +# define CHOP(x) ((png_uint_16)((2*(png_uint_32)(x) + 257)/514)) + CHOP(png_ptr->background.red); + CHOP(png_ptr->background.green); + CHOP(png_ptr->background.blue); + CHOP(png_ptr->background.gray); +# undef CHOP + } } #endif