cppAdaptive1
view release on metacpan or search on metacpan
src/dlib/external/libpng/pngread.c view on Meta::CPAN
return f;
}
/* NOTE: E_LINEAR values to this routine must be 16-bit, but E_FILE values must
* be 8-bit.
*/
static void
png_create_colormap_entry(png_image_read_control *display,
png_uint_32 ip, png_uint_32 red, png_uint_32 green, png_uint_32 blue,
png_uint_32 alpha, int encoding)
{
png_imagep image = display->image;
const int output_encoding = (image->format & PNG_FORMAT_FLAG_LINEAR) ?
E_LINEAR : E_sRGB;
const int convert_to_Y = (image->format & PNG_FORMAT_FLAG_COLOR) == 0 &&
(red != green || green != blue);
if (ip > 255)
png_error(image->opaque->png_ptr, "color-map index out of range");
/* Update the cache with whether the file gamma is significantly different
* from sRGB.
*/
if (encoding == E_FILE)
{
if (display->file_encoding == E_NOTSET)
set_file_encoding(display);
/* Note that the cached value may be E_FILE too, but if it is then the
* gamma_to_linear member has been set.
*/
encoding = display->file_encoding;
}
if (encoding == E_FILE)
{
png_fixed_point g = display->gamma_to_linear;
red = png_gamma_16bit_correct(red*257, g);
green = png_gamma_16bit_correct(green*257, g);
blue = png_gamma_16bit_correct(blue*257, g);
if (convert_to_Y || output_encoding == E_LINEAR)
{
alpha *= 257;
encoding = E_LINEAR;
}
else
{
red = PNG_sRGB_FROM_LINEAR(red * 255);
green = PNG_sRGB_FROM_LINEAR(green * 255);
blue = PNG_sRGB_FROM_LINEAR(blue * 255);
encoding = E_sRGB;
}
}
else if (encoding == E_LINEAR8)
{
/* This encoding occurs quite frequently in test cases because PngSuite
* includes a gAMA 1.0 chunk with most images.
*/
red *= 257;
green *= 257;
blue *= 257;
alpha *= 257;
encoding = E_LINEAR;
}
else if (encoding == E_sRGB && (convert_to_Y || output_encoding == E_LINEAR))
{
/* The values are 8-bit sRGB values, but must be converted to 16-bit
* linear.
*/
red = png_sRGB_table[red];
green = png_sRGB_table[green];
blue = png_sRGB_table[blue];
alpha *= 257;
encoding = E_LINEAR;
}
/* This is set if the color isn't gray but the output is. */
if (encoding == E_LINEAR)
{
if (convert_to_Y)
{
/* NOTE: these values are copied from png_do_rgb_to_gray */
png_uint_32 y = (png_uint_32)6968 * red + (png_uint_32)23434 * green +
(png_uint_32)2366 * blue;
if (output_encoding == E_LINEAR)
y = (y + 16384) >> 15;
else
{
/* y is scaled by 32768, we need it scaled by 255: */
y = (y + 128) >> 8;
y *= 255;
y = PNG_sRGB_FROM_LINEAR((y + 64) >> 7);
encoding = E_sRGB;
}
blue = red = green = y;
}
else if (output_encoding == E_sRGB)
{
red = PNG_sRGB_FROM_LINEAR(red * 255);
green = PNG_sRGB_FROM_LINEAR(green * 255);
blue = PNG_sRGB_FROM_LINEAR(blue * 255);
alpha = PNG_DIV257(alpha);
encoding = E_sRGB;
}
}
if (encoding != output_encoding)
png_error(image->opaque->png_ptr, "bad encoding (internal error)");
/* Store the value. */
{
( run in 1.952 second using v1.01-cache-2.11-cpan-39bf76dae61 )