Blame gtkmm-osx/libpng-1.2.5/pngtrans.c

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