📄 pngrtran.c
字号:
}
}
}
#endif
#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED)
/* expand grayscale files to rgb, with or without alpha */
void
png_do_gray_to_rgb(png_row_infop row_info, png_bytep row)
{
png_bytep sp, dp;
png_uint_32 i;
if (row && row_info && row_info->bit_depth >= 8 &&
!(row_info->color_type & PNG_COLOR_MASK_COLOR))
{
if (row_info->color_type == PNG_COLOR_TYPE_GRAY)
{
if (row_info->bit_depth == 8)
{
for (i = 0, sp = row + (png_size_t)row_info->width - 1,
dp = row + (png_size_t)row_info->width * 3 - 1;
i < row_info->width;
i++)
{
*(dp--) = *sp;
*(dp--) = *sp;
*(dp--) = *sp;
sp--;
}
}
else
{
for (i = 0, sp = row + (png_size_t)row_info->width * 2 - 1,
dp = row + (png_size_t)row_info->width * 6 - 1;
i < row_info->width;
i++)
{
*(dp--) = *sp;
*(dp--) = *(sp - 1);
*(dp--) = *sp;
*(dp--) = *(sp - 1);
*(dp--) = *sp;
*(dp--) = *(sp - 1);
sp--;
sp--;
}
}
}
else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
{
if (row_info->bit_depth == 8)
{
for (i = 0, sp = row + (png_size_t)row_info->width * 2 - 1,
dp = row + (png_size_t)row_info->width * 4 - 1;
i < row_info->width;
i++)
{
*(dp--) = *(sp--);
*(dp--) = *sp;
*(dp--) = *sp;
*(dp--) = *sp;
sp--;
}
}
else
{
for (i = 0, sp = row + (png_size_t)row_info->width * 4 - 1,
dp = row + (png_size_t)row_info->width * 8 - 1;
i < row_info->width;
i++)
{
*(dp--) = *(sp--);
*(dp--) = *(sp--);
*(dp--) = *sp;
*(dp--) = *(sp - 1);
*(dp--) = *sp;
*(dp--) = *(sp - 1);
*(dp--) = *sp;
*(dp--) = *(sp - 1);
sp--;
sp--;
}
}
}
row_info->channels += (png_byte)2;
row_info->color_type |= PNG_COLOR_MASK_COLOR;
row_info->pixel_depth = (png_byte)(row_info->channels *
row_info->bit_depth);
row_info->rowbytes = ((row_info->width *
row_info->pixel_depth + 7) >> 3);
}
}
#endif
/* build a grayscale palette. Palette is assumed to be 1 << bit_depth
large of png_color. This lets grayscale images be treated as
paletted. Most useful for gamma correction and simplification
of code. */
void
png_build_grayscale_palette(int bit_depth, png_colorp palette)
{
int num_palette;
int color_inc;
int i;
int v;
if (!palette)
return;
switch (bit_depth)
{
case 1:
num_palette = 2;
color_inc = 0xff;
break;
case 2:
num_palette = 4;
color_inc = 0x55;
break;
case 4:
num_palette = 16;
color_inc = 0x11;
break;
case 8:
num_palette = 256;
color_inc = 1;
break;
default:
num_palette = 0;
color_inc = 0;
break;
}
for (i = 0, v = 0; i < num_palette; i++, v += color_inc)
{
palette[i].red = (png_byte)v;
palette[i].green = (png_byte)v;
palette[i].blue = (png_byte)v;
}
}
/* This function is currently unused? */
#if defined(PNG_READ_DITHER_SUPPORTED) || defined(PNG_CORRECT_PALETTE_SUPPORTED)
void
png_correct_palette(png_structp png_ptr, png_colorp palette,
int num_palette)
{
#if defined(PNG_READ_BACKGROUND_SUPPORTED) && defined(PNG_READ_GAMMA_SUPPORTED)
if ((png_ptr->transformations & (PNG_GAMMA)) &&
(png_ptr->transformations & (PNG_BACKGROUND)))
{
if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
{
int i;
png_color back, back_1;
back.red = png_ptr->gamma_table[png_ptr->background.red];
back.green = png_ptr->gamma_table[png_ptr->background.green];
back.blue = png_ptr->gamma_table[png_ptr->background.blue];
back_1.red = png_ptr->gamma_to_1[png_ptr->background.red];
back_1.green = png_ptr->gamma_to_1[png_ptr->background.green];
back_1.blue = png_ptr->gamma_to_1[png_ptr->background.blue];
for (i = 0; i < num_palette; i++)
{
if (i < (int)png_ptr->num_trans &&
png_ptr->trans[i] == 0)
{
palette[i] = back;
}
else if (i < (int)png_ptr->num_trans &&
png_ptr->trans[i] != 0xff)
{
int v;
v = png_ptr->gamma_to_1[png_ptr->palette[i].red];
v = (int)(((png_uint_32)(v) *
(png_uint_32)(png_ptr->trans[i]) +
(png_uint_32)(back_1.red) *
(png_uint_32)(255 - png_ptr->trans[i]) +
127) / 255);
palette[i].red = png_ptr->gamma_from_1[v];
v = png_ptr->gamma_to_1[png_ptr->palette[i].green];
v = (int)(((png_uint_32)(v) *
(png_uint_32)(png_ptr->trans[i]) +
(png_uint_32)(back_1.green) *
(png_uint_32)(255 - png_ptr->trans[i]) +
127) / 255);
palette[i].green = png_ptr->gamma_from_1[v];
v = png_ptr->gamma_to_1[png_ptr->palette[i].blue];
v = (int)(((png_uint_32)(v) *
(png_uint_32)(png_ptr->trans[i]) +
(png_uint_32)(back_1.blue) *
(png_uint_32)(255 - png_ptr->trans[i]) +
127) / 255);
palette[i].blue = png_ptr->gamma_from_1[v];
}
else
{
palette[i].red = png_ptr->gamma_table[palette[i].red];
palette[i].green = png_ptr->gamma_table[palette[i].green];
palette[i].blue = png_ptr->gamma_table[palette[i].blue];
}
}
}
else
{
int i;
png_color back;
back.red = png_ptr->gamma_table[png_ptr->background.red];
back.green = png_ptr->gamma_table[png_ptr->background.green];
back.blue = png_ptr->gamma_table[png_ptr->background.blue];
for (i = 0; i < num_palette; i++)
{
if (palette[i].red == png_ptr->trans_values.gray)
{
palette[i] = back;
}
else
{
palette[i].red = png_ptr->gamma_table[palette[i].red];
palette[i].green = png_ptr->gamma_table[palette[i].green];
palette[i].blue = png_ptr->gamma_table[palette[i].blue];
}
}
}
}
else
#endif
#if defined(PNG_READ_GAMMA_SUPPORTED)
if (png_ptr->transformations & (PNG_GAMMA))
{
int i;
for (i = 0; i < num_palette; i++)
{
palette[i].red = png_ptr->gamma_table[palette[i].red];
palette[i].green = png_ptr->gamma_table[palette[i].green];
palette[i].blue = png_ptr->gamma_table[palette[i].blue];
}
}
#if defined(PNG_READ_BACKGROUND_SUPPORTED)
else
#endif
#endif
#if defined(PNG_READ_BACKGROUND_SUPPORTED)
if (png_ptr->transformations & (PNG_BACKGROUND))
{
if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
{
int i;
png_color back;
back.red = (png_byte)png_ptr->background.red;
back.green = (png_byte)png_ptr->background.green;
back.blue = (png_byte)png_ptr->background.blue;
for (i = 0; i < num_palette; i++)
{
if (i >= (int)png_ptr->num_trans ||
png_ptr->trans[i] == 0)
{
palette[i].red = back.red;
palette[i].green = back.green;
palette[i].blue = back.blue;
}
else if (i < (int)png_ptr->num_trans ||
png_ptr->trans[i] != 0xff)
{
palette[i].red = (png_byte)((
(png_uint_32)(png_ptr->palette[i].red) *
(png_uint_32)(png_ptr->trans[i]) +
(png_uint_32)(back.red) *
(png_uint_32)(255 - png_ptr->trans[i]) +
127) / 255);
palette[i].green = (png_byte)((
(png_uint_32)(png_ptr->palette[i].green) *
(png_uint_32)(png_ptr->trans[i]) +
(png_uint_32)(back.green) *
(png_uint_32)(255 - png_ptr->trans[i]) +
127) / 255);
palette[i].blue = (png_byte)((
(png_uint_32)(png_ptr->palette[i].blue) *
(png_uint_32)(png_ptr->trans[i]) +
(png_uint_32)(back.blue) *
(png_uint_32)(255 - png_ptr->trans[i]) +
127) / 255);
}
}
}
else /* assume grayscale palette (what else could it be?) */
{
int i;
for (i = 0; i < num_palette; i++)
{
if (i == (int)png_ptr->trans_values.gray)
{
palette[i].red = (png_byte)png_ptr->background.red;
palette[i].green = (png_byte)png_ptr->background.green;
palette[i].blue = (png_byte)png_ptr->background.blue;
}
}
}
}
#endif
}
#endif
#if defined(PNG_READ_BACKGROUND_SUPPORTED)
/* replace any alpha or transparency with the supplied background color.
background is the color. note that paletted files are taken care of
elsewhere */
void
png_do_background(png_row_infop row_info, png_bytep row,
png_color_16p trans_values, png_color_16p background,
png_color_16p background_1,
png_bytep gamma_table, png_bytep gamma_from_1, png_bytep gamma_to_1,
png_uint_16pp gamma_16, png_uint_16pp gamma_16_from_1,
png_uint_16pp gamma_16_to_1, int gamma_shift)
{
png_bytep sp, dp;
png_uint_32 i;
int shift;
if (row && row_info && background &&
(!(row_info->color_type & PNG_COLOR_MASK_ALPHA) ||
(row_info->color_type != PNG_COLOR_TYPE_PALETTE &&
trans_values)))
{
switch (row_info->color_type)
{
case PNG_COLOR_TYPE_GRAY:
{
switch (row_info->bit_depth)
{
case 1:
{
sp = row;
shift = 7;
for (i = 0; i < row_info->width; i++)
{
if (((*sp >> shift) & 0x1) ==
trans_values->gray)
{
*sp &= (png_byte)((0x7f7f >> (7 - shift)) & 0xff);
*sp |= (png_byte)(background->gray << shift);
}
if (!shift)
{
shift = 7;
sp++;
}
else
shift--;
}
break;
}
case 2:
{
sp = row;
shift = 6;
for (i = 0; i < row_info->width; i++)
{
if (((*sp >> shift) & 0x3) ==
trans_values->gray)
{
*sp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff);
*sp |= (png_byte)(background->gray << shift);
}
if (!shift)
{
shift = 6;
sp++;
}
else
shift -= 2;
}
break;
}
case 4:
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -