176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* pngtrans.c - transforms the data in a row (used by both readers and writers)
376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Last changed in libpng 1.2.41 [December 3, 2009]
576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Copyright (c) 1998-2009 Glenn Randers-Pehrson
676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This code is released under the libpng license.
1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * For conditions of distribution and use, see the disclaimer
1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * and license in png.h
1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PNG_INTERNAL
1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PNG_NO_PEDANTIC_WARNINGS
1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "png.h"
1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Turn on BGR-to-RGB mapping */
2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid PNGAPI
2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_set_bgr(png_structp png_ptr)
2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   png_debug(1, "in png_set_bgr");
2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if (png_ptr == NULL)
2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      return;
2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   png_ptr->transformations |= PNG_BGR;
2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Turn on 16 bit byte swapping */
3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid PNGAPI
3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_set_swap(png_structp png_ptr)
3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   png_debug(1, "in png_set_swap");
3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if (png_ptr == NULL)
4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      return;
4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if (png_ptr->bit_depth == 16)
4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      png_ptr->transformations |= PNG_SWAP_BYTES;
4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED)
4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Turn on pixel packing */
4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid PNGAPI
4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_set_packing(png_structp png_ptr)
5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   png_debug(1, "in png_set_packing");
5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if (png_ptr == NULL)
5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      return;
5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if (png_ptr->bit_depth < 8)
5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   {
5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      png_ptr->transformations |= PNG_PACK;
5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      png_ptr->usr_bit_depth = 8;
5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   }
6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Turn on packed pixel swapping */
6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid PNGAPI
6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_set_packswap(png_structp png_ptr)
6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   png_debug(1, "in png_set_packswap");
6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if (png_ptr == NULL)
7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      return;
7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if (png_ptr->bit_depth < 8)
7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      png_ptr->transformations |= PNG_PACKSWAP;
7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED)
7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid PNGAPI
7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_set_shift(png_structp png_ptr, png_color_8p true_bits)
8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   png_debug(1, "in png_set_shift");
8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if (png_ptr == NULL)
8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      return;
8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   png_ptr->transformations |= PNG_SHIFT;
8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   png_ptr->shift = *true_bits;
8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if defined(PNG_READ_INTERLACING_SUPPORTED) || \
9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    defined(PNG_WRITE_INTERLACING_SUPPORTED)
9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint PNGAPI
9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_set_interlace_handling(png_structp png_ptr)
9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   png_debug(1, "in png_set_interlace handling");
9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if (png_ptr && png_ptr->interlaced)
9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   {
9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      png_ptr->transformations |= PNG_INTERLACE;
10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      return (7);
10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   }
10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   return (1);
10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)
10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Add a filler byte on read, or remove a filler or alpha byte on write.
10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * The filler type has changed in v0.95 to allow future 2-byte fillers
11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * for 48-bit input data, as well as to avoid problems with some compilers
11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * that don't like bytes as parameters.
11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid PNGAPI
11476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_set_filler(png_structp png_ptr, png_uint_32 filler, int filler_loc)
11576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   png_debug(1, "in png_set_filler");
11776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if (png_ptr == NULL)
11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      return;
12076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   png_ptr->transformations |= PNG_FILLER;
12176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifdef PNG_LEGACY_SUPPORTED
12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   png_ptr->filler = (png_byte)filler;
12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#else
12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   png_ptr->filler = (png_uint_16)filler;
12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
12676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if (filler_loc == PNG_FILLER_AFTER)
12776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      png_ptr->flags |= PNG_FLAG_FILLER_AFTER;
12876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   else
12976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER;
13076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   /* This should probably go in the "do_read_filler" routine.
13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    * I attempted to do that in libpng-1.0.1a but that caused problems
13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    * so I restored it in libpng-1.0.2a
13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   */
13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if (png_ptr->color_type == PNG_COLOR_TYPE_RGB)
13776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   {
13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      png_ptr->usr_channels = 4;
13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   }
14076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
14176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   /* Also I added this in libpng-1.0.2a (what happens when we expand
14276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    * a less-than-8-bit grayscale to GA? */
14376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
14476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY && png_ptr->bit_depth >= 8)
14576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   {
14676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      png_ptr->usr_channels = 2;
14776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   }
14876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
14976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
15076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef PNG_1_0_X
15176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Added to libpng-1.2.7 */
15276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid PNGAPI
15376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_set_add_alpha(png_structp png_ptr, png_uint_32 filler, int filler_loc)
15476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
15576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   png_debug(1, "in png_set_add_alpha");
15676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
15776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if (png_ptr == NULL)
15876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      return;
15976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   png_set_filler(png_ptr, filler, filler_loc);
16076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   png_ptr->transformations |= PNG_ADD_ALPHA;
16176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
16276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
16376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
16476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
16576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
16676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \
16776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
16876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid PNGAPI
16976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_set_swap_alpha(png_structp png_ptr)
17076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
17176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   png_debug(1, "in png_set_swap_alpha");
17276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
17376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if (png_ptr == NULL)
17476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      return;
17576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   png_ptr->transformations |= PNG_SWAP_ALPHA;
17676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
17776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
17876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
17976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \
18076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
18176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid PNGAPI
18276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_set_invert_alpha(png_structp png_ptr)
18376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
18476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   png_debug(1, "in png_set_invert_alpha");
18576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
18676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if (png_ptr == NULL)
18776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      return;
18876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   png_ptr->transformations |= PNG_INVERT_ALPHA;
18976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
19076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
19176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
19276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED)
19376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid PNGAPI
19476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_set_invert_mono(png_structp png_ptr)
19576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
19676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   png_debug(1, "in png_set_invert_mono");
19776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
19876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if (png_ptr == NULL)
19976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      return;
20076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   png_ptr->transformations |= PNG_INVERT_MONO;
20176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
20276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
20376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Invert monochrome grayscale data */
20476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid /* PRIVATE */
20576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_do_invert(png_row_infop row_info, png_bytep row)
20676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
20776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   png_debug(1, "in png_do_invert");
20876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
20976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  /* This test removed from libpng version 1.0.13 and 1.2.0:
21076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   *   if (row_info->bit_depth == 1 &&
21176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   */
21276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifdef PNG_USELESS_TESTS_SUPPORTED
21376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if (row == NULL || row_info == NULL)
21476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman     return;
21576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
21676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if (row_info->color_type == PNG_COLOR_TYPE_GRAY)
21776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   {
21876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      png_bytep rp = row;
21976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      png_uint_32 i;
22076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      png_uint_32 istop = row_info->rowbytes;
22176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
22276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      for (i = 0; i < istop; i++)
22376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      {
22476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         *rp = (png_byte)(~(*rp));
22576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         rp++;
22676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      }
22776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   }
22876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
22976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      row_info->bit_depth == 8)
23076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   {
23176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      png_bytep rp = row;
23276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      png_uint_32 i;
23376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      png_uint_32 istop = row_info->rowbytes;
23476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
23576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      for (i = 0; i < istop; i+=2)
23676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      {
23776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         *rp = (png_byte)(~(*rp));
23876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         rp+=2;
23976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      }
24076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   }
24176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
24276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      row_info->bit_depth == 16)
24376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   {
24476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      png_bytep rp = row;
24576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      png_uint_32 i;
24676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      png_uint_32 istop = row_info->rowbytes;
24776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
24876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      for (i = 0; i < istop; i+=4)
24976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      {
25076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         *rp = (png_byte)(~(*rp));
25176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         *(rp+1) = (png_byte)(~(*(rp+1)));
25276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         rp+=4;
25376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      }
25476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   }
25576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
25676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
25776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
25876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
25976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Swaps byte order on 16 bit depth images */
26076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid /* PRIVATE */
26176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_do_swap(png_row_infop row_info, png_bytep row)
26276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
26376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   png_debug(1, "in png_do_swap");
26476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
26576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if (
26676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifdef PNG_USELESS_TESTS_SUPPORTED
26776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman       row != NULL && row_info != NULL &&
26876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
26976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman       row_info->bit_depth == 16)
27076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   {
27176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      png_bytep rp = row;
27276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      png_uint_32 i;
27376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      png_uint_32 istop= row_info->width * row_info->channels;
27476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
27576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      for (i = 0; i < istop; i++, rp += 2)
27676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      {
27776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         png_byte t = *rp;
27876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         *rp = *(rp + 1);
27976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         *(rp + 1) = t;
28076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      }
28176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   }
28276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
28376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
28476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
28576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
28676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic PNG_CONST png_byte onebppswaptable[256] = {
28776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,
28876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
28976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8,
29076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
29176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4,
29276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
29376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC,
29476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
29576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2,
29676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
29776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA,
29876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
29976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6,
30076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
30176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE,
30276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
30376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1,
30476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
30576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9,
30676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
30776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5,
30876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
30976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED,
31076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
31176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3,
31276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
31376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB,
31476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
31576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7,
31676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
31776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF,
31876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
31976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman};
32076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
32176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic PNG_CONST png_byte twobppswaptable[256] = {
32276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x00, 0x40, 0x80, 0xC0, 0x10, 0x50, 0x90, 0xD0,
32376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x20, 0x60, 0xA0, 0xE0, 0x30, 0x70, 0xB0, 0xF0,
32476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x04, 0x44, 0x84, 0xC4, 0x14, 0x54, 0x94, 0xD4,
32576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x24, 0x64, 0xA4, 0xE4, 0x34, 0x74, 0xB4, 0xF4,
32676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x08, 0x48, 0x88, 0xC8, 0x18, 0x58, 0x98, 0xD8,
32776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x28, 0x68, 0xA8, 0xE8, 0x38, 0x78, 0xB8, 0xF8,
32876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x0C, 0x4C, 0x8C, 0xCC, 0x1C, 0x5C, 0x9C, 0xDC,
32976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x2C, 0x6C, 0xAC, 0xEC, 0x3C, 0x7C, 0xBC, 0xFC,
33076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x01, 0x41, 0x81, 0xC1, 0x11, 0x51, 0x91, 0xD1,
33176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x21, 0x61, 0xA1, 0xE1, 0x31, 0x71, 0xB1, 0xF1,
33276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x05, 0x45, 0x85, 0xC5, 0x15, 0x55, 0x95, 0xD5,
33376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x25, 0x65, 0xA5, 0xE5, 0x35, 0x75, 0xB5, 0xF5,
33476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x09, 0x49, 0x89, 0xC9, 0x19, 0x59, 0x99, 0xD9,
33576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x29, 0x69, 0xA9, 0xE9, 0x39, 0x79, 0xB9, 0xF9,
33676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x0D, 0x4D, 0x8D, 0xCD, 0x1D, 0x5D, 0x9D, 0xDD,
33776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x2D, 0x6D, 0xAD, 0xED, 0x3D, 0x7D, 0xBD, 0xFD,
33876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x02, 0x42, 0x82, 0xC2, 0x12, 0x52, 0x92, 0xD2,
33976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x22, 0x62, 0xA2, 0xE2, 0x32, 0x72, 0xB2, 0xF2,
34076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x06, 0x46, 0x86, 0xC6, 0x16, 0x56, 0x96, 0xD6,
34176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x26, 0x66, 0xA6, 0xE6, 0x36, 0x76, 0xB6, 0xF6,
34276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x0A, 0x4A, 0x8A, 0xCA, 0x1A, 0x5A, 0x9A, 0xDA,
34376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x2A, 0x6A, 0xAA, 0xEA, 0x3A, 0x7A, 0xBA, 0xFA,
34476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x0E, 0x4E, 0x8E, 0xCE, 0x1E, 0x5E, 0x9E, 0xDE,
34576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x2E, 0x6E, 0xAE, 0xEE, 0x3E, 0x7E, 0xBE, 0xFE,
34676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x03, 0x43, 0x83, 0xC3, 0x13, 0x53, 0x93, 0xD3,
34776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x23, 0x63, 0xA3, 0xE3, 0x33, 0x73, 0xB3, 0xF3,
34876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x07, 0x47, 0x87, 0xC7, 0x17, 0x57, 0x97, 0xD7,
34976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x27, 0x67, 0xA7, 0xE7, 0x37, 0x77, 0xB7, 0xF7,
35076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x0B, 0x4B, 0x8B, 0xCB, 0x1B, 0x5B, 0x9B, 0xDB,
35176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x2B, 0x6B, 0xAB, 0xEB, 0x3B, 0x7B, 0xBB, 0xFB,
35276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x0F, 0x4F, 0x8F, 0xCF, 0x1F, 0x5F, 0x9F, 0xDF,
35376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x2F, 0x6F, 0xAF, 0xEF, 0x3F, 0x7F, 0xBF, 0xFF
35476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman};
35576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
35676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic PNG_CONST png_byte fourbppswaptable[256] = {
35776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70,
35876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0,
35976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71,
36076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1,
36176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72,
36276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x82, 0x92, 0xA2, 0xB2, 0xC2, 0xD2, 0xE2, 0xF2,
36376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73,
36476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x83, 0x93, 0xA3, 0xB3, 0xC3, 0xD3, 0xE3, 0xF3,
36576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74,
36676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x84, 0x94, 0xA4, 0xB4, 0xC4, 0xD4, 0xE4, 0xF4,
36776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75,
36876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x85, 0x95, 0xA5, 0xB5, 0xC5, 0xD5, 0xE5, 0xF5,
36976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76,
37076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x86, 0x96, 0xA6, 0xB6, 0xC6, 0xD6, 0xE6, 0xF6,
37176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77,
37276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x87, 0x97, 0xA7, 0xB7, 0xC7, 0xD7, 0xE7, 0xF7,
37376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78,
37476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x88, 0x98, 0xA8, 0xB8, 0xC8, 0xD8, 0xE8, 0xF8,
37576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79,
37676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, 0xE9, 0xF9,
37776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x0A, 0x1A, 0x2A, 0x3A, 0x4A, 0x5A, 0x6A, 0x7A,
37876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x8A, 0x9A, 0xAA, 0xBA, 0xCA, 0xDA, 0xEA, 0xFA,
37976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x0B, 0x1B, 0x2B, 0x3B, 0x4B, 0x5B, 0x6B, 0x7B,
38076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x8B, 0x9B, 0xAB, 0xBB, 0xCB, 0xDB, 0xEB, 0xFB,
38176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x0C, 0x1C, 0x2C, 0x3C, 0x4C, 0x5C, 0x6C, 0x7C,
38276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x8C, 0x9C, 0xAC, 0xBC, 0xCC, 0xDC, 0xEC, 0xFC,
38376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x0D, 0x1D, 0x2D, 0x3D, 0x4D, 0x5D, 0x6D, 0x7D,
38476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x8D, 0x9D, 0xAD, 0xBD, 0xCD, 0xDD, 0xED, 0xFD,
38576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x0E, 0x1E, 0x2E, 0x3E, 0x4E, 0x5E, 0x6E, 0x7E,
38676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x8E, 0x9E, 0xAE, 0xBE, 0xCE, 0xDE, 0xEE, 0xFE,
38776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x0F, 0x1F, 0x2F, 0x3F, 0x4F, 0x5F, 0x6F, 0x7F,
38876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF
38976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman};
39076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
39176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Swaps pixel packing order within bytes */
39276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid /* PRIVATE */
39376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_do_packswap(png_row_infop row_info, png_bytep row)
39476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
39576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   png_debug(1, "in png_do_packswap");
39676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
39776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if (
39876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifdef PNG_USELESS_TESTS_SUPPORTED
39976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman       row != NULL && row_info != NULL &&
40076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
40176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman       row_info->bit_depth < 8)
40276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   {
40376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      png_bytep rp, end, table;
40476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
40576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      end = row + row_info->rowbytes;
40676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
40776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      if (row_info->bit_depth == 1)
40876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         table = (png_bytep)onebppswaptable;
40976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      else if (row_info->bit_depth == 2)
41076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         table = (png_bytep)twobppswaptable;
41176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      else if (row_info->bit_depth == 4)
41276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         table = (png_bytep)fourbppswaptable;
41376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      else
41476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         return;
41576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
41676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      for (rp = row; rp < end; rp++)
41776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         *rp = table[*rp];
41876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   }
41976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
42076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif /* PNG_READ_PACKSWAP_SUPPORTED or PNG_WRITE_PACKSWAP_SUPPORTED */
42176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
42276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if defined(PNG_WRITE_FILLER_SUPPORTED) || \
42376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
42476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Remove filler or alpha byte(s) */
42576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid /* PRIVATE */
42676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags)
42776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
42876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   png_debug(1, "in png_do_strip_filler");
42976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
43076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifdef PNG_USELESS_TESTS_SUPPORTED
43176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if (row != NULL && row_info != NULL)
43276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
43376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   {
43476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      png_bytep sp=row;
43576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      png_bytep dp=row;
43676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      png_uint_32 row_width=row_info->width;
43776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      png_uint_32 i;
43876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
43976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      if ((row_info->color_type == PNG_COLOR_TYPE_RGB ||
44076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA &&
44176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          (flags & PNG_FLAG_STRIP_ALPHA))) &&
44276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          row_info->channels == 4)
44376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      {
44476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         if (row_info->bit_depth == 8)
44576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         {
44676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            /* This converts from RGBX or RGBA to RGB */
44776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            if (flags & PNG_FLAG_FILLER_AFTER)
44876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            {
44976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               dp+=3; sp+=4;
45076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               for (i = 1; i < row_width; i++)
45176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               {
45276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  *dp++ = *sp++;
45376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  *dp++ = *sp++;
45476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  *dp++ = *sp++;
45576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  sp++;
45676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               }
45776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            }
45876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            /* This converts from XRGB or ARGB to RGB */
45976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            else
46076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            {
46176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               for (i = 0; i < row_width; i++)
46276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               {
46376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  sp++;
46476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  *dp++ = *sp++;
46576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  *dp++ = *sp++;
46676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  *dp++ = *sp++;
46776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               }
46876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            }
46976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            row_info->pixel_depth = 24;
47076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            row_info->rowbytes = row_width * 3;
47176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         }
47276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         else /* if (row_info->bit_depth == 16) */
47376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         {
47476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            if (flags & PNG_FLAG_FILLER_AFTER)
47576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            {
47676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               /* This converts from RRGGBBXX or RRGGBBAA to RRGGBB */
47776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               sp += 8; dp += 6;
47876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               for (i = 1; i < row_width; i++)
47976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               {
48076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  /* This could be (although png_memcpy is probably slower):
48176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  png_memcpy(dp, sp, 6);
48276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  sp += 8;
48376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  dp += 6;
48476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  */
48576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
48676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  *dp++ = *sp++;
48776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  *dp++ = *sp++;
48876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  *dp++ = *sp++;
48976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  *dp++ = *sp++;
49076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  *dp++ = *sp++;
49176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  *dp++ = *sp++;
49276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  sp += 2;
49376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               }
49476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            }
49576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            else
49676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            {
49776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               /* This converts from XXRRGGBB or AARRGGBB to RRGGBB */
49876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               for (i = 0; i < row_width; i++)
49976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               {
50076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  /* This could be (although png_memcpy is probably slower):
50176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  png_memcpy(dp, sp, 6);
50276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  sp += 8;
50376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  dp += 6;
50476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  */
50576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
50676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  sp+=2;
50776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  *dp++ = *sp++;
50876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  *dp++ = *sp++;
50976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  *dp++ = *sp++;
51076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  *dp++ = *sp++;
51176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  *dp++ = *sp++;
51276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  *dp++ = *sp++;
51376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               }
51476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            }
51576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            row_info->pixel_depth = 48;
51676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            row_info->rowbytes = row_width * 6;
51776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         }
51876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         row_info->channels = 3;
51976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      }
52076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      else if ((row_info->color_type == PNG_COLOR_TYPE_GRAY ||
52176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
52276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         (flags & PNG_FLAG_STRIP_ALPHA))) &&
52376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman          row_info->channels == 2)
52476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      {
52576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         if (row_info->bit_depth == 8)
52676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         {
52776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            /* This converts from GX or GA to G */
52876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            if (flags & PNG_FLAG_FILLER_AFTER)
52976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            {
53076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               for (i = 0; i < row_width; i++)
53176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               {
53276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  *dp++ = *sp++;
53376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  sp++;
53476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               }
53576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            }
53676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            /* This converts from XG or AG to G */
53776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            else
53876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            {
53976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               for (i = 0; i < row_width; i++)
54076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               {
54176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  sp++;
54276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  *dp++ = *sp++;
54376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               }
54476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            }
54576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            row_info->pixel_depth = 8;
54676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            row_info->rowbytes = row_width;
54776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         }
54876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         else /* if (row_info->bit_depth == 16) */
54976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         {
55076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            if (flags & PNG_FLAG_FILLER_AFTER)
55176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            {
55276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               /* This converts from GGXX or GGAA to GG */
55376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               sp += 4; dp += 2;
55476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               for (i = 1; i < row_width; i++)
55576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               {
55676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  *dp++ = *sp++;
55776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  *dp++ = *sp++;
55876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  sp += 2;
55976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               }
56076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            }
56176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            else
56276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            {
56376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               /* This converts from XXGG or AAGG to GG */
56476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               for (i = 0; i < row_width; i++)
56576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               {
56676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  sp += 2;
56776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  *dp++ = *sp++;
56876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                  *dp++ = *sp++;
56976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               }
57076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            }
57176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            row_info->pixel_depth = 16;
57276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            row_info->rowbytes = row_width * 2;
57376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         }
57476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         row_info->channels = 1;
57576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      }
57676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      if (flags & PNG_FLAG_STRIP_ALPHA)
57776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        row_info->color_type &= ~PNG_COLOR_MASK_ALPHA;
57876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   }
57976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
58076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
58176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
58276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
58376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Swaps red and blue bytes within a pixel */
58476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid /* PRIVATE */
58576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_do_bgr(png_row_infop row_info, png_bytep row)
58676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
58776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   png_debug(1, "in png_do_bgr");
58876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
58976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if (
59076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifdef PNG_USELESS_TESTS_SUPPORTED
59176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman       row != NULL && row_info != NULL &&
59276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
59376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman       (row_info->color_type & PNG_COLOR_MASK_COLOR))
59476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   {
59576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      png_uint_32 row_width = row_info->width;
59676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      if (row_info->bit_depth == 8)
59776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      {
59876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         if (row_info->color_type == PNG_COLOR_TYPE_RGB)
59976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         {
60076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            png_bytep rp;
60176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            png_uint_32 i;
60276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
60376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            for (i = 0, rp = row; i < row_width; i++, rp += 3)
60476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            {
60576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               png_byte save = *rp;
60676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               *rp = *(rp + 2);
60776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               *(rp + 2) = save;
60876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            }
60976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         }
61076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
61176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         {
61276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            png_bytep rp;
61376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            png_uint_32 i;
61476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
61576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            for (i = 0, rp = row; i < row_width; i++, rp += 4)
61676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            {
61776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               png_byte save = *rp;
61876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               *rp = *(rp + 2);
61976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               *(rp + 2) = save;
62076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            }
62176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         }
62276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      }
62376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      else if (row_info->bit_depth == 16)
62476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      {
62576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         if (row_info->color_type == PNG_COLOR_TYPE_RGB)
62676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         {
62776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            png_bytep rp;
62876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            png_uint_32 i;
62976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
63076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            for (i = 0, rp = row; i < row_width; i++, rp += 6)
63176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            {
63276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               png_byte save = *rp;
63376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               *rp = *(rp + 4);
63476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               *(rp + 4) = save;
63576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               save = *(rp + 1);
63676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               *(rp + 1) = *(rp + 5);
63776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               *(rp + 5) = save;
63876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            }
63976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         }
64076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
64176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         {
64276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            png_bytep rp;
64376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            png_uint_32 i;
64476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
64576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            for (i = 0, rp = row; i < row_width; i++, rp += 8)
64676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            {
64776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               png_byte save = *rp;
64876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               *rp = *(rp + 4);
64976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               *(rp + 4) = save;
65076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               save = *(rp + 1);
65176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               *(rp + 1) = *(rp + 5);
65276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman               *(rp + 5) = save;
65376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            }
65476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman         }
65576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      }
65676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   }
65776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
65876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */
65976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
66076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
66176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    defined(PNG_LEGACY_SUPPORTED) || \
66276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
66376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid PNGAPI
66476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_set_user_transform_info(png_structp png_ptr, png_voidp
66576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   user_transform_ptr, int user_transform_depth, int user_transform_channels)
66676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
66776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   png_debug(1, "in png_set_user_transform_info");
66876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
66976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if (png_ptr == NULL)
67076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      return;
67176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED
67276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   png_ptr->user_transform_ptr = user_transform_ptr;
67376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   png_ptr->user_transform_depth = (png_byte)user_transform_depth;
67476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   png_ptr->user_transform_channels = (png_byte)user_transform_channels;
67576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#else
67676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if (user_transform_ptr || user_transform_depth || user_transform_channels)
67776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      png_warning(png_ptr,
67876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        "This version of libpng does not support user transform info");
67976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
68076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
68176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
68276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
68376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* This function returns a pointer to the user_transform_ptr associated with
68476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * the user transform functions.  The application should free any memory
68576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * associated with this pointer before png_write_destroy and png_read_destroy
68676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * are called.
68776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
68876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_voidp PNGAPI
68976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_get_user_transform_ptr(png_structp png_ptr)
69076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
69176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   if (png_ptr == NULL)
69276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman      return (NULL);
69376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED
69476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   return ((png_voidp)png_ptr->user_transform_ptr);
69576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#else
69676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman   return (NULL);
69776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
69876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
69976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */
700