18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* pngtrans.c - transforms the data in a row (used by both readers and writers)
38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
4c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * Last changed in libpng 1.2.41 [December 3, 2009]
5c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * Copyright (c) 1998-2009 Glenn Randers-Pehrson
68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
8c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner *
9c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * This code is released under the libpng license.
10c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * For conditions of distribution and use, see the disclaimer
11c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner * and license in png.h
128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_INTERNAL
15c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#define PNG_NO_PEDANTIC_WARNINGS
168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "png.h"
178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
18c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
20c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner/* Turn on BGR-to-RGB mapping */
218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_bgr(png_structp png_ptr)
238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
24c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_debug(1, "in png_set_bgr");
25c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
26c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_ptr == NULL)
27c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      return;
288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->transformations |= PNG_BGR;
298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
33c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner/* Turn on 16 bit byte swapping */
348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_swap(png_structp png_ptr)
368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
37c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_debug(1, "in png_set_swap");
38c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
39c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_ptr == NULL)
40c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      return;
418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->bit_depth == 16)
428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->transformations |= PNG_SWAP_BYTES;
438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED)
47c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner/* Turn on pixel packing */
488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_packing(png_structp png_ptr)
508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
51c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_debug(1, "in png_set_packing");
52c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
53c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_ptr == NULL)
54c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      return;
558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->bit_depth < 8)
568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->transformations |= PNG_PACK;
588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->usr_bit_depth = 8;
598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
64c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner/* Turn on packed pixel swapping */
658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_packswap(png_structp png_ptr)
678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
68c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_debug(1, "in png_set_packswap");
69c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
70c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_ptr == NULL)
71c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      return;
728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->bit_depth < 8)
738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->transformations |= PNG_PACKSWAP;
748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED)
788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_shift(png_structp png_ptr, png_color_8p true_bits)
808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
81c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_debug(1, "in png_set_shift");
82c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
83c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_ptr == NULL)
84c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      return;
858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->transformations |= PNG_SHIFT;
868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->shift = *true_bits;
878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_INTERLACING_SUPPORTED) || \
918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    defined(PNG_WRITE_INTERLACING_SUPPORTED)
928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint PNGAPI
938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_interlace_handling(png_structp png_ptr)
948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
95c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_debug(1, "in png_set_interlace handling");
96c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr && png_ptr->interlaced)
988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->transformations |= PNG_INTERLACE;
1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      return (7);
1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   return (1);
1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)
1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Add a filler byte on read, or remove a filler or alpha byte on write.
1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * The filler type has changed in v0.95 to allow future 2-byte fillers
1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * for 48-bit input data, as well as to avoid problems with some compilers
1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * that don't like bytes as parameters.
1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_filler(png_structp png_ptr, png_uint_32 filler, int filler_loc)
1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
116c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_debug(1, "in png_set_filler");
117c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
118c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_ptr == NULL)
119c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      return;
1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->transformations |= PNG_FILLER;
121c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_LEGACY_SUPPORTED
1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->filler = (png_byte)filler;
123c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#else
124c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_ptr->filler = (png_uint_16)filler;
125c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#endif
1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (filler_loc == PNG_FILLER_AFTER)
1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->flags |= PNG_FLAG_FILLER_AFTER;
1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else
1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER;
1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* This should probably go in the "do_read_filler" routine.
1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * I attempted to do that in libpng-1.0.1a but that caused problems
1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * so I restored it in libpng-1.0.2a
1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   */
1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->color_type == PNG_COLOR_TYPE_RGB)
1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->usr_channels = 4;
1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   /* Also I added this in libpng-1.0.2a (what happens when we expand
1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    * a less-than-8-bit grayscale to GA? */
1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY && png_ptr->bit_depth >= 8)
1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_ptr->usr_channels = 2;
1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
150c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifndef PNG_1_0_X
1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Added to libpng-1.2.7 */
1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_add_alpha(png_structp png_ptr, png_uint_32 filler, int filler_loc)
1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
155c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_debug(1, "in png_set_add_alpha");
156c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
157c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_ptr == NULL)
158c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      return;
1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_set_filler(png_ptr, filler, filler_loc);
1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->transformations |= PNG_ADD_ALPHA;
1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \
1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_swap_alpha(png_structp png_ptr)
1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
171c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_debug(1, "in png_set_swap_alpha");
172c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
173c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_ptr == NULL)
174c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      return;
1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->transformations |= PNG_SWAP_ALPHA;
1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \
1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_invert_alpha(png_structp png_ptr)
1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
184c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_debug(1, "in png_set_invert_alpha");
185c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
186c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_ptr == NULL)
187c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      return;
1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->transformations |= PNG_INVERT_ALPHA;
1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED)
1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_invert_mono(png_structp png_ptr)
1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
196c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_debug(1, "in png_set_invert_mono");
197c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
198c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_ptr == NULL)
199c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      return;
2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->transformations |= PNG_INVERT_MONO;
2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
203c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner/* Invert monochrome grayscale data */
2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_do_invert(png_row_infop row_info, png_bytep row)
2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
207c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_debug(1, "in png_do_invert");
208c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /* This test removed from libpng version 1.0.13 and 1.2.0:
2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   *   if (row_info->bit_depth == 1 &&
2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   */
212c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_USELESS_TESTS_SUPPORTED
2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (row == NULL || row_info == NULL)
2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     return;
2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (row_info->color_type == PNG_COLOR_TYPE_GRAY)
2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_bytep rp = row;
2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_uint_32 i;
2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_uint_32 istop = row_info->rowbytes;
2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      for (i = 0; i < istop; i++)
2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         *rp = (png_byte)(~(*rp));
2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         rp++;
2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      row_info->bit_depth == 8)
2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_bytep rp = row;
2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_uint_32 i;
2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_uint_32 istop = row_info->rowbytes;
2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      for (i = 0; i < istop; i+=2)
2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         *rp = (png_byte)(~(*rp));
2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         rp+=2;
2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
2418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      row_info->bit_depth == 16)
2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_bytep rp = row;
2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_uint_32 i;
2468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_uint_32 istop = row_info->rowbytes;
2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      for (i = 0; i < istop; i+=4)
2498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
2508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         *rp = (png_byte)(~(*rp));
2518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         *(rp+1) = (png_byte)(~(*(rp+1)));
2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         rp+=4;
2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
2548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
2578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
259c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner/* Swaps byte order on 16 bit depth images */
2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_do_swap(png_row_infop row_info, png_bytep row)
2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
263c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_debug(1, "in png_do_swap");
264c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (
266c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_USELESS_TESTS_SUPPORTED
2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       row != NULL && row_info != NULL &&
2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       row_info->bit_depth == 16)
2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_bytep rp = row;
2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_uint_32 i;
2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_uint_32 istop= row_info->width * row_info->channels;
2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      for (i = 0; i < istop; i++, rp += 2)
2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         png_byte t = *rp;
2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         *rp = *(rp + 1);
2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         *(rp + 1) = t;
2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic PNG_CONST png_byte onebppswaptable[256] = {
2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,
2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8,
2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4,
2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC,
2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2,
2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA,
2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6,
3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE,
3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1,
3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9,
3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5,
3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED,
3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3,
3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB,
3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7,
3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF,
3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic PNG_CONST png_byte twobppswaptable[256] = {
3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x00, 0x40, 0x80, 0xC0, 0x10, 0x50, 0x90, 0xD0,
3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x20, 0x60, 0xA0, 0xE0, 0x30, 0x70, 0xB0, 0xF0,
3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x04, 0x44, 0x84, 0xC4, 0x14, 0x54, 0x94, 0xD4,
3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x24, 0x64, 0xA4, 0xE4, 0x34, 0x74, 0xB4, 0xF4,
3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x08, 0x48, 0x88, 0xC8, 0x18, 0x58, 0x98, 0xD8,
3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x28, 0x68, 0xA8, 0xE8, 0x38, 0x78, 0xB8, 0xF8,
3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x0C, 0x4C, 0x8C, 0xCC, 0x1C, 0x5C, 0x9C, 0xDC,
3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x2C, 0x6C, 0xAC, 0xEC, 0x3C, 0x7C, 0xBC, 0xFC,
3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x01, 0x41, 0x81, 0xC1, 0x11, 0x51, 0x91, 0xD1,
3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x21, 0x61, 0xA1, 0xE1, 0x31, 0x71, 0xB1, 0xF1,
3328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x05, 0x45, 0x85, 0xC5, 0x15, 0x55, 0x95, 0xD5,
3338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x25, 0x65, 0xA5, 0xE5, 0x35, 0x75, 0xB5, 0xF5,
3348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x09, 0x49, 0x89, 0xC9, 0x19, 0x59, 0x99, 0xD9,
3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x29, 0x69, 0xA9, 0xE9, 0x39, 0x79, 0xB9, 0xF9,
3368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x0D, 0x4D, 0x8D, 0xCD, 0x1D, 0x5D, 0x9D, 0xDD,
3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x2D, 0x6D, 0xAD, 0xED, 0x3D, 0x7D, 0xBD, 0xFD,
3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x02, 0x42, 0x82, 0xC2, 0x12, 0x52, 0x92, 0xD2,
3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x22, 0x62, 0xA2, 0xE2, 0x32, 0x72, 0xB2, 0xF2,
3408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x06, 0x46, 0x86, 0xC6, 0x16, 0x56, 0x96, 0xD6,
3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x26, 0x66, 0xA6, 0xE6, 0x36, 0x76, 0xB6, 0xF6,
3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x0A, 0x4A, 0x8A, 0xCA, 0x1A, 0x5A, 0x9A, 0xDA,
3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x2A, 0x6A, 0xAA, 0xEA, 0x3A, 0x7A, 0xBA, 0xFA,
3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x0E, 0x4E, 0x8E, 0xCE, 0x1E, 0x5E, 0x9E, 0xDE,
3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x2E, 0x6E, 0xAE, 0xEE, 0x3E, 0x7E, 0xBE, 0xFE,
3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x03, 0x43, 0x83, 0xC3, 0x13, 0x53, 0x93, 0xD3,
3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x23, 0x63, 0xA3, 0xE3, 0x33, 0x73, 0xB3, 0xF3,
3488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x07, 0x47, 0x87, 0xC7, 0x17, 0x57, 0x97, 0xD7,
3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x27, 0x67, 0xA7, 0xE7, 0x37, 0x77, 0xB7, 0xF7,
3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x0B, 0x4B, 0x8B, 0xCB, 0x1B, 0x5B, 0x9B, 0xDB,
3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x2B, 0x6B, 0xAB, 0xEB, 0x3B, 0x7B, 0xBB, 0xFB,
3528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x0F, 0x4F, 0x8F, 0xCF, 0x1F, 0x5F, 0x9F, 0xDF,
3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x2F, 0x6F, 0xAF, 0xEF, 0x3F, 0x7F, 0xBF, 0xFF
3548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
3558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic PNG_CONST png_byte fourbppswaptable[256] = {
3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70,
3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0,
3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71,
3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1,
3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72,
3628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x82, 0x92, 0xA2, 0xB2, 0xC2, 0xD2, 0xE2, 0xF2,
3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73,
3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x83, 0x93, 0xA3, 0xB3, 0xC3, 0xD3, 0xE3, 0xF3,
3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74,
3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x84, 0x94, 0xA4, 0xB4, 0xC4, 0xD4, 0xE4, 0xF4,
3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75,
3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x85, 0x95, 0xA5, 0xB5, 0xC5, 0xD5, 0xE5, 0xF5,
3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76,
3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x86, 0x96, 0xA6, 0xB6, 0xC6, 0xD6, 0xE6, 0xF6,
3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77,
3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x87, 0x97, 0xA7, 0xB7, 0xC7, 0xD7, 0xE7, 0xF7,
3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78,
3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x88, 0x98, 0xA8, 0xB8, 0xC8, 0xD8, 0xE8, 0xF8,
3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79,
3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, 0xE9, 0xF9,
3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x0A, 0x1A, 0x2A, 0x3A, 0x4A, 0x5A, 0x6A, 0x7A,
3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x8A, 0x9A, 0xAA, 0xBA, 0xCA, 0xDA, 0xEA, 0xFA,
3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x0B, 0x1B, 0x2B, 0x3B, 0x4B, 0x5B, 0x6B, 0x7B,
3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x8B, 0x9B, 0xAB, 0xBB, 0xCB, 0xDB, 0xEB, 0xFB,
3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x0C, 0x1C, 0x2C, 0x3C, 0x4C, 0x5C, 0x6C, 0x7C,
3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x8C, 0x9C, 0xAC, 0xBC, 0xCC, 0xDC, 0xEC, 0xFC,
3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x0D, 0x1D, 0x2D, 0x3D, 0x4D, 0x5D, 0x6D, 0x7D,
3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x8D, 0x9D, 0xAD, 0xBD, 0xCD, 0xDD, 0xED, 0xFD,
3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x0E, 0x1E, 0x2E, 0x3E, 0x4E, 0x5E, 0x6E, 0x7E,
3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x8E, 0x9E, 0xAE, 0xBE, 0xCE, 0xDE, 0xEE, 0xFE,
3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x0F, 0x1F, 0x2F, 0x3F, 0x4F, 0x5F, 0x6F, 0x7F,
3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF
3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
391c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner/* Swaps pixel packing order within bytes */
3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
3938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_do_packswap(png_row_infop row_info, png_bytep row)
3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
395c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_debug(1, "in png_do_packswap");
396c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (
398c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_USELESS_TESTS_SUPPORTED
3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       row != NULL && row_info != NULL &&
4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
4018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       row_info->bit_depth < 8)
4028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
4038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_bytep rp, end, table;
4048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      end = row + row_info->rowbytes;
4068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (row_info->bit_depth == 1)
4088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         table = (png_bytep)onebppswaptable;
4098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (row_info->bit_depth == 2)
4108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         table = (png_bytep)twobppswaptable;
4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (row_info->bit_depth == 4)
4128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         table = (png_bytep)fourbppswaptable;
4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else
4148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         return;
4158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      for (rp = row; rp < end; rp++)
4178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         *rp = table[*rp];
4188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
4198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
4208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_READ_PACKSWAP_SUPPORTED or PNG_WRITE_PACKSWAP_SUPPORTED */
4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_FILLER_SUPPORTED) || \
4238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
424c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner/* Remove filler or alpha byte(s) */
4258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
4268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags)
4278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
428c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_debug(1, "in png_do_strip_filler");
429c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
430c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_USELESS_TESTS_SUPPORTED
4318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (row != NULL && row_info != NULL)
4328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
4338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
4348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_bytep sp=row;
4358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_bytep dp=row;
4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_uint_32 row_width=row_info->width;
4378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_uint_32 i;
4388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if ((row_info->color_type == PNG_COLOR_TYPE_RGB ||
440c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner          (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA &&
441c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner          (flags & PNG_FLAG_STRIP_ALPHA))) &&
442c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner          row_info->channels == 4)
4438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
4448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (row_info->bit_depth == 8)
4458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
4468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            /* This converts from RGBX or RGBA to RGB */
4478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (flags & PNG_FLAG_FILLER_AFTER)
4488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
4498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               dp+=3; sp+=4;
4508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               for (i = 1; i < row_width; i++)
4518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               {
4528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  *dp++ = *sp++;
4538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  *dp++ = *sp++;
4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  *dp++ = *sp++;
4558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  sp++;
4568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               }
4578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
4588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            /* This converts from XRGB or ARGB to RGB */
4598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            else
4608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               for (i = 0; i < row_width; i++)
4628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               {
4638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  sp++;
4648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  *dp++ = *sp++;
4658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  *dp++ = *sp++;
4668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  *dp++ = *sp++;
4678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               }
4688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
4698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            row_info->pixel_depth = 24;
4708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            row_info->rowbytes = row_width * 3;
4718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
4728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         else /* if (row_info->bit_depth == 16) */
4738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
4748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (flags & PNG_FLAG_FILLER_AFTER)
4758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
4768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               /* This converts from RRGGBBXX or RRGGBBAA to RRGGBB */
4778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               sp += 8; dp += 6;
4788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               for (i = 1; i < row_width; i++)
4798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               {
4808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  /* This could be (although png_memcpy is probably slower):
4818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_memcpy(dp, sp, 6);
4828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  sp += 8;
4838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  dp += 6;
4848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  */
4858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  *dp++ = *sp++;
4878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  *dp++ = *sp++;
4888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  *dp++ = *sp++;
4898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  *dp++ = *sp++;
4908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  *dp++ = *sp++;
4918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  *dp++ = *sp++;
4928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  sp += 2;
4938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               }
4948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
4958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            else
4968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
4978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               /* This converts from XXRRGGBB or AARRGGBB to RRGGBB */
4988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               for (i = 0; i < row_width; i++)
4998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               {
5008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  /* This could be (although png_memcpy is probably slower):
5018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  png_memcpy(dp, sp, 6);
5028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  sp += 8;
5038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  dp += 6;
5048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  */
5058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  sp+=2;
5078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  *dp++ = *sp++;
5088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  *dp++ = *sp++;
5098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  *dp++ = *sp++;
5108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  *dp++ = *sp++;
5118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  *dp++ = *sp++;
5128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  *dp++ = *sp++;
5138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               }
5148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
5158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            row_info->pixel_depth = 48;
5168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            row_info->rowbytes = row_width * 6;
5178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
5188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         row_info->channels = 3;
5198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
5208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if ((row_info->color_type == PNG_COLOR_TYPE_GRAY ||
5218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
5228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         (flags & PNG_FLAG_STRIP_ALPHA))) &&
5238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project          row_info->channels == 2)
5248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
5258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (row_info->bit_depth == 8)
5268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
5278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            /* This converts from GX or GA to G */
5288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (flags & PNG_FLAG_FILLER_AFTER)
5298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
5308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               for (i = 0; i < row_width; i++)
5318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               {
5328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  *dp++ = *sp++;
5338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  sp++;
5348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               }
5358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
5368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            /* This converts from XG or AG to G */
5378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            else
5388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
5398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               for (i = 0; i < row_width; i++)
5408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               {
5418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  sp++;
5428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  *dp++ = *sp++;
5438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               }
5448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
5458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            row_info->pixel_depth = 8;
5468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            row_info->rowbytes = row_width;
5478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
5488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         else /* if (row_info->bit_depth == 16) */
5498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
5508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (flags & PNG_FLAG_FILLER_AFTER)
5518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
5528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               /* This converts from GGXX or GGAA to GG */
5538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               sp += 4; dp += 2;
5548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               for (i = 1; i < row_width; i++)
5558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               {
5568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  *dp++ = *sp++;
5578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  *dp++ = *sp++;
5588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  sp += 2;
5598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               }
5608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
5618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            else
5628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
5638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               /* This converts from XXGG or AAGG to GG */
5648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               for (i = 0; i < row_width; i++)
5658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               {
5668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  sp += 2;
5678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  *dp++ = *sp++;
5688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                  *dp++ = *sp++;
5698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               }
5708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
5718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            row_info->pixel_depth = 16;
5728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            row_info->rowbytes = row_width * 2;
5738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
5748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         row_info->channels = 1;
5758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
5768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (flags & PNG_FLAG_STRIP_ALPHA)
5778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        row_info->color_type &= ~PNG_COLOR_MASK_ALPHA;
5788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
5798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
5808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
5818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
583c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner/* Swaps red and blue bytes within a pixel */
5848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */
5858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_do_bgr(png_row_infop row_info, png_bytep row)
5868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
587c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_debug(1, "in png_do_bgr");
588c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
5898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   if (
590c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_USELESS_TESTS_SUPPORTED
5918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       row != NULL && row_info != NULL &&
5928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
5938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       (row_info->color_type & PNG_COLOR_MASK_COLOR))
5948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   {
5958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_uint_32 row_width = row_info->width;
5968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (row_info->bit_depth == 8)
5978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
5988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (row_info->color_type == PNG_COLOR_TYPE_RGB)
5998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
6008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_bytep rp;
6018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_uint_32 i;
6028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            for (i = 0, rp = row; i < row_width; i++, rp += 3)
6048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
6058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_byte save = *rp;
6068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               *rp = *(rp + 2);
6078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               *(rp + 2) = save;
6088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
6098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
6108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
6118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
6128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_bytep rp;
6138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_uint_32 i;
6148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            for (i = 0, rp = row; i < row_width; i++, rp += 4)
6168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
6178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_byte save = *rp;
6188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               *rp = *(rp + 2);
6198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               *(rp + 2) = save;
6208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
6218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
6228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
6238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      else if (row_info->bit_depth == 16)
6248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      {
6258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         if (row_info->color_type == PNG_COLOR_TYPE_RGB)
6268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
6278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_bytep rp;
6288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_uint_32 i;
6298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            for (i = 0, rp = row; i < row_width; i++, rp += 6)
6318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
6328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_byte save = *rp;
6338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               *rp = *(rp + 4);
6348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               *(rp + 4) = save;
6358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               save = *(rp + 1);
6368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               *(rp + 1) = *(rp + 5);
6378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               *(rp + 5) = save;
6388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
6398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
6408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
6418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         {
6428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_bytep rp;
6438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            png_uint_32 i;
6448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            for (i = 0, rp = row; i < row_width; i++, rp += 8)
6468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
6478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               png_byte save = *rp;
6488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               *rp = *(rp + 4);
6498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               *(rp + 4) = save;
6508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               save = *(rp + 1);
6518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               *(rp + 1) = *(rp + 5);
6528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               *(rp + 5) = save;
6538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
6548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         }
6558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      }
6568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   }
6578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
6588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */
6598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
661c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner    defined(PNG_LEGACY_SUPPORTED) || \
662c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner    defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
6638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI
6648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_user_transform_info(png_structp png_ptr, png_voidp
6658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   user_transform_ptr, int user_transform_depth, int user_transform_channels)
6668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
667c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   png_debug(1, "in png_set_user_transform_info");
668c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner
669c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_ptr == NULL)
670c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      return;
671c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED
6728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->user_transform_ptr = user_transform_ptr;
6738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->user_transform_depth = (png_byte)user_transform_depth;
6748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   png_ptr->user_transform_channels = (png_byte)user_transform_channels;
6758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
676c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (user_transform_ptr || user_transform_depth || user_transform_channels)
6778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      png_warning(png_ptr,
6788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        "This version of libpng does not support user transform info");
6798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
6808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
6818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
6828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* This function returns a pointer to the user_transform_ptr associated with
6848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * the user transform functions.  The application should free any memory
6858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * associated with this pointer before png_write_destroy and png_read_destroy
6868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * are called.
6878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
6888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_voidp PNGAPI
6898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_get_user_transform_ptr(png_structp png_ptr)
6908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
691c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner   if (png_ptr == NULL)
692c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner      return (NULL);
693c7702eb5df5f3e72ceedfcd5fb60b94c0a945934David 'Digit' Turner#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED
6948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   return ((png_voidp)png_ptr->user_transform_ptr);
6958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
6968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   return (NULL);
6978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
6988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
6998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */
700