15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* pngtrans.c - transforms the data in a row (used by both readers and writers)
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Last changed in libpng 1.2.41 [December 3, 2009]
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (c) 1998-2009 Glenn Randers-Pehrson
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This code is released under the libpng license.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * For conditions of distribution and use, see the disclaimer
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and license in png.h
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PNG_INTERNAL
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PNG_NO_PEDANTIC_WARNINGS
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "png.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Turn on BGR-to-RGB mapping */
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_set_bgr(png_structp png_ptr)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_debug(1, "in png_set_bgr");
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->transformations |= PNG_BGR;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Turn on 16 bit byte swapping */
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_set_swap(png_structp png_ptr)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_debug(1, "in png_set_swap");
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->bit_depth == 16)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->transformations |= PNG_SWAP_BYTES;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Turn on pixel packing */
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_set_packing(png_structp png_ptr)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_debug(1, "in png_set_packing");
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->bit_depth < 8)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->transformations |= PNG_PACK;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->usr_bit_depth = 8;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Turn on packed pixel swapping */
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_set_packswap(png_structp png_ptr)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_debug(1, "in png_set_packswap");
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->bit_depth < 8)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->transformations |= PNG_PACKSWAP;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_set_shift(png_structp png_ptr, png_color_8p true_bits)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_debug(1, "in png_set_shift");
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->transformations |= PNG_SHIFT;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->shift = *true_bits;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_READ_INTERLACING_SUPPORTED) || \
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    defined(PNG_WRITE_INTERLACING_SUPPORTED)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int PNGAPI
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_set_interlace_handling(png_structp png_ptr)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_debug(1, "in png_set_interlace handling");
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr && png_ptr->interlaced)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->transformations |= PNG_INTERLACE;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return (7);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return (1);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Add a filler byte on read, or remove a filler or alpha byte on write.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The filler type has changed in v0.95 to allow future 2-byte fillers
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * for 48-bit input data, as well as to avoid problems with some compilers
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * that don't like bytes as parameters.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_set_filler(png_structp png_ptr, png_uint_32 filler, int filler_loc)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_debug(1, "in png_set_filler");
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->transformations |= PNG_FILLER;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_LEGACY_SUPPORTED
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->filler = (png_byte)filler;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->filler = (png_uint_16)filler;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (filler_loc == PNG_FILLER_AFTER)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->flags |= PNG_FLAG_FILLER_AFTER;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* This should probably go in the "do_read_filler" routine.
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * I attempted to do that in libpng-1.0.1a but that caused problems
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * so I restored it in libpng-1.0.2a
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->color_type == PNG_COLOR_TYPE_RGB)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->usr_channels = 4;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Also I added this in libpng-1.0.2a (what happens when we expand
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * a less-than-8-bit grayscale to GA? */
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY && png_ptr->bit_depth >= 8)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_ptr->usr_channels = 2;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PNG_1_0_X
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Added to libpng-1.2.7 */
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_set_add_alpha(png_structp png_ptr, png_uint_32 filler, int filler_loc)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_debug(1, "in png_set_add_alpha");
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_set_filler(png_ptr, filler, filler_loc);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->transformations |= PNG_ADD_ALPHA;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_set_swap_alpha(png_structp png_ptr)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_debug(1, "in png_set_swap_alpha");
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->transformations |= PNG_SWAP_ALPHA;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_set_invert_alpha(png_structp png_ptr)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_debug(1, "in png_set_invert_alpha");
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->transformations |= PNG_INVERT_ALPHA;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_set_invert_mono(png_structp png_ptr)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_debug(1, "in png_set_invert_mono");
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->transformations |= PNG_INVERT_MONO;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Invert monochrome grayscale data */
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_do_invert(png_row_infop row_info, png_bytep row)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_debug(1, "in png_do_invert");
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* This test removed from libpng version 1.0.13 and 1.2.0:
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *   if (row_info->bit_depth == 1 &&
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USELESS_TESTS_SUPPORTED
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (row == NULL || row_info == NULL)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     return;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (row_info->color_type == PNG_COLOR_TYPE_GRAY)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_bytep rp = row;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_uint_32 i;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_uint_32 istop = row_info->rowbytes;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (i = 0; i < istop; i++)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         *rp = (png_byte)(~(*rp));
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         rp++;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      row_info->bit_depth == 8)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_bytep rp = row;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_uint_32 i;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_uint_32 istop = row_info->rowbytes;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (i = 0; i < istop; i+=2)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         *rp = (png_byte)(~(*rp));
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         rp+=2;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      row_info->bit_depth == 16)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_bytep rp = row;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_uint_32 i;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_uint_32 istop = row_info->rowbytes;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (i = 0; i < istop; i+=4)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         *rp = (png_byte)(~(*rp));
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         *(rp+1) = (png_byte)(~(*(rp+1)));
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         rp+=4;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Swaps byte order on 16 bit depth images */
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_do_swap(png_row_infop row_info, png_bytep row)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_debug(1, "in png_do_swap");
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USELESS_TESTS_SUPPORTED
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       row != NULL && row_info != NULL &&
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       row_info->bit_depth == 16)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_bytep rp = row;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_uint_32 i;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_uint_32 istop= row_info->width * row_info->channels;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (i = 0; i < istop; i++, rp += 2)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         png_byte t = *rp;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         *rp = *(rp + 1);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         *(rp + 1) = t;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static PNG_CONST png_byte onebppswaptable[256] = {
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8,
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4,
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC,
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2,
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA,
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6,
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE,
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1,
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9,
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5,
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED,
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3,
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB,
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7,
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF,
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static PNG_CONST png_byte twobppswaptable[256] = {
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x00, 0x40, 0x80, 0xC0, 0x10, 0x50, 0x90, 0xD0,
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x20, 0x60, 0xA0, 0xE0, 0x30, 0x70, 0xB0, 0xF0,
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x04, 0x44, 0x84, 0xC4, 0x14, 0x54, 0x94, 0xD4,
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x24, 0x64, 0xA4, 0xE4, 0x34, 0x74, 0xB4, 0xF4,
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x08, 0x48, 0x88, 0xC8, 0x18, 0x58, 0x98, 0xD8,
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x28, 0x68, 0xA8, 0xE8, 0x38, 0x78, 0xB8, 0xF8,
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x0C, 0x4C, 0x8C, 0xCC, 0x1C, 0x5C, 0x9C, 0xDC,
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x2C, 0x6C, 0xAC, 0xEC, 0x3C, 0x7C, 0xBC, 0xFC,
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x01, 0x41, 0x81, 0xC1, 0x11, 0x51, 0x91, 0xD1,
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x21, 0x61, 0xA1, 0xE1, 0x31, 0x71, 0xB1, 0xF1,
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x05, 0x45, 0x85, 0xC5, 0x15, 0x55, 0x95, 0xD5,
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x25, 0x65, 0xA5, 0xE5, 0x35, 0x75, 0xB5, 0xF5,
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x09, 0x49, 0x89, 0xC9, 0x19, 0x59, 0x99, 0xD9,
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x29, 0x69, 0xA9, 0xE9, 0x39, 0x79, 0xB9, 0xF9,
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x0D, 0x4D, 0x8D, 0xCD, 0x1D, 0x5D, 0x9D, 0xDD,
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x2D, 0x6D, 0xAD, 0xED, 0x3D, 0x7D, 0xBD, 0xFD,
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x02, 0x42, 0x82, 0xC2, 0x12, 0x52, 0x92, 0xD2,
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x22, 0x62, 0xA2, 0xE2, 0x32, 0x72, 0xB2, 0xF2,
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x06, 0x46, 0x86, 0xC6, 0x16, 0x56, 0x96, 0xD6,
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x26, 0x66, 0xA6, 0xE6, 0x36, 0x76, 0xB6, 0xF6,
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x0A, 0x4A, 0x8A, 0xCA, 0x1A, 0x5A, 0x9A, 0xDA,
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x2A, 0x6A, 0xAA, 0xEA, 0x3A, 0x7A, 0xBA, 0xFA,
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x0E, 0x4E, 0x8E, 0xCE, 0x1E, 0x5E, 0x9E, 0xDE,
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x2E, 0x6E, 0xAE, 0xEE, 0x3E, 0x7E, 0xBE, 0xFE,
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x03, 0x43, 0x83, 0xC3, 0x13, 0x53, 0x93, 0xD3,
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x23, 0x63, 0xA3, 0xE3, 0x33, 0x73, 0xB3, 0xF3,
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x07, 0x47, 0x87, 0xC7, 0x17, 0x57, 0x97, 0xD7,
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x27, 0x67, 0xA7, 0xE7, 0x37, 0x77, 0xB7, 0xF7,
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x0B, 0x4B, 0x8B, 0xCB, 0x1B, 0x5B, 0x9B, 0xDB,
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x2B, 0x6B, 0xAB, 0xEB, 0x3B, 0x7B, 0xBB, 0xFB,
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x0F, 0x4F, 0x8F, 0xCF, 0x1F, 0x5F, 0x9F, 0xDF,
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x2F, 0x6F, 0xAF, 0xEF, 0x3F, 0x7F, 0xBF, 0xFF
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static PNG_CONST png_byte fourbppswaptable[256] = {
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70,
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0,
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71,
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1,
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72,
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x82, 0x92, 0xA2, 0xB2, 0xC2, 0xD2, 0xE2, 0xF2,
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73,
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x83, 0x93, 0xA3, 0xB3, 0xC3, 0xD3, 0xE3, 0xF3,
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74,
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x84, 0x94, 0xA4, 0xB4, 0xC4, 0xD4, 0xE4, 0xF4,
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75,
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x85, 0x95, 0xA5, 0xB5, 0xC5, 0xD5, 0xE5, 0xF5,
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76,
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x86, 0x96, 0xA6, 0xB6, 0xC6, 0xD6, 0xE6, 0xF6,
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77,
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x87, 0x97, 0xA7, 0xB7, 0xC7, 0xD7, 0xE7, 0xF7,
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78,
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x88, 0x98, 0xA8, 0xB8, 0xC8, 0xD8, 0xE8, 0xF8,
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79,
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, 0xE9, 0xF9,
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x0A, 0x1A, 0x2A, 0x3A, 0x4A, 0x5A, 0x6A, 0x7A,
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x8A, 0x9A, 0xAA, 0xBA, 0xCA, 0xDA, 0xEA, 0xFA,
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x0B, 0x1B, 0x2B, 0x3B, 0x4B, 0x5B, 0x6B, 0x7B,
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x8B, 0x9B, 0xAB, 0xBB, 0xCB, 0xDB, 0xEB, 0xFB,
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x0C, 0x1C, 0x2C, 0x3C, 0x4C, 0x5C, 0x6C, 0x7C,
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x8C, 0x9C, 0xAC, 0xBC, 0xCC, 0xDC, 0xEC, 0xFC,
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x0D, 0x1D, 0x2D, 0x3D, 0x4D, 0x5D, 0x6D, 0x7D,
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x8D, 0x9D, 0xAD, 0xBD, 0xCD, 0xDD, 0xED, 0xFD,
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x0E, 0x1E, 0x2E, 0x3E, 0x4E, 0x5E, 0x6E, 0x7E,
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x8E, 0x9E, 0xAE, 0xBE, 0xCE, 0xDE, 0xEE, 0xFE,
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x0F, 0x1F, 0x2F, 0x3F, 0x4F, 0x5F, 0x6F, 0x7F,
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Swaps pixel packing order within bytes */
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_do_packswap(png_row_infop row_info, png_bytep row)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_debug(1, "in png_do_packswap");
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USELESS_TESTS_SUPPORTED
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       row != NULL && row_info != NULL &&
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       row_info->bit_depth < 8)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_bytep rp, end, table;
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      end = row + row_info->rowbytes;
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (row_info->bit_depth == 1)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         table = (png_bytep)onebppswaptable;
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (row_info->bit_depth == 2)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         table = (png_bytep)twobppswaptable;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (row_info->bit_depth == 4)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         table = (png_bytep)fourbppswaptable;
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         return;
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (rp = row; rp < end; rp++)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         *rp = table[*rp];
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_READ_PACKSWAP_SUPPORTED or PNG_WRITE_PACKSWAP_SUPPORTED */
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_WRITE_FILLER_SUPPORTED) || \
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Remove filler or alpha byte(s) */
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_debug(1, "in png_do_strip_filler");
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USELESS_TESTS_SUPPORTED
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (row != NULL && row_info != NULL)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_bytep sp=row;
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_bytep dp=row;
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_uint_32 row_width=row_info->width;
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_uint_32 i;
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ((row_info->color_type == PNG_COLOR_TYPE_RGB ||
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA &&
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          (flags & PNG_FLAG_STRIP_ALPHA))) &&
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          row_info->channels == 4)
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (row_info->bit_depth == 8)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         {
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            /* This converts from RGBX or RGBA to RGB */
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (flags & PNG_FLAG_FILLER_AFTER)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               dp+=3; sp+=4;
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               for (i = 1; i < row_width; i++)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               {
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  *dp++ = *sp++;
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  *dp++ = *sp++;
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  *dp++ = *sp++;
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  sp++;
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               }
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            /* This converts from XRGB or ARGB to RGB */
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            else
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               for (i = 0; i < row_width; i++)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               {
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  sp++;
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  *dp++ = *sp++;
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  *dp++ = *sp++;
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  *dp++ = *sp++;
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               }
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            row_info->pixel_depth = 24;
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            row_info->rowbytes = row_width * 3;
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         else /* if (row_info->bit_depth == 16) */
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         {
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (flags & PNG_FLAG_FILLER_AFTER)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               /* This converts from RRGGBBXX or RRGGBBAA to RRGGBB */
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               sp += 8; dp += 6;
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               for (i = 1; i < row_width; i++)
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               {
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  /* This could be (although png_memcpy is probably slower):
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  png_memcpy(dp, sp, 6);
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  sp += 8;
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  dp += 6;
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  */
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  *dp++ = *sp++;
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  *dp++ = *sp++;
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  *dp++ = *sp++;
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  *dp++ = *sp++;
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  *dp++ = *sp++;
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  *dp++ = *sp++;
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  sp += 2;
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               }
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            else
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               /* This converts from XXRRGGBB or AARRGGBB to RRGGBB */
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               for (i = 0; i < row_width; i++)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               {
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  /* This could be (although png_memcpy is probably slower):
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  png_memcpy(dp, sp, 6);
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  sp += 8;
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  dp += 6;
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  */
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  sp+=2;
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  *dp++ = *sp++;
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  *dp++ = *sp++;
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  *dp++ = *sp++;
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  *dp++ = *sp++;
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  *dp++ = *sp++;
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  *dp++ = *sp++;
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               }
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            row_info->pixel_depth = 48;
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            row_info->rowbytes = row_width * 6;
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         row_info->channels = 3;
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if ((row_info->color_type == PNG_COLOR_TYPE_GRAY ||
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         (flags & PNG_FLAG_STRIP_ALPHA))) &&
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          row_info->channels == 2)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (row_info->bit_depth == 8)
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         {
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            /* This converts from GX or GA to G */
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (flags & PNG_FLAG_FILLER_AFTER)
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               for (i = 0; i < row_width; i++)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               {
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  *dp++ = *sp++;
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  sp++;
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               }
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            /* This converts from XG or AG to G */
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            else
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               for (i = 0; i < row_width; i++)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               {
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  sp++;
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  *dp++ = *sp++;
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               }
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            row_info->pixel_depth = 8;
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            row_info->rowbytes = row_width;
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         else /* if (row_info->bit_depth == 16) */
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         {
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (flags & PNG_FLAG_FILLER_AFTER)
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               /* This converts from GGXX or GGAA to GG */
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               sp += 4; dp += 2;
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               for (i = 1; i < row_width; i++)
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               {
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  *dp++ = *sp++;
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  *dp++ = *sp++;
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  sp += 2;
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               }
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            else
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               /* This converts from XXGG or AAGG to GG */
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               for (i = 0; i < row_width; i++)
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               {
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  sp += 2;
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  *dp++ = *sp++;
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  *dp++ = *sp++;
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               }
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            row_info->pixel_depth = 16;
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            row_info->rowbytes = row_width * 2;
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         row_info->channels = 1;
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (flags & PNG_FLAG_STRIP_ALPHA)
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        row_info->color_type &= ~PNG_COLOR_MASK_ALPHA;
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Swaps red and blue bytes within a pixel */
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_do_bgr(png_row_infop row_info, png_bytep row)
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_debug(1, "in png_do_bgr");
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USELESS_TESTS_SUPPORTED
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       row != NULL && row_info != NULL &&
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       (row_info->color_type & PNG_COLOR_MASK_COLOR))
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   {
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_uint_32 row_width = row_info->width;
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (row_info->bit_depth == 8)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (row_info->color_type == PNG_COLOR_TYPE_RGB)
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         {
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_bytep rp;
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_uint_32 i;
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            for (i = 0, rp = row; i < row_width; i++, rp += 3)
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_byte save = *rp;
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               *rp = *(rp + 2);
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               *(rp + 2) = save;
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         {
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_bytep rp;
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_uint_32 i;
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            for (i = 0, rp = row; i < row_width; i++, rp += 4)
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_byte save = *rp;
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               *rp = *(rp + 2);
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               *(rp + 2) = save;
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (row_info->bit_depth == 16)
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         if (row_info->color_type == PNG_COLOR_TYPE_RGB)
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         {
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_bytep rp;
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_uint_32 i;
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            for (i = 0, rp = row; i < row_width; i++, rp += 6)
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_byte save = *rp;
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               *rp = *(rp + 4);
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               *(rp + 4) = save;
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               save = *(rp + 1);
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               *(rp + 1) = *(rp + 5);
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               *(rp + 5) = save;
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         {
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_bytep rp;
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            png_uint_32 i;
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            for (i = 0, rp = row; i < row_width; i++, rp += 8)
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            {
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               png_byte save = *rp;
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               *rp = *(rp + 4);
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               *(rp + 4) = save;
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               save = *(rp + 1);
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               *(rp + 1) = *(rp + 5);
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               *(rp + 5) = save;
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         }
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    defined(PNG_LEGACY_SUPPORTED) || \
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_set_user_transform_info(png_structp png_ptr, png_voidp
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   user_transform_ptr, int user_transform_depth, int user_transform_channels)
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_debug(1, "in png_set_user_transform_info");
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL)
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->user_transform_ptr = user_transform_ptr;
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->user_transform_depth = (png_byte)user_transform_depth;
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   png_ptr->user_transform_channels = (png_byte)user_transform_channels;
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (user_transform_ptr || user_transform_depth || user_transform_channels)
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      png_warning(png_ptr,
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "This version of libpng does not support user transform info");
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* This function returns a pointer to the user_transform_ptr associated with
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the user transform functions.  The application should free any memory
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * associated with this pointer before png_write_destroy and png_read_destroy
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * are called.
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_voidp PNGAPI
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_get_user_transform_ptr(png_structp png_ptr)
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (png_ptr == NULL)
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return (NULL);
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return ((png_voidp)png_ptr->user_transform_ptr);
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return (NULL);
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */
700