mirror of
https://git.code.sf.net/p/libpng/code.git
synced 2025-07-10 18:04:09 +02:00
[devel] Added named value and 'flag' gamma support to png_set_gamma. Made a
minor change from the previous (unreleased) ABI/API to hide the exact value used for Macs - it's not a good idea to embed this in the ABI!
This commit is contained in:
parent
d768d103cf
commit
f70c7d02e9
7
ANNOUNCE
7
ANNOUNCE
@ -1,5 +1,5 @@
|
||||
|
||||
Libpng 1.5.3beta07 - May 9, 2011
|
||||
Libpng 1.5.3beta07 - May 11, 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.
|
||||
@ -101,8 +101,11 @@ Version 1.5.3beta06 [May 8, 2011]
|
||||
Removed the -D_ALL_SOURCE from definitions for AIX in CMakeLists.txt
|
||||
Implemented premultiplied alpha support: png_set_alpha_mode API
|
||||
|
||||
Version 1.5.3beta07 [May 9, 2011]
|
||||
Version 1.5.3beta07 [May 11, 2011]
|
||||
Added expand_16 support to the high level interface.
|
||||
Added named value and 'flag' gamma support to png_set_gamma. Made a minor
|
||||
change from the previous (unreleased) ABI/API to hide the exact value used
|
||||
for Macs - it's not a good idea to embed this in the ABI!
|
||||
|
||||
Send comments/corrections/commendations to png-mng-implement at lists.sf.net:
|
||||
(subscription required; visit
|
||||
|
||||
5
CHANGES
5
CHANGES
@ -3360,8 +3360,11 @@ Version 1.5.3beta06 [May 8, 2011]
|
||||
Removed the -D_ALL_SOURCE from definitions for AIX in CMakeLists.txt
|
||||
Implemented premultiplied alpha support: png_set_alpha_mode API
|
||||
|
||||
Version 1.5.3beta07 [May 9, 2011]
|
||||
Version 1.5.3beta07 [May 11, 2011]
|
||||
Added expand_16 support to the high level interface.
|
||||
Added named value and 'flag' gamma support to png_set_gamma. Made a minor
|
||||
change from the previous (unreleased) ABI/API to hide the exact value used
|
||||
for Macs - it's not a good idea to embed this in the ABI!
|
||||
|
||||
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
|
||||
(subscription required; visit
|
||||
|
||||
33
png.h
33
png.h
@ -1,7 +1,7 @@
|
||||
|
||||
/* png.h - header file for PNG reference library
|
||||
*
|
||||
* libpng version 1.5.3beta07 - May 9, 2011
|
||||
* libpng version 1.5.3beta07 - May 11, 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.3beta07 - May 9, 2011: Glenn
|
||||
* libpng versions 0.97, January 1998, through 1.5.3beta07 - May 11, 2011: Glenn
|
||||
* See also "Contributing Authors", below.
|
||||
*
|
||||
* Note about libpng version numbers:
|
||||
@ -182,7 +182,7 @@
|
||||
*
|
||||
* This code is released under the libpng license.
|
||||
*
|
||||
* libpng versions 1.2.6, August 15, 2004, through 1.5.3beta07, May 9, 2011, are
|
||||
* libpng versions 1.2.6, August 15, 2004, through 1.5.3beta07, May 11, 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:
|
||||
@ -294,7 +294,7 @@
|
||||
* Y2K compliance in libpng:
|
||||
* =========================
|
||||
*
|
||||
* May 9, 2011
|
||||
* May 11, 2011
|
||||
*
|
||||
* Since the PNG Development group is an ad-hoc body, we can't make
|
||||
* an official declaration.
|
||||
@ -357,7 +357,7 @@
|
||||
/* Version information for png.h - this should match the version in png.c */
|
||||
#define PNG_LIBPNG_VER_STRING "1.5.3beta07"
|
||||
#define PNG_HEADER_VERSION_STRING \
|
||||
" libpng version 1.5.3beta07 - May 9, 2011\n"
|
||||
" libpng version 1.5.3beta07 - May 11, 2011\n"
|
||||
|
||||
#define PNG_LIBPNG_VER_SONUM 15
|
||||
#define PNG_LIBPNG_VER_DLLNUM 15
|
||||
@ -1176,7 +1176,9 @@ PNG_FP_EXPORT(227, void, png_set_alpha_mode, (png_structp png_ptr, int mode,
|
||||
double output_gamma));
|
||||
PNG_FIXED_EXPORT(228, void, png_set_alpha_mode_fixed, (png_structp png_ptr,
|
||||
int mode, png_fixed_point output_gamma));
|
||||
#endif
|
||||
|
||||
#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_ALPHA_MODE_SUPPORTED)
|
||||
/* The output_gamma value is a screen gamma in libpng terminology: it expresses
|
||||
* how to decode the output values, not how they are encoded. The values used
|
||||
* correspond to the normal numbers used to describe the overall gamma of a
|
||||
@ -1230,14 +1232,22 @@ PNG_FIXED_EXPORT(228, void, png_set_alpha_mode_fixed, (png_structp png_ptr,
|
||||
* better to call png_set_alpha_mode() with PNG_DEFAULT_sRGB than rely on the
|
||||
* default if you don't know what the right answer is!
|
||||
*
|
||||
* The special value PNG_GAMMA_MAC_18 indicates an older Mac system (pre Mac OS
|
||||
* 10.6) which used a correction table to implement a somewhat lower gamma on an
|
||||
* otherwise sRGB system.
|
||||
*
|
||||
* Both these values are reserved (not simple gamma values) in order to allow
|
||||
* more precise correction internally in the future.
|
||||
*
|
||||
* NOTE: the following values can be passed to either the fixed or floating
|
||||
* point APIs, but the floating point API will also accept floating point
|
||||
* values.
|
||||
*/
|
||||
#define PNG_DEFAULT_sRGB 0 /* sRGB gamma and color space */
|
||||
#define PNG_DEFAULT_sRGB -1 /* sRGB gamma and color space */
|
||||
#define PNG_GAMMA_MAC_18 -2 /* Old Mac '1.8' gamma and color space */
|
||||
#define PNG_GAMMA_sRGB 220000 /* Television standards--matches sRGB gamma */
|
||||
#define PNG_GAMMA_MAC 151724 /* Television with a 1.45 correction table */
|
||||
#define PNG_GAMMA_LINEAR PNG_FP_1 /* Linear */
|
||||
#endif
|
||||
|
||||
/* The following are examples of calls to png_set_alpha_mode to achieve the
|
||||
* required overall gamma correction and, where necessary, alpha
|
||||
@ -1314,7 +1324,6 @@ PNG_FIXED_EXPORT(228, void, png_set_alpha_mode_fixed, (png_structp png_ptr,
|
||||
* made in the same read operation, however multiple calls with PNG_ALPHA_PNG
|
||||
* are ignored.
|
||||
*/
|
||||
#endif
|
||||
|
||||
#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED
|
||||
PNG_EXPORT(36, void, png_set_strip_alpha, (png_structp png_ptr));
|
||||
@ -1421,7 +1430,13 @@ PNG_EXPORT(49, void, png_set_quantize,
|
||||
/* Handle gamma correction. Screen_gamma=(display_exponent).
|
||||
* NOTE: this API simply sets the screen and file gamma values. It will
|
||||
* therefore override the value for gamma in a PNG file if it is called after
|
||||
* the file header has been read - use with care!
|
||||
* the file header has been read - use with care - call before reading the PNG
|
||||
* file for best results!
|
||||
*
|
||||
* These routines accept the same gamma values as png_set_alpha_mode (described
|
||||
* above). The PNG_GAMMA_ defines and PNG_DEFAULT_sRGB can be passed to either
|
||||
* API (floating point or fixed.) Notice, however, that the 'file_gamma' value
|
||||
* is the inverse of a 'screen gamma' value.
|
||||
*/
|
||||
PNG_FP_EXPORT(50, void, png_set_gamma,
|
||||
(png_structp png_ptr, double screen_gamma,
|
||||
|
||||
@ -459,6 +459,11 @@ PNG_EXTERN png_fixed_point png_fixed PNGARG((png_structp png_ptr, double fp,
|
||||
#define PNG_tRNS PNG_CONST png_byte png_tRNS[5] = {116, 82, 78, 83, '\0'}
|
||||
#define PNG_zTXt PNG_CONST png_byte png_zTXt[5] = {122, 84, 88, 116, '\0'}
|
||||
|
||||
/* Gamma values (new at libpng-1.5.3): */
|
||||
#define PNG_GAMMA_MAC_OLD 151724 /* Assume '1.8' is really 2.2/1.45! */
|
||||
#define PNG_GAMMA_MAC_INVERSE 65909
|
||||
#define PNG_GAMMA_sRGB_INVERSE 45455
|
||||
|
||||
|
||||
/* Inhibit C++ name-mangling for libpng functions but not for system calls. */
|
||||
#ifdef __cplusplus
|
||||
|
||||
105
pngrtran.c
105
pngrtran.c
@ -159,6 +159,68 @@ png_set_strip_alpha(png_structp png_ptr)
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(PNG_READ_ALPHA_MODE_SUPPORTED) || defined(PNG_READ_GAMMA_SUPPORTED)
|
||||
static png_fixed_point
|
||||
translate_gamma_flags(png_structp png_ptr, png_fixed_point output_gamma,
|
||||
int is_screen)
|
||||
{
|
||||
/* Check for flag values. The main reason for having the old Mac value as a
|
||||
* flag is that it is pretty near impossible to work out what the correct
|
||||
* value is from Apple documentation - a working Mac system is needed to
|
||||
* discover the value!
|
||||
*/
|
||||
if (output_gamma == PNG_DEFAULT_sRGB ||
|
||||
output_gamma == PNG_FP_1 / PNG_DEFAULT_sRGB)
|
||||
{
|
||||
/* If there is no sRGB support this just sets the gamma to the standard
|
||||
* sRGB value. (This is a side effect of using this function!)
|
||||
*/
|
||||
# ifdef PNG_READ_sRGB_SUPPORTED
|
||||
png_ptr->flags |= PNG_FLAG_ASSUME_sRGB;
|
||||
# endif
|
||||
if (is_screen)
|
||||
output_gamma = PNG_GAMMA_sRGB;
|
||||
else
|
||||
output_gamma = PNG_GAMMA_sRGB_INVERSE;
|
||||
}
|
||||
|
||||
else if (output_gamma == PNG_GAMMA_MAC_18 ||
|
||||
output_gamma == PNG_FP_1 / PNG_GAMMA_MAC_18)
|
||||
{
|
||||
if (is_screen)
|
||||
output_gamma = PNG_GAMMA_MAC_OLD;
|
||||
else
|
||||
output_gamma = PNG_GAMMA_MAC_INVERSE;
|
||||
}
|
||||
|
||||
return output_gamma;
|
||||
}
|
||||
|
||||
# ifdef PNG_FLOATING_POINT_SUPPORTED
|
||||
static png_fixed_point
|
||||
convert_gamma_value(png_structp png_ptr, double output_gamma)
|
||||
{
|
||||
/* The following silently ignores cases where fixed point (times 100,000)
|
||||
* gamma values are passed to the floating point API. This is safe and it
|
||||
* means the fixed point constants work just fine with the floating point
|
||||
* API. The alternative would just lead to undetected errors and spurious
|
||||
* bug reports. Negative values fail inside the _fixed API unless they
|
||||
* correspond to the flag values.
|
||||
*/
|
||||
if (output_gamma > 0 && output_gamma < 128)
|
||||
output_gamma *= PNG_FP_1;
|
||||
|
||||
/* This preserves -1 and -2 exactly: */
|
||||
output_gamma = floor(output_gamma + .5);
|
||||
|
||||
if (output_gamma > PNG_FP_MAX || output_gamma < PNG_FP_MIN)
|
||||
png_fixed_error(png_ptr, "gamma value");
|
||||
|
||||
return (png_fixed_point)output_gamma;
|
||||
}
|
||||
# endif
|
||||
#endif /* READ_ALPHA_MODE || READ_GAMMA */
|
||||
|
||||
#ifdef PNG_READ_ALPHA_MODE_SUPPORTED
|
||||
void PNGFAPI
|
||||
png_set_alpha_mode_fixed(png_structp png_ptr, int mode,
|
||||
@ -172,28 +234,15 @@ png_set_alpha_mode_fixed(png_structp png_ptr, int mode,
|
||||
if (png_ptr == NULL)
|
||||
return;
|
||||
|
||||
/* If the default_gamma value is 0 then switch on the whole sRGB
|
||||
* edifice by this flag (note: this is a flag to the later code,
|
||||
* not a transformation!)
|
||||
*/
|
||||
if (output_gamma == PNG_DEFAULT_sRGB)
|
||||
{
|
||||
/* If there is no sRGB support this just sets the gamma to the standard
|
||||
* sRGB value.
|
||||
*/
|
||||
# ifdef PNG_READ_sRGB_SUPPORTED
|
||||
png_ptr->flags |= PNG_FLAG_ASSUME_sRGB;
|
||||
# endif
|
||||
output_gamma = PNG_GAMMA_sRGB;
|
||||
}
|
||||
output_gamma = translate_gamma_flags(png_ptr, output_gamma, 1/*screen*/);
|
||||
|
||||
/* Else validate the value to ensure it is in a reasonable range. The value
|
||||
/* Validate the value to ensure it is in a reasonable range. The value
|
||||
* is expected to be 1 or greater, but this range test allows for some
|
||||
* viewing correction values. The intent is to weed out users of this API
|
||||
* who use the inverse of the gamma value accidentally! Since some of these
|
||||
* values are reasonable this may have to be changed.
|
||||
*/
|
||||
else if (output_gamma < 70000 || output_gamma > 300000)
|
||||
if (output_gamma < 70000 || output_gamma > 300000)
|
||||
png_error(png_ptr, "output gamma out of expected range");
|
||||
|
||||
/* The default file gamma is the inverse of the output gamma; the output
|
||||
@ -286,19 +335,8 @@ png_set_alpha_mode_fixed(png_structp png_ptr, int mode,
|
||||
void PNGAPI
|
||||
png_set_alpha_mode(png_structp png_ptr, int mode, double output_gamma)
|
||||
{
|
||||
/* The following silently ignores cases where fixed point (times 100,000)
|
||||
* gamma values are passed to the floating point API. This is safe and it
|
||||
* means the fixed point constants work just fine with the floating point
|
||||
* API. The alternative would just lead to undetected errors and spurious
|
||||
* bug reports. Negative values fail inside the _fixed API.
|
||||
*/
|
||||
if (output_gamma > -128 && output_gamma < 128)
|
||||
output_gamma *= PNG_FP_1;
|
||||
|
||||
if (output_gamma <= PNG_FP_MAX && output_gamma >= PNG_FP_MIN)
|
||||
png_set_alpha_mode_fixed(png_ptr, mode, (png_fixed_point)output_gamma);
|
||||
else
|
||||
png_fixed_error(png_ptr, "png_set_alpha_mode gamma");
|
||||
png_set_alpha_mode_fixed(png_ptr, mode, convert_gamma_value(png_ptr,
|
||||
output_gamma));
|
||||
}
|
||||
# endif
|
||||
#endif
|
||||
@ -719,6 +757,10 @@ png_set_gamma_fixed(png_structp png_ptr, png_fixed_point scrn_gamma,
|
||||
if (png_ptr == NULL)
|
||||
return;
|
||||
|
||||
/* New in libpng-1.5.3 - reserve particular negative values as flags. */
|
||||
scrn_gamma = translate_gamma_flags(png_ptr, scrn_gamma, 1/*screen*/);
|
||||
file_gamma = translate_gamma_flags(png_ptr, file_gamma, 0/*file*/);
|
||||
|
||||
#if PNG_LIBPNG_VER >= 10600
|
||||
/* Checking the gamma values for being >0 was added in 1.5.3 along with the
|
||||
* premultiplied alpha support; this actually hides an undocumented feature
|
||||
@ -749,9 +791,8 @@ png_set_gamma_fixed(png_structp png_ptr, png_fixed_point scrn_gamma,
|
||||
void PNGAPI
|
||||
png_set_gamma(png_structp png_ptr, double scrn_gamma, double file_gamma)
|
||||
{
|
||||
png_set_gamma_fixed(png_ptr,
|
||||
png_fixed(png_ptr, scrn_gamma, "png_set_gamma screen gamma"),
|
||||
png_fixed(png_ptr, file_gamma, "png_set_gamma file gamma"));
|
||||
png_set_gamma_fixed(png_ptr, convert_gamma_value(png_ptr, scrn_gamma),
|
||||
convert_gamma_value(png_ptr, file_gamma));
|
||||
}
|
||||
# endif /* FLOATING_POINT_SUPPORTED */
|
||||
#endif /* READ_GAMMA */
|
||||
|
||||
2
pngset.c
2
pngset.c
@ -545,7 +545,7 @@ png_set_sRGB_gAMA_and_cHRM(png_structp png_ptr, png_infop info_ptr,
|
||||
png_set_sRGB(png_ptr, info_ptr, srgb_intent);
|
||||
|
||||
# ifdef PNG_gAMA_SUPPORTED
|
||||
png_set_gAMA_fixed(png_ptr, info_ptr, 45455L);
|
||||
png_set_gAMA_fixed(png_ptr, info_ptr, PNG_GAMMA_sRGB_INVERSE);
|
||||
# endif
|
||||
|
||||
# ifdef PNG_cHRM_SUPPORTED
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user