Blame pngtrans.c

Packit 0ba690
Packit 0ba690
/* pngtrans.c - transforms the data in a row (used by both readers and writers)
Packit 0ba690
 *
Packit 0ba690
 * Last changed in libpng 1.2.41 [December 3, 2009]
Packit 0ba690
 * Copyright (c) 1998-2002,2004,2006-2009 Glenn Randers-Pehrson
Packit 0ba690
 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
Packit 0ba690
 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
Packit 0ba690
 *
Packit 0ba690
 * This code is released under the libpng license.
Packit 0ba690
 * For conditions of distribution and use, see the disclaimer
Packit 0ba690
 * and license in png.h
Packit 0ba690
 */
Packit 0ba690
Packit 0ba690
#define PNG_INTERNAL
Packit 0ba690
#define PNG_NO_PEDANTIC_WARNINGS
Packit 0ba690
#include "png.h"
Packit 0ba690
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
Packit 0ba690
Packit 0ba690
#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
Packit 0ba690
/* Turn on BGR-to-RGB mapping */
Packit 0ba690
void PNGAPI
Packit 0ba690
png_set_bgr(png_structp png_ptr)
Packit 0ba690
{
Packit 0ba690
   png_debug(1, "in png_set_bgr");
Packit 0ba690
Packit 0ba690
   if (png_ptr == NULL)
Packit 0ba690
      return;
Packit 0ba690
   png_ptr->transformations |= PNG_BGR;
Packit 0ba690
}
Packit 0ba690
#endif
Packit 0ba690
Packit 0ba690
#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
Packit 0ba690
/* Turn on 16 bit byte swapping */
Packit 0ba690
void PNGAPI
Packit 0ba690
png_set_swap(png_structp png_ptr)
Packit 0ba690
{
Packit 0ba690
   png_debug(1, "in png_set_swap");
Packit 0ba690
Packit 0ba690
   if (png_ptr == NULL)
Packit 0ba690
      return;
Packit 0ba690
   if (png_ptr->bit_depth == 16)
Packit 0ba690
      png_ptr->transformations |= PNG_SWAP_BYTES;
Packit 0ba690
}
Packit 0ba690
#endif
Packit 0ba690
Packit 0ba690
#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED)
Packit 0ba690
/* Turn on pixel packing */
Packit 0ba690
void PNGAPI
Packit 0ba690
png_set_packing(png_structp png_ptr)
Packit 0ba690
{
Packit 0ba690
   png_debug(1, "in png_set_packing");
Packit 0ba690
Packit 0ba690
   if (png_ptr == NULL)
Packit 0ba690
      return;
Packit 0ba690
   if (png_ptr->bit_depth < 8)
Packit 0ba690
   {
Packit 0ba690
      png_ptr->transformations |= PNG_PACK;
Packit 0ba690
      png_ptr->usr_bit_depth = 8;
Packit 0ba690
   }
Packit 0ba690
}
Packit 0ba690
#endif
Packit 0ba690
Packit 0ba690
#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
Packit 0ba690
/* Turn on packed pixel swapping */
Packit 0ba690
void PNGAPI
Packit 0ba690
png_set_packswap(png_structp png_ptr)
Packit 0ba690
{
Packit 0ba690
   png_debug(1, "in png_set_packswap");
Packit 0ba690
Packit 0ba690
   if (png_ptr == NULL)
Packit 0ba690
      return;
Packit 0ba690
   if (png_ptr->bit_depth < 8)
Packit 0ba690
      png_ptr->transformations |= PNG_PACKSWAP;
Packit 0ba690
}
Packit 0ba690
#endif
Packit 0ba690
Packit 0ba690
#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED)
Packit 0ba690
void PNGAPI
Packit 0ba690
png_set_shift(png_structp png_ptr, png_color_8p true_bits)
Packit 0ba690
{
Packit 0ba690
   png_debug(1, "in png_set_shift");
Packit 0ba690
Packit 0ba690
   if (png_ptr == NULL)
Packit 0ba690
      return;
Packit 0ba690
   png_ptr->transformations |= PNG_SHIFT;
Packit 0ba690
   png_ptr->shift = *true_bits;
Packit 0ba690
}
Packit 0ba690
#endif
Packit 0ba690
Packit 0ba690
#if defined(PNG_READ_INTERLACING_SUPPORTED) || \
Packit 0ba690
    defined(PNG_WRITE_INTERLACING_SUPPORTED)
Packit 0ba690
int PNGAPI
Packit 0ba690
png_set_interlace_handling(png_structp png_ptr)
Packit 0ba690
{
Packit 0ba690
   png_debug(1, "in png_set_interlace handling");
Packit 0ba690
Packit 0ba690
   if (png_ptr && png_ptr->interlaced)
Packit 0ba690
   {
Packit 0ba690
      png_ptr->transformations |= PNG_INTERLACE;
Packit 0ba690
      return (7);
Packit 0ba690
   }
Packit 0ba690
Packit 0ba690
   return (1);
Packit 0ba690
}
Packit 0ba690
#endif
Packit 0ba690
Packit 0ba690
#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)
Packit 0ba690
/* Add a filler byte on read, or remove a filler or alpha byte on write.
Packit 0ba690
 * The filler type has changed in v0.95 to allow future 2-byte fillers
Packit 0ba690
 * for 48-bit input data, as well as to avoid problems with some compilers
Packit 0ba690
 * that don't like bytes as parameters.
Packit 0ba690
 */
Packit 0ba690
void PNGAPI
Packit 0ba690
png_set_filler(png_structp png_ptr, png_uint_32 filler, int filler_loc)
Packit 0ba690
{
Packit 0ba690
   png_debug(1, "in png_set_filler");
Packit 0ba690
Packit 0ba690
   if (png_ptr == NULL)
Packit 0ba690
      return;
Packit 0ba690
   png_ptr->transformations |= PNG_FILLER;
Packit 0ba690
#ifdef PNG_LEGACY_SUPPORTED
Packit 0ba690
   png_ptr->filler = (png_byte)filler;
Packit 0ba690
#else
Packit 0ba690
   png_ptr->filler = (png_uint_16)filler;
Packit 0ba690
#endif
Packit 0ba690
   if (filler_loc == PNG_FILLER_AFTER)
Packit 0ba690
      png_ptr->flags |= PNG_FLAG_FILLER_AFTER;
Packit 0ba690
   else
Packit 0ba690
      png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER;
Packit 0ba690
Packit 0ba690
   /* This should probably go in the "do_read_filler" routine.
Packit 0ba690
    * I attempted to do that in libpng-1.0.1a but that caused problems
Packit 0ba690
    * so I restored it in libpng-1.0.2a
Packit 0ba690
   */
Packit 0ba690
Packit 0ba690
   if (png_ptr->color_type == PNG_COLOR_TYPE_RGB)
Packit 0ba690
   {
Packit 0ba690
      png_ptr->usr_channels = 4;
Packit 0ba690
   }
Packit 0ba690
Packit 0ba690
   /* Also I added this in libpng-1.0.2a (what happens when we expand
Packit 0ba690
    * a less-than-8-bit grayscale to GA? */
Packit 0ba690
Packit 0ba690
   if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY && png_ptr->bit_depth >= 8)
Packit 0ba690
   {
Packit 0ba690
      png_ptr->usr_channels = 2;
Packit 0ba690
   }
Packit 0ba690
}
Packit 0ba690
Packit 0ba690
#ifndef PNG_1_0_X
Packit 0ba690
/* Added to libpng-1.2.7 */
Packit 0ba690
void PNGAPI
Packit 0ba690
png_set_add_alpha(png_structp png_ptr, png_uint_32 filler, int filler_loc)
Packit 0ba690
{
Packit 0ba690
   png_debug(1, "in png_set_add_alpha");
Packit 0ba690
Packit 0ba690
   if (png_ptr == NULL)
Packit 0ba690
      return;
Packit 0ba690
   png_set_filler(png_ptr, filler, filler_loc);
Packit 0ba690
   png_ptr->transformations |= PNG_ADD_ALPHA;
Packit 0ba690
}
Packit 0ba690
#endif
Packit 0ba690
Packit 0ba690
#endif
Packit 0ba690
Packit 0ba690
#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \
Packit 0ba690
    defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
Packit 0ba690
void PNGAPI
Packit 0ba690
png_set_swap_alpha(png_structp png_ptr)
Packit 0ba690
{
Packit 0ba690
   png_debug(1, "in png_set_swap_alpha");
Packit 0ba690
Packit 0ba690
   if (png_ptr == NULL)
Packit 0ba690
      return;
Packit 0ba690
   png_ptr->transformations |= PNG_SWAP_ALPHA;
Packit 0ba690
}
Packit 0ba690
#endif
Packit 0ba690
Packit 0ba690
#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \
Packit 0ba690
    defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
Packit 0ba690
void PNGAPI
Packit 0ba690
png_set_invert_alpha(png_structp png_ptr)
Packit 0ba690
{
Packit 0ba690
   png_debug(1, "in png_set_invert_alpha");
Packit 0ba690
Packit 0ba690
   if (png_ptr == NULL)
Packit 0ba690
      return;
Packit 0ba690
   png_ptr->transformations |= PNG_INVERT_ALPHA;
Packit 0ba690
}
Packit 0ba690
#endif
Packit 0ba690
Packit 0ba690
#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED)
Packit 0ba690
void PNGAPI
Packit 0ba690
png_set_invert_mono(png_structp png_ptr)
Packit 0ba690
{
Packit 0ba690
   png_debug(1, "in png_set_invert_mono");
Packit 0ba690
Packit 0ba690
   if (png_ptr == NULL)
Packit 0ba690
      return;
Packit 0ba690
   png_ptr->transformations |= PNG_INVERT_MONO;
Packit 0ba690
}
Packit 0ba690
Packit 0ba690
/* Invert monochrome grayscale data */
Packit 0ba690
void /* PRIVATE */
Packit 0ba690
png_do_invert(png_row_infop row_info, png_bytep row)
Packit 0ba690
{
Packit 0ba690
   png_debug(1, "in png_do_invert");
Packit 0ba690
Packit 0ba690
  /* This test removed from libpng version 1.0.13 and 1.2.0:
Packit 0ba690
   *   if (row_info->bit_depth == 1 &&
Packit 0ba690
   */
Packit 0ba690
#ifdef PNG_USELESS_TESTS_SUPPORTED
Packit 0ba690
   if (row == NULL || row_info == NULL)
Packit 0ba690
     return;
Packit 0ba690
#endif
Packit 0ba690
   if (row_info->color_type == PNG_COLOR_TYPE_GRAY)
Packit 0ba690
   {
Packit 0ba690
      png_bytep rp = row;
Packit 0ba690
      png_uint_32 i;
Packit 0ba690
      png_uint_32 istop = row_info->rowbytes;
Packit 0ba690
Packit 0ba690
      for (i = 0; i < istop; i++)
Packit 0ba690
      {
Packit 0ba690
         *rp = (png_byte)(~(*rp));
Packit 0ba690
         rp++;
Packit 0ba690
      }
Packit 0ba690
   }
Packit 0ba690
   else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
Packit 0ba690
      row_info->bit_depth == 8)
Packit 0ba690
   {
Packit 0ba690
      png_bytep rp = row;
Packit 0ba690
      png_uint_32 i;
Packit 0ba690
      png_uint_32 istop = row_info->rowbytes;
Packit 0ba690
Packit 0ba690
      for (i = 0; i < istop; i+=2)
Packit 0ba690
      {
Packit 0ba690
         *rp = (png_byte)(~(*rp));
Packit 0ba690
         rp+=2;
Packit 0ba690
      }
Packit 0ba690
   }
Packit 0ba690
   else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
Packit 0ba690
      row_info->bit_depth == 16)
Packit 0ba690
   {
Packit 0ba690
      png_bytep rp = row;
Packit 0ba690
      png_uint_32 i;
Packit 0ba690
      png_uint_32 istop = row_info->rowbytes;
Packit 0ba690
Packit 0ba690
      for (i = 0; i < istop; i+=4)
Packit 0ba690
      {
Packit 0ba690
         *rp = (png_byte)(~(*rp));
Packit 0ba690
         *(rp+1) = (png_byte)(~(*(rp+1)));
Packit 0ba690
         rp+=4;
Packit 0ba690
      }
Packit 0ba690
   }
Packit 0ba690
}
Packit 0ba690
#endif
Packit 0ba690
Packit 0ba690
#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
Packit 0ba690
/* Swaps byte order on 16 bit depth images */
Packit 0ba690
void /* PRIVATE */
Packit 0ba690
png_do_swap(png_row_infop row_info, png_bytep row)
Packit 0ba690
{
Packit 0ba690
   png_debug(1, "in png_do_swap");
Packit 0ba690
Packit 0ba690
   if (
Packit 0ba690
#ifdef PNG_USELESS_TESTS_SUPPORTED
Packit 0ba690
       row != NULL && row_info != NULL &&
Packit 0ba690
#endif
Packit 0ba690
       row_info->bit_depth == 16)
Packit 0ba690
   {
Packit 0ba690
      png_bytep rp = row;
Packit 0ba690
      png_uint_32 i;
Packit 0ba690
      png_uint_32 istop= row_info->width * row_info->channels;
Packit 0ba690
Packit 0ba690
      for (i = 0; i < istop; i++, rp += 2)
Packit 0ba690
      {
Packit 0ba690
         png_byte t = *rp;
Packit 0ba690
         *rp = *(rp + 1);
Packit 0ba690
         *(rp + 1) = t;
Packit 0ba690
      }
Packit 0ba690
   }
Packit 0ba690
}
Packit 0ba690
#endif
Packit 0ba690
Packit 0ba690
#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
Packit 0ba690
static PNG_CONST png_byte onebppswaptable[256] = {
Packit 0ba690
   0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,
Packit 0ba690
   0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
Packit 0ba690
   0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8,
Packit 0ba690
   0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
Packit 0ba690
   0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4,
Packit 0ba690
   0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
Packit 0ba690
   0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC,
Packit 0ba690
   0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
Packit 0ba690
   0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2,
Packit 0ba690
   0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
Packit 0ba690
   0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA,
Packit 0ba690
   0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
Packit 0ba690
   0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6,
Packit 0ba690
   0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
Packit 0ba690
   0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE,
Packit 0ba690
   0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
Packit 0ba690
   0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1,
Packit 0ba690
   0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
Packit 0ba690
   0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9,
Packit 0ba690
   0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
Packit 0ba690
   0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5,
Packit 0ba690
   0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
Packit 0ba690
   0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED,
Packit 0ba690
   0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
Packit 0ba690
   0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3,
Packit 0ba690
   0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
Packit 0ba690
   0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB,
Packit 0ba690
   0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
Packit 0ba690
   0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7,
Packit 0ba690
   0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
Packit 0ba690
   0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF,
Packit 0ba690
   0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
Packit 0ba690
};
Packit 0ba690
Packit 0ba690
static PNG_CONST png_byte twobppswaptable[256] = {
Packit 0ba690
   0x00, 0x40, 0x80, 0xC0, 0x10, 0x50, 0x90, 0xD0,
Packit 0ba690
   0x20, 0x60, 0xA0, 0xE0, 0x30, 0x70, 0xB0, 0xF0,
Packit 0ba690
   0x04, 0x44, 0x84, 0xC4, 0x14, 0x54, 0x94, 0xD4,
Packit 0ba690
   0x24, 0x64, 0xA4, 0xE4, 0x34, 0x74, 0xB4, 0xF4,
Packit 0ba690
   0x08, 0x48, 0x88, 0xC8, 0x18, 0x58, 0x98, 0xD8,
Packit 0ba690
   0x28, 0x68, 0xA8, 0xE8, 0x38, 0x78, 0xB8, 0xF8,
Packit 0ba690
   0x0C, 0x4C, 0x8C, 0xCC, 0x1C, 0x5C, 0x9C, 0xDC,
Packit 0ba690
   0x2C, 0x6C, 0xAC, 0xEC, 0x3C, 0x7C, 0xBC, 0xFC,
Packit 0ba690
   0x01, 0x41, 0x81, 0xC1, 0x11, 0x51, 0x91, 0xD1,
Packit 0ba690
   0x21, 0x61, 0xA1, 0xE1, 0x31, 0x71, 0xB1, 0xF1,
Packit 0ba690
   0x05, 0x45, 0x85, 0xC5, 0x15, 0x55, 0x95, 0xD5,
Packit 0ba690
   0x25, 0x65, 0xA5, 0xE5, 0x35, 0x75, 0xB5, 0xF5,
Packit 0ba690
   0x09, 0x49, 0x89, 0xC9, 0x19, 0x59, 0x99, 0xD9,
Packit 0ba690
   0x29, 0x69, 0xA9, 0xE9, 0x39, 0x79, 0xB9, 0xF9,
Packit 0ba690
   0x0D, 0x4D, 0x8D, 0xCD, 0x1D, 0x5D, 0x9D, 0xDD,
Packit 0ba690
   0x2D, 0x6D, 0xAD, 0xED, 0x3D, 0x7D, 0xBD, 0xFD,
Packit 0ba690
   0x02, 0x42, 0x82, 0xC2, 0x12, 0x52, 0x92, 0xD2,
Packit 0ba690
   0x22, 0x62, 0xA2, 0xE2, 0x32, 0x72, 0xB2, 0xF2,
Packit 0ba690
   0x06, 0x46, 0x86, 0xC6, 0x16, 0x56, 0x96, 0xD6,
Packit 0ba690
   0x26, 0x66, 0xA6, 0xE6, 0x36, 0x76, 0xB6, 0xF6,
Packit 0ba690
   0x0A, 0x4A, 0x8A, 0xCA, 0x1A, 0x5A, 0x9A, 0xDA,
Packit 0ba690
   0x2A, 0x6A, 0xAA, 0xEA, 0x3A, 0x7A, 0xBA, 0xFA,
Packit 0ba690
   0x0E, 0x4E, 0x8E, 0xCE, 0x1E, 0x5E, 0x9E, 0xDE,
Packit 0ba690
   0x2E, 0x6E, 0xAE, 0xEE, 0x3E, 0x7E, 0xBE, 0xFE,
Packit 0ba690
   0x03, 0x43, 0x83, 0xC3, 0x13, 0x53, 0x93, 0xD3,
Packit 0ba690
   0x23, 0x63, 0xA3, 0xE3, 0x33, 0x73, 0xB3, 0xF3,
Packit 0ba690
   0x07, 0x47, 0x87, 0xC7, 0x17, 0x57, 0x97, 0xD7,
Packit 0ba690
   0x27, 0x67, 0xA7, 0xE7, 0x37, 0x77, 0xB7, 0xF7,
Packit 0ba690
   0x0B, 0x4B, 0x8B, 0xCB, 0x1B, 0x5B, 0x9B, 0xDB,
Packit 0ba690
   0x2B, 0x6B, 0xAB, 0xEB, 0x3B, 0x7B, 0xBB, 0xFB,
Packit 0ba690
   0x0F, 0x4F, 0x8F, 0xCF, 0x1F, 0x5F, 0x9F, 0xDF,
Packit 0ba690
   0x2F, 0x6F, 0xAF, 0xEF, 0x3F, 0x7F, 0xBF, 0xFF
Packit 0ba690
};
Packit 0ba690
Packit 0ba690
static PNG_CONST png_byte fourbppswaptable[256] = {
Packit 0ba690
   0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70,
Packit 0ba690
   0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0,
Packit 0ba690
   0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71,
Packit 0ba690
   0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1,
Packit 0ba690
   0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72,
Packit 0ba690
   0x82, 0x92, 0xA2, 0xB2, 0xC2, 0xD2, 0xE2, 0xF2,
Packit 0ba690
   0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73,
Packit 0ba690
   0x83, 0x93, 0xA3, 0xB3, 0xC3, 0xD3, 0xE3, 0xF3,
Packit 0ba690
   0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74,
Packit 0ba690
   0x84, 0x94, 0xA4, 0xB4, 0xC4, 0xD4, 0xE4, 0xF4,
Packit 0ba690
   0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75,
Packit 0ba690
   0x85, 0x95, 0xA5, 0xB5, 0xC5, 0xD5, 0xE5, 0xF5,
Packit 0ba690
   0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76,
Packit 0ba690
   0x86, 0x96, 0xA6, 0xB6, 0xC6, 0xD6, 0xE6, 0xF6,
Packit 0ba690
   0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77,
Packit 0ba690
   0x87, 0x97, 0xA7, 0xB7, 0xC7, 0xD7, 0xE7, 0xF7,
Packit 0ba690
   0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78,
Packit 0ba690
   0x88, 0x98, 0xA8, 0xB8, 0xC8, 0xD8, 0xE8, 0xF8,
Packit 0ba690
   0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79,
Packit 0ba690
   0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, 0xE9, 0xF9,
Packit 0ba690
   0x0A, 0x1A, 0x2A, 0x3A, 0x4A, 0x5A, 0x6A, 0x7A,
Packit 0ba690
   0x8A, 0x9A, 0xAA, 0xBA, 0xCA, 0xDA, 0xEA, 0xFA,
Packit 0ba690
   0x0B, 0x1B, 0x2B, 0x3B, 0x4B, 0x5B, 0x6B, 0x7B,
Packit 0ba690
   0x8B, 0x9B, 0xAB, 0xBB, 0xCB, 0xDB, 0xEB, 0xFB,
Packit 0ba690
   0x0C, 0x1C, 0x2C, 0x3C, 0x4C, 0x5C, 0x6C, 0x7C,
Packit 0ba690
   0x8C, 0x9C, 0xAC, 0xBC, 0xCC, 0xDC, 0xEC, 0xFC,
Packit 0ba690
   0x0D, 0x1D, 0x2D, 0x3D, 0x4D, 0x5D, 0x6D, 0x7D,
Packit 0ba690
   0x8D, 0x9D, 0xAD, 0xBD, 0xCD, 0xDD, 0xED, 0xFD,
Packit 0ba690
   0x0E, 0x1E, 0x2E, 0x3E, 0x4E, 0x5E, 0x6E, 0x7E,
Packit 0ba690
   0x8E, 0x9E, 0xAE, 0xBE, 0xCE, 0xDE, 0xEE, 0xFE,
Packit 0ba690
   0x0F, 0x1F, 0x2F, 0x3F, 0x4F, 0x5F, 0x6F, 0x7F,
Packit 0ba690
   0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF
Packit 0ba690
};
Packit 0ba690
Packit 0ba690
/* Swaps pixel packing order within bytes */
Packit 0ba690
void /* PRIVATE */
Packit 0ba690
png_do_packswap(png_row_infop row_info, png_bytep row)
Packit 0ba690
{
Packit 0ba690
   png_debug(1, "in png_do_packswap");
Packit 0ba690
Packit 0ba690
   if (
Packit 0ba690
#ifdef PNG_USELESS_TESTS_SUPPORTED
Packit 0ba690
       row != NULL && row_info != NULL &&
Packit 0ba690
#endif
Packit 0ba690
       row_info->bit_depth < 8)
Packit 0ba690
   {
Packit 0ba690
      png_bytep rp, end, table;
Packit 0ba690
Packit 0ba690
      end = row + row_info->rowbytes;
Packit 0ba690
Packit 0ba690
      if (row_info->bit_depth == 1)
Packit 0ba690
         table = (png_bytep)onebppswaptable;
Packit 0ba690
      else if (row_info->bit_depth == 2)
Packit 0ba690
         table = (png_bytep)twobppswaptable;
Packit 0ba690
      else if (row_info->bit_depth == 4)
Packit 0ba690
         table = (png_bytep)fourbppswaptable;
Packit 0ba690
      else
Packit 0ba690
         return;
Packit 0ba690
Packit 0ba690
      for (rp = row; rp < end; rp++)
Packit 0ba690
         *rp = table[*rp];
Packit 0ba690
   }
Packit 0ba690
}
Packit 0ba690
#endif /* PNG_READ_PACKSWAP_SUPPORTED or PNG_WRITE_PACKSWAP_SUPPORTED */
Packit 0ba690
Packit 0ba690
#if defined(PNG_WRITE_FILLER_SUPPORTED) || \
Packit 0ba690
    defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
Packit 0ba690
/* Remove filler or alpha byte(s) */
Packit 0ba690
void /* PRIVATE */
Packit 0ba690
png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags)
Packit 0ba690
{
Packit 0ba690
   png_debug(1, "in png_do_strip_filler");
Packit 0ba690
Packit 0ba690
#ifdef PNG_USELESS_TESTS_SUPPORTED
Packit 0ba690
   if (row != NULL && row_info != NULL)
Packit 0ba690
#endif
Packit 0ba690
   {
Packit 0ba690
      png_bytep sp=row;
Packit 0ba690
      png_bytep dp=row;
Packit 0ba690
      png_uint_32 row_width=row_info->width;
Packit 0ba690
      png_uint_32 i;
Packit 0ba690
Packit 0ba690
      if ((row_info->color_type == PNG_COLOR_TYPE_RGB ||
Packit 0ba690
          (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA &&
Packit 0ba690
          (flags & PNG_FLAG_STRIP_ALPHA))) &&
Packit 0ba690
          row_info->channels == 4)
Packit 0ba690
      {
Packit 0ba690
         if (row_info->bit_depth == 8)
Packit 0ba690
         {
Packit 0ba690
            /* This converts from RGBX or RGBA to RGB */
Packit 0ba690
            if (flags & PNG_FLAG_FILLER_AFTER)
Packit 0ba690
            {
Packit 0ba690
               dp+=3; sp+=4;
Packit 0ba690
               for (i = 1; i < row_width; i++)
Packit 0ba690
               {
Packit 0ba690
                  *dp++ = *sp++;
Packit 0ba690
                  *dp++ = *sp++;
Packit 0ba690
                  *dp++ = *sp++;
Packit 0ba690
                  sp++;
Packit 0ba690
               }
Packit 0ba690
            }
Packit 0ba690
            /* This converts from XRGB or ARGB to RGB */
Packit 0ba690
            else
Packit 0ba690
            {
Packit 0ba690
               for (i = 0; i < row_width; i++)
Packit 0ba690
               {
Packit 0ba690
                  sp++;
Packit 0ba690
                  *dp++ = *sp++;
Packit 0ba690
                  *dp++ = *sp++;
Packit 0ba690
                  *dp++ = *sp++;
Packit 0ba690
               }
Packit 0ba690
            }
Packit 0ba690
            row_info->pixel_depth = 24;
Packit 0ba690
            row_info->rowbytes = row_width * 3;
Packit 0ba690
         }
Packit 0ba690
         else /* if (row_info->bit_depth == 16) */
Packit 0ba690
         {
Packit 0ba690
            if (flags & PNG_FLAG_FILLER_AFTER)
Packit 0ba690
            {
Packit 0ba690
               /* This converts from RRGGBBXX or RRGGBBAA to RRGGBB */
Packit 0ba690
               sp += 8; dp += 6;
Packit 0ba690
               for (i = 1; i < row_width; i++)
Packit 0ba690
               {
Packit 0ba690
                  /* This could be (although png_memcpy is probably slower):
Packit 0ba690
                  png_memcpy(dp, sp, 6);
Packit 0ba690
                  sp += 8;
Packit 0ba690
                  dp += 6;
Packit 0ba690
                  */
Packit 0ba690
Packit 0ba690
                  *dp++ = *sp++;
Packit 0ba690
                  *dp++ = *sp++;
Packit 0ba690
                  *dp++ = *sp++;
Packit 0ba690
                  *dp++ = *sp++;
Packit 0ba690
                  *dp++ = *sp++;
Packit 0ba690
                  *dp++ = *sp++;
Packit 0ba690
                  sp += 2;
Packit 0ba690
               }
Packit 0ba690
            }
Packit 0ba690
            else
Packit 0ba690
            {
Packit 0ba690
               /* This converts from XXRRGGBB or AARRGGBB to RRGGBB */
Packit 0ba690
               for (i = 0; i < row_width; i++)
Packit 0ba690
               {
Packit 0ba690
                  /* This could be (although png_memcpy is probably slower):
Packit 0ba690
                  png_memcpy(dp, sp, 6);
Packit 0ba690
                  sp += 8;
Packit 0ba690
                  dp += 6;
Packit 0ba690
                  */
Packit 0ba690
Packit 0ba690
                  sp+=2;
Packit 0ba690
                  *dp++ = *sp++;
Packit 0ba690
                  *dp++ = *sp++;
Packit 0ba690
                  *dp++ = *sp++;
Packit 0ba690
                  *dp++ = *sp++;
Packit 0ba690
                  *dp++ = *sp++;
Packit 0ba690
                  *dp++ = *sp++;
Packit 0ba690
               }
Packit 0ba690
            }
Packit 0ba690
            row_info->pixel_depth = 48;
Packit 0ba690
            row_info->rowbytes = row_width * 6;
Packit 0ba690
         }
Packit 0ba690
         row_info->channels = 3;
Packit 0ba690
      }
Packit 0ba690
      else if ((row_info->color_type == PNG_COLOR_TYPE_GRAY ||
Packit 0ba690
         (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
Packit 0ba690
         (flags & PNG_FLAG_STRIP_ALPHA))) &&
Packit 0ba690
          row_info->channels == 2)
Packit 0ba690
      {
Packit 0ba690
         if (row_info->bit_depth == 8)
Packit 0ba690
         {
Packit 0ba690
            /* This converts from GX or GA to G */
Packit 0ba690
            if (flags & PNG_FLAG_FILLER_AFTER)
Packit 0ba690
            {
Packit 0ba690
               for (i = 0; i < row_width; i++)
Packit 0ba690
               {
Packit 0ba690
                  *dp++ = *sp++;
Packit 0ba690
                  sp++;
Packit 0ba690
               }
Packit 0ba690
            }
Packit 0ba690
            /* This converts from XG or AG to G */
Packit 0ba690
            else
Packit 0ba690
            {
Packit 0ba690
               for (i = 0; i < row_width; i++)
Packit 0ba690
               {
Packit 0ba690
                  sp++;
Packit 0ba690
                  *dp++ = *sp++;
Packit 0ba690
               }
Packit 0ba690
            }
Packit 0ba690
            row_info->pixel_depth = 8;
Packit 0ba690
            row_info->rowbytes = row_width;
Packit 0ba690
         }
Packit 0ba690
         else /* if (row_info->bit_depth == 16) */
Packit 0ba690
         {
Packit 0ba690
            if (flags & PNG_FLAG_FILLER_AFTER)
Packit 0ba690
            {
Packit 0ba690
               /* This converts from GGXX or GGAA to GG */
Packit 0ba690
               sp += 4; dp += 2;
Packit 0ba690
               for (i = 1; i < row_width; i++)
Packit 0ba690
               {
Packit 0ba690
                  *dp++ = *sp++;
Packit 0ba690
                  *dp++ = *sp++;
Packit 0ba690
                  sp += 2;
Packit 0ba690
               }
Packit 0ba690
            }
Packit 0ba690
            else
Packit 0ba690
            {
Packit 0ba690
               /* This converts from XXGG or AAGG to GG */
Packit 0ba690
               for (i = 0; i < row_width; i++)
Packit 0ba690
               {
Packit 0ba690
                  sp += 2;
Packit 0ba690
                  *dp++ = *sp++;
Packit 0ba690
                  *dp++ = *sp++;
Packit 0ba690
               }
Packit 0ba690
            }
Packit 0ba690
            row_info->pixel_depth = 16;
Packit 0ba690
            row_info->rowbytes = row_width * 2;
Packit 0ba690
         }
Packit 0ba690
         row_info->channels = 1;
Packit 0ba690
      }
Packit 0ba690
      if (flags & PNG_FLAG_STRIP_ALPHA)
Packit 0ba690
        row_info->color_type &= ~PNG_COLOR_MASK_ALPHA;
Packit 0ba690
   }
Packit 0ba690
}
Packit 0ba690
#endif
Packit 0ba690
Packit 0ba690
#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
Packit 0ba690
/* Swaps red and blue bytes within a pixel */
Packit 0ba690
void /* PRIVATE */
Packit 0ba690
png_do_bgr(png_row_infop row_info, png_bytep row)
Packit 0ba690
{
Packit 0ba690
   png_debug(1, "in png_do_bgr");
Packit 0ba690
Packit 0ba690
   if (
Packit 0ba690
#ifdef PNG_USELESS_TESTS_SUPPORTED
Packit 0ba690
       row != NULL && row_info != NULL &&
Packit 0ba690
#endif
Packit 0ba690
       (row_info->color_type & PNG_COLOR_MASK_COLOR))
Packit 0ba690
   {
Packit 0ba690
      png_uint_32 row_width = row_info->width;
Packit 0ba690
      if (row_info->bit_depth == 8)
Packit 0ba690
      {
Packit 0ba690
         if (row_info->color_type == PNG_COLOR_TYPE_RGB)
Packit 0ba690
         {
Packit 0ba690
            png_bytep rp;
Packit 0ba690
            png_uint_32 i;
Packit 0ba690
Packit 0ba690
            for (i = 0, rp = row; i < row_width; i++, rp += 3)
Packit 0ba690
            {
Packit 0ba690
               png_byte save = *rp;
Packit 0ba690
               *rp = *(rp + 2);
Packit 0ba690
               *(rp + 2) = save;
Packit 0ba690
            }
Packit 0ba690
         }
Packit 0ba690
         else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
Packit 0ba690
         {
Packit 0ba690
            png_bytep rp;
Packit 0ba690
            png_uint_32 i;
Packit 0ba690
Packit 0ba690
            for (i = 0, rp = row; i < row_width; i++, rp += 4)
Packit 0ba690
            {
Packit 0ba690
               png_byte save = *rp;
Packit 0ba690
               *rp = *(rp + 2);
Packit 0ba690
               *(rp + 2) = save;
Packit 0ba690
            }
Packit 0ba690
         }
Packit 0ba690
      }
Packit 0ba690
      else if (row_info->bit_depth == 16)
Packit 0ba690
      {
Packit 0ba690
         if (row_info->color_type == PNG_COLOR_TYPE_RGB)
Packit 0ba690
         {
Packit 0ba690
            png_bytep rp;
Packit 0ba690
            png_uint_32 i;
Packit 0ba690
Packit 0ba690
            for (i = 0, rp = row; i < row_width; i++, rp += 6)
Packit 0ba690
            {
Packit 0ba690
               png_byte save = *rp;
Packit 0ba690
               *rp = *(rp + 4);
Packit 0ba690
               *(rp + 4) = save;
Packit 0ba690
               save = *(rp + 1);
Packit 0ba690
               *(rp + 1) = *(rp + 5);
Packit 0ba690
               *(rp + 5) = save;
Packit 0ba690
            }
Packit 0ba690
         }
Packit 0ba690
         else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
Packit 0ba690
         {
Packit 0ba690
            png_bytep rp;
Packit 0ba690
            png_uint_32 i;
Packit 0ba690
Packit 0ba690
            for (i = 0, rp = row; i < row_width; i++, rp += 8)
Packit 0ba690
            {
Packit 0ba690
               png_byte save = *rp;
Packit 0ba690
               *rp = *(rp + 4);
Packit 0ba690
               *(rp + 4) = save;
Packit 0ba690
               save = *(rp + 1);
Packit 0ba690
               *(rp + 1) = *(rp + 5);
Packit 0ba690
               *(rp + 5) = save;
Packit 0ba690
            }
Packit 0ba690
         }
Packit 0ba690
      }
Packit 0ba690
   }
Packit 0ba690
}
Packit 0ba690
#endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */
Packit 0ba690
Packit 0ba690
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
Packit 0ba690
    defined(PNG_LEGACY_SUPPORTED) || \
Packit 0ba690
    defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
Packit 0ba690
void PNGAPI
Packit 0ba690
png_set_user_transform_info(png_structp png_ptr, png_voidp
Packit 0ba690
   user_transform_ptr, int user_transform_depth, int user_transform_channels)
Packit 0ba690
{
Packit 0ba690
   png_debug(1, "in png_set_user_transform_info");
Packit 0ba690
Packit 0ba690
   if (png_ptr == NULL)
Packit 0ba690
      return;
Packit 0ba690
#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED
Packit 0ba690
   png_ptr->user_transform_ptr = user_transform_ptr;
Packit 0ba690
   png_ptr->user_transform_depth = (png_byte)user_transform_depth;
Packit 0ba690
   png_ptr->user_transform_channels = (png_byte)user_transform_channels;
Packit 0ba690
#else
Packit 0ba690
   if (user_transform_ptr || user_transform_depth || user_transform_channels)
Packit 0ba690
      png_warning(png_ptr,
Packit 0ba690
        "This version of libpng does not support user transform info");
Packit 0ba690
#endif
Packit 0ba690
}
Packit 0ba690
#endif
Packit 0ba690
Packit 0ba690
/* This function returns a pointer to the user_transform_ptr associated with
Packit 0ba690
 * the user transform functions.  The application should free any memory
Packit 0ba690
 * associated with this pointer before png_write_destroy and png_read_destroy
Packit 0ba690
 * are called.
Packit 0ba690
 */
Packit 0ba690
png_voidp PNGAPI
Packit 0ba690
png_get_user_transform_ptr(png_structp png_ptr)
Packit 0ba690
{
Packit 0ba690
   if (png_ptr == NULL)
Packit 0ba690
      return (NULL);
Packit 0ba690
#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED
Packit 0ba690
   return ((png_voidp)png_ptr->user_transform_ptr);
Packit 0ba690
#else
Packit 0ba690
   return (NULL);
Packit 0ba690
#endif
Packit 0ba690
}
Packit 0ba690
#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */