193 lines
4.0 KiB
C
193 lines
4.0 KiB
C
|
|
||
|
/* pngtrans.c - transforms the data in a row
|
||
|
routines used by both readers and writers
|
||
|
|
||
|
libpng 1.0 beta 1 - version 0.71
|
||
|
For conditions of distribution and use, see copyright notice in png.h
|
||
|
Copyright (c) 1995 Guy Eric Schalnat, Group 42, Inc.
|
||
|
June 26, 1995
|
||
|
*/
|
||
|
|
||
|
#define PNG_INTERNAL
|
||
|
#include "png.h"
|
||
|
|
||
|
/* turn on bgr to rgb mapping */
|
||
|
void
|
||
|
png_set_bgr(png_struct *png_ptr)
|
||
|
{
|
||
|
png_ptr->transformations |= PNG_BGR;
|
||
|
}
|
||
|
|
||
|
/* turn on 16 bit byte swapping */
|
||
|
void
|
||
|
png_set_swap(png_struct *png_ptr)
|
||
|
{
|
||
|
if (png_ptr->bit_depth == 16)
|
||
|
png_ptr->transformations |= PNG_SWAP_BYTES;
|
||
|
}
|
||
|
|
||
|
/* turn on pixel packing */
|
||
|
void
|
||
|
png_set_packing(png_struct *png_ptr)
|
||
|
{
|
||
|
if (png_ptr->bit_depth < 8)
|
||
|
{
|
||
|
png_ptr->transformations |= PNG_PACK;
|
||
|
png_ptr->usr_bit_depth = 8;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void
|
||
|
png_set_shift(png_struct *png_ptr, png_color_8 *true_bits)
|
||
|
{
|
||
|
png_ptr->transformations |= PNG_SHIFT;
|
||
|
png_ptr->shift = *true_bits;
|
||
|
}
|
||
|
|
||
|
int
|
||
|
png_set_interlace_handling(png_struct *png_ptr)
|
||
|
{
|
||
|
if (png_ptr->interlaced)
|
||
|
{
|
||
|
png_ptr->transformations |= PNG_INTERLACE;
|
||
|
return 7;
|
||
|
}
|
||
|
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
void
|
||
|
png_set_rgbx(png_struct *png_ptr)
|
||
|
{
|
||
|
png_ptr->transformations |= PNG_RGBA;
|
||
|
if (png_ptr->color_type == PNG_COLOR_TYPE_RGB &&
|
||
|
png_ptr->bit_depth == 8)
|
||
|
png_ptr->usr_channels = 4;
|
||
|
}
|
||
|
|
||
|
void
|
||
|
png_set_xrgb(png_struct *png_ptr)
|
||
|
{
|
||
|
png_ptr->transformations |= PNG_XRGB;
|
||
|
if (png_ptr->color_type == PNG_COLOR_TYPE_RGB &&
|
||
|
png_ptr->bit_depth == 8)
|
||
|
png_ptr->usr_channels = 4;
|
||
|
}
|
||
|
|
||
|
void
|
||
|
png_set_invert_mono(png_struct *png_ptr)
|
||
|
{
|
||
|
png_ptr->transformations |= PNG_INVERT_MONO;
|
||
|
}
|
||
|
|
||
|
/* invert monocrome grayscale data */
|
||
|
void
|
||
|
png_do_invert(png_row_info *row_info, png_byte *row)
|
||
|
{
|
||
|
if (row && row_info && row_info->bit_depth == 1 &&
|
||
|
row_info->color_type == PNG_COLOR_TYPE_GRAY)
|
||
|
{
|
||
|
png_byte *rp;
|
||
|
png_uint_32 i;
|
||
|
|
||
|
for (i = 0, rp = row;
|
||
|
i < row_info->rowbytes;
|
||
|
i++, rp++)
|
||
|
{
|
||
|
*rp = ~(*rp);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* swaps byte order on 16 bit depth images */
|
||
|
void
|
||
|
png_do_swap(png_row_info *row_info, png_byte *row)
|
||
|
{
|
||
|
if (row && row_info && row_info->bit_depth == 16)
|
||
|
{
|
||
|
png_byte *rp, t;
|
||
|
png_uint_32 i;
|
||
|
|
||
|
for (i = 0, rp = row;
|
||
|
i < row_info->width * row_info->channels;
|
||
|
i++, rp += 2)
|
||
|
{
|
||
|
t = *rp;
|
||
|
*rp = *(rp + 1);
|
||
|
*(rp + 1) = t;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* swaps red and blue */
|
||
|
void
|
||
|
png_do_bgr(png_row_info *row_info, png_byte *row)
|
||
|
{
|
||
|
if (row && row_info && (row_info->color_type & 2))
|
||
|
{
|
||
|
if (row_info->color_type == 2 && row_info->bit_depth == 8)
|
||
|
{
|
||
|
png_byte *rp, t;
|
||
|
png_uint_32 i;
|
||
|
|
||
|
for (i = 0, rp = row;
|
||
|
i < row_info->width;
|
||
|
i++, rp += 3)
|
||
|
{
|
||
|
t = *rp;
|
||
|
*rp = *(rp + 2);
|
||
|
*(rp + 2) = t;
|
||
|
}
|
||
|
}
|
||
|
else if (row_info->color_type == 6 && row_info->bit_depth == 8)
|
||
|
{
|
||
|
png_byte *rp, t;
|
||
|
png_uint_32 i;
|
||
|
|
||
|
for (i = 0, rp = row;
|
||
|
i < row_info->width;
|
||
|
i++, rp += 4)
|
||
|
{
|
||
|
t = *rp;
|
||
|
*rp = *(rp + 2);
|
||
|
*(rp + 2) = t;
|
||
|
}
|
||
|
}
|
||
|
else if (row_info->color_type == 2 && row_info->bit_depth == 16)
|
||
|
{
|
||
|
png_byte *rp, t[2];
|
||
|
png_uint_32 i;
|
||
|
|
||
|
for (i = 0, rp = row;
|
||
|
i < row_info->width;
|
||
|
i++, rp += 6)
|
||
|
{
|
||
|
t[0] = *rp;
|
||
|
t[1] = *(rp + 1);
|
||
|
*rp = *(rp + 4);
|
||
|
*(rp + 1) = *(rp + 5);
|
||
|
*(rp + 4) = t[0];
|
||
|
*(rp + 5) = t[1];
|
||
|
}
|
||
|
}
|
||
|
else if (row_info->color_type == 6 && row_info->bit_depth == 16)
|
||
|
{
|
||
|
png_byte *rp, t[2];
|
||
|
png_uint_32 i;
|
||
|
|
||
|
for (i = 0, rp = row;
|
||
|
i < row_info->width;
|
||
|
i++, rp += 8)
|
||
|
{
|
||
|
t[0] = *rp;
|
||
|
t[1] = *(rp + 1);
|
||
|
*rp = *(rp + 4);
|
||
|
*(rp + 1) = *(rp + 5);
|
||
|
*(rp + 4) = t[0];
|
||
|
*(rp + 5) = t[1];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|