1893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
2893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* pngtrans.c - transforms the data in a row (used by both readers and writers)
3893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *
4b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari * Last changed in libpng 1.6.9 [February 6, 2014]
5b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari * Copyright (c) 1998-2014 Glenn Randers-Pehrson
6893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
7893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
8a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott *
9a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * This code is released under the libpng license.
10a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * For conditions of distribution and use, see the disclaimer
11a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * and license in png.h
12893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
13893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
14b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#include "pngpriv.h"
15b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
16893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
174215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project
18893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
19a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* Turn on BGR-to-RGB mapping */
20893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
21b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_set_bgr(png_structrp png_ptr)
22893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
234215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_set_bgr");
245f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
25a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL)
26a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
27b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
28893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->transformations |= PNG_BGR;
29893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
30893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
31893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
32893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
33a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* Turn on 16 bit byte swapping */
34893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
35b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_set_swap(png_structrp png_ptr)
36893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
374215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_set_swap");
385f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
39a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL)
40a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
41b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
42893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->bit_depth == 16)
43893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->transformations |= PNG_SWAP_BYTES;
44893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
45893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
46893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
47893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED)
48a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* Turn on pixel packing */
49893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
50b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_set_packing(png_structrp png_ptr)
51893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
524215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_set_packing");
535f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
54a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL)
55a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
56b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
57893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->bit_depth < 8)
58893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
59893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->transformations |= PNG_PACK;
60b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#     ifdef PNG_WRITE_SUPPORTED
61b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari         png_ptr->usr_bit_depth = 8;
62b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#     endif
63893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
64893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
65893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
66893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
67893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
68a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* Turn on packed pixel swapping */
69893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
70b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_set_packswap(png_structrp png_ptr)
71893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
724215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_set_packswap");
735f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
74a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL)
75a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
76b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
77893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->bit_depth < 8)
78893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->transformations |= PNG_PACKSWAP;
79893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
80893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
81893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
82893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED)
83893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
84b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_set_shift(png_structrp png_ptr, png_const_color_8p true_bits)
85893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
864215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_set_shift");
875f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
88a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL)
89a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
90b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
91893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->transformations |= PNG_SHIFT;
92893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->shift = *true_bits;
93893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
94893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
95893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
96893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_INTERLACING_SUPPORTED) || \
97893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    defined(PNG_WRITE_INTERLACING_SUPPORTED)
98893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectint PNGAPI
99b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_set_interlace_handling(png_structrp png_ptr)
100893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
1014215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_set_interlace handling");
1025f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
103893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr && png_ptr->interlaced)
104893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
105893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->transformations |= PNG_INTERLACE;
106893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return (7);
107893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
108893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
109893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   return (1);
110893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
111893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
112893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
113893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)
114893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Add a filler byte on read, or remove a filler or alpha byte on write.
115893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * The filler type has changed in v0.95 to allow future 2-byte fillers
116893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * for 48-bit input data, as well as to avoid problems with some compilers
117893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * that don't like bytes as parameters.
118893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
119893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
120b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_set_filler(png_structrp png_ptr, png_uint_32 filler, int filler_loc)
121893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
1224215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_set_filler");
1235f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
124a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL)
125a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
126893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
127b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* In libpng 1.6 it is possible to determine whether this is a read or write
128b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * operation and therefore to do more checking here for a valid call.
129b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    */
130b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (png_ptr->mode & PNG_IS_READ_STRUCT)
131893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
132b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#     ifdef PNG_READ_FILLER_SUPPORTED
133b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         /* On read png_set_filler is always valid, regardless of the base PNG
134b50c217251b086440efcdb273c22f86a06c80cbaChris Craik          * format, because other transformations can give a format where the
135b50c217251b086440efcdb273c22f86a06c80cbaChris Craik          * filler code can execute (basically an 8 or 16-bit component RGB or G
136b50c217251b086440efcdb273c22f86a06c80cbaChris Craik          * format.)
137b50c217251b086440efcdb273c22f86a06c80cbaChris Craik          *
138b50c217251b086440efcdb273c22f86a06c80cbaChris Craik          * NOTE: usr_channels is not used by the read code!  (This has led to
139b50c217251b086440efcdb273c22f86a06c80cbaChris Craik          * confusion in the past.)  The filler is only used in the read code.
140b50c217251b086440efcdb273c22f86a06c80cbaChris Craik          */
141b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         png_ptr->filler = (png_uint_16)filler;
142b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#     else
143b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         png_app_error(png_ptr, "png_set_filler not supported on read");
144b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         PNG_UNUSED(filler) /* not used in the write case */
145b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         return;
146b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#     endif
147893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
148893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
149b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   else /* write */
150893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
151b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#     ifdef PNG_WRITE_FILLER_SUPPORTED
152b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         /* On write the usr_channels parameter must be set correctly at the
153b50c217251b086440efcdb273c22f86a06c80cbaChris Craik          * start to record the number of channels in the app-supplied data.
154b50c217251b086440efcdb273c22f86a06c80cbaChris Craik          */
155b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         switch (png_ptr->color_type)
156b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         {
157b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            case PNG_COLOR_TYPE_RGB:
158b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               png_ptr->usr_channels = 4;
159b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               break;
160b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
161b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            case PNG_COLOR_TYPE_GRAY:
162b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               if (png_ptr->bit_depth >= 8)
163b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               {
164b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                  png_ptr->usr_channels = 2;
165b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                  break;
166b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               }
167b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
168b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               else
169b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               {
170b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                  /* There simply isn't any code in libpng to strip out bits
171b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                   * from bytes when the components are less than a byte in
172b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                   * size!
173b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                   */
174b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                  png_app_error(png_ptr,
175b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                     "png_set_filler is invalid for low bit depth gray output");
176b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                  return;
177b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               }
178b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
179b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            default:
180b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               png_app_error(png_ptr,
181b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                  "png_set_filler: inappropriate color type");
182b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               return;
183b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         }
184b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#     else
185b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         png_app_error(png_ptr, "png_set_filler not supported on write");
186b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         return;
187b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#     endif
188893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
189b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
190b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* Here on success - libpng supports the operation, set the transformation
191b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * and the flag to say where the filler channel is.
192b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    */
193b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_ptr->transformations |= PNG_FILLER;
194b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
195b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (filler_loc == PNG_FILLER_AFTER)
196b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_ptr->flags |= PNG_FLAG_FILLER_AFTER;
197b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
198b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   else
199b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER;
200893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
201893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
202893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Added to libpng-1.2.7 */
203893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
204b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_set_add_alpha(png_structrp png_ptr, png_uint_32 filler, int filler_loc)
205893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
2064215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_set_add_alpha");
2075f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
208a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL)
209a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
210b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
211893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_set_filler(png_ptr, filler, filler_loc);
212b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* The above may fail to do anything. */
213b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (png_ptr->transformations & PNG_FILLER)
214b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_ptr->transformations |= PNG_ADD_ALPHA;
215893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
216893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
217893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
218893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
219893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \
220893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
221893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
222b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_set_swap_alpha(png_structrp png_ptr)
223893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
2244215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_set_swap_alpha");
2255f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
226a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL)
227a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
228b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
229893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->transformations |= PNG_SWAP_ALPHA;
230893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
231893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
232893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
233893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \
234893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
235893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
236b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_set_invert_alpha(png_structrp png_ptr)
237893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
2384215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_set_invert_alpha");
2395f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
240a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL)
241a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
242b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
243893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->transformations |= PNG_INVERT_ALPHA;
244893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
245893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
246893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
247893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED)
248893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
249b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_set_invert_mono(png_structrp png_ptr)
250893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
2514215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_set_invert_mono");
2525f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
253a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL)
254a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
255b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
256893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->transformations |= PNG_INVERT_MONO;
257893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
258893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
259a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* Invert monochrome grayscale data */
260893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
261893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_do_invert(png_row_infop row_info, png_bytep row)
262893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
2634215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_do_invert");
2645f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
265893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  /* This test removed from libpng version 1.0.13 and 1.2.0:
266893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   *   if (row_info->bit_depth == 1 &&
267893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   */
268893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (row_info->color_type == PNG_COLOR_TYPE_GRAY)
269893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
270893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_bytep rp = row;
271b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_size_t i;
272b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_size_t istop = row_info->rowbytes;
273893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
274893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      for (i = 0; i < istop; i++)
275893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
276893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         *rp = (png_byte)(~(*rp));
277893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         rp++;
278893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
279893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
280b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
281893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
282893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      row_info->bit_depth == 8)
283893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
284893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_bytep rp = row;
285b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_size_t i;
286b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_size_t istop = row_info->rowbytes;
287893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
288b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      for (i = 0; i < istop; i += 2)
289893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
290893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         *rp = (png_byte)(~(*rp));
291b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         rp += 2;
292893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
293893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
294b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
295b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_16BIT_SUPPORTED
296893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
297893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      row_info->bit_depth == 16)
298893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
299893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_bytep rp = row;
300b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_size_t i;
301b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_size_t istop = row_info->rowbytes;
302893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
303b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      for (i = 0; i < istop; i += 4)
304893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
305893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         *rp = (png_byte)(~(*rp));
306b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         *(rp + 1) = (png_byte)(~(*(rp + 1)));
307b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         rp += 4;
308893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
309893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
310b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
311893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
312893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
313893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
314b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_16BIT_SUPPORTED
315893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
316a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* Swaps byte order on 16 bit depth images */
317893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
318893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_do_swap(png_row_infop row_info, png_bytep row)
319893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
3204215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_do_swap");
3215f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
322b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (row_info->bit_depth == 16)
323893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
324893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_bytep rp = row;
325893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_uint_32 i;
326893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_uint_32 istop= row_info->width * row_info->channels;
327893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
328893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      for (i = 0; i < istop; i++, rp += 2)
329893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
330893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_byte t = *rp;
331893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         *rp = *(rp + 1);
332893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         *(rp + 1) = t;
333893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
334893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
335893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
336893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
337b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
338893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
339893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
340893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic PNG_CONST png_byte onebppswaptable[256] = {
341893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,
342893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
343893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8,
344893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
345893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4,
346893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
347893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC,
348893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
349893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2,
350893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
351893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA,
352893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
353893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6,
354893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
355893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE,
356893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
357893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1,
358893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
359893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9,
360893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
361893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5,
362893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
363893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED,
364893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
365893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3,
366893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
367893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB,
368893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
369893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7,
370893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
371893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF,
372893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
373893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project};
374893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
375893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic PNG_CONST png_byte twobppswaptable[256] = {
376893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x00, 0x40, 0x80, 0xC0, 0x10, 0x50, 0x90, 0xD0,
377893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x20, 0x60, 0xA0, 0xE0, 0x30, 0x70, 0xB0, 0xF0,
378893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x04, 0x44, 0x84, 0xC4, 0x14, 0x54, 0x94, 0xD4,
379893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x24, 0x64, 0xA4, 0xE4, 0x34, 0x74, 0xB4, 0xF4,
380893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x08, 0x48, 0x88, 0xC8, 0x18, 0x58, 0x98, 0xD8,
381893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x28, 0x68, 0xA8, 0xE8, 0x38, 0x78, 0xB8, 0xF8,
382893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0C, 0x4C, 0x8C, 0xCC, 0x1C, 0x5C, 0x9C, 0xDC,
383893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x2C, 0x6C, 0xAC, 0xEC, 0x3C, 0x7C, 0xBC, 0xFC,
384893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x01, 0x41, 0x81, 0xC1, 0x11, 0x51, 0x91, 0xD1,
385893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x21, 0x61, 0xA1, 0xE1, 0x31, 0x71, 0xB1, 0xF1,
386893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x05, 0x45, 0x85, 0xC5, 0x15, 0x55, 0x95, 0xD5,
387893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x25, 0x65, 0xA5, 0xE5, 0x35, 0x75, 0xB5, 0xF5,
388893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x09, 0x49, 0x89, 0xC9, 0x19, 0x59, 0x99, 0xD9,
389893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x29, 0x69, 0xA9, 0xE9, 0x39, 0x79, 0xB9, 0xF9,
390893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0D, 0x4D, 0x8D, 0xCD, 0x1D, 0x5D, 0x9D, 0xDD,
391893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x2D, 0x6D, 0xAD, 0xED, 0x3D, 0x7D, 0xBD, 0xFD,
392893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x02, 0x42, 0x82, 0xC2, 0x12, 0x52, 0x92, 0xD2,
393893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x22, 0x62, 0xA2, 0xE2, 0x32, 0x72, 0xB2, 0xF2,
394893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x06, 0x46, 0x86, 0xC6, 0x16, 0x56, 0x96, 0xD6,
395893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x26, 0x66, 0xA6, 0xE6, 0x36, 0x76, 0xB6, 0xF6,
396893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0A, 0x4A, 0x8A, 0xCA, 0x1A, 0x5A, 0x9A, 0xDA,
397893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x2A, 0x6A, 0xAA, 0xEA, 0x3A, 0x7A, 0xBA, 0xFA,
398893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0E, 0x4E, 0x8E, 0xCE, 0x1E, 0x5E, 0x9E, 0xDE,
399893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x2E, 0x6E, 0xAE, 0xEE, 0x3E, 0x7E, 0xBE, 0xFE,
400893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x03, 0x43, 0x83, 0xC3, 0x13, 0x53, 0x93, 0xD3,
401893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x23, 0x63, 0xA3, 0xE3, 0x33, 0x73, 0xB3, 0xF3,
402893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x07, 0x47, 0x87, 0xC7, 0x17, 0x57, 0x97, 0xD7,
403893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x27, 0x67, 0xA7, 0xE7, 0x37, 0x77, 0xB7, 0xF7,
404893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0B, 0x4B, 0x8B, 0xCB, 0x1B, 0x5B, 0x9B, 0xDB,
405893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x2B, 0x6B, 0xAB, 0xEB, 0x3B, 0x7B, 0xBB, 0xFB,
406893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0F, 0x4F, 0x8F, 0xCF, 0x1F, 0x5F, 0x9F, 0xDF,
407893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x2F, 0x6F, 0xAF, 0xEF, 0x3F, 0x7F, 0xBF, 0xFF
408893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project};
409893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
410893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic PNG_CONST png_byte fourbppswaptable[256] = {
411893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70,
412893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0,
413893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71,
414893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1,
415893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72,
416893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x82, 0x92, 0xA2, 0xB2, 0xC2, 0xD2, 0xE2, 0xF2,
417893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73,
418893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x83, 0x93, 0xA3, 0xB3, 0xC3, 0xD3, 0xE3, 0xF3,
419893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74,
420893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x84, 0x94, 0xA4, 0xB4, 0xC4, 0xD4, 0xE4, 0xF4,
421893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75,
422893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x85, 0x95, 0xA5, 0xB5, 0xC5, 0xD5, 0xE5, 0xF5,
423893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76,
424893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x86, 0x96, 0xA6, 0xB6, 0xC6, 0xD6, 0xE6, 0xF6,
425893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77,
426893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x87, 0x97, 0xA7, 0xB7, 0xC7, 0xD7, 0xE7, 0xF7,
427893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78,
428893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x88, 0x98, 0xA8, 0xB8, 0xC8, 0xD8, 0xE8, 0xF8,
429893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79,
430893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, 0xE9, 0xF9,
431893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0A, 0x1A, 0x2A, 0x3A, 0x4A, 0x5A, 0x6A, 0x7A,
432893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x8A, 0x9A, 0xAA, 0xBA, 0xCA, 0xDA, 0xEA, 0xFA,
433893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0B, 0x1B, 0x2B, 0x3B, 0x4B, 0x5B, 0x6B, 0x7B,
434893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x8B, 0x9B, 0xAB, 0xBB, 0xCB, 0xDB, 0xEB, 0xFB,
435893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0C, 0x1C, 0x2C, 0x3C, 0x4C, 0x5C, 0x6C, 0x7C,
436893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x8C, 0x9C, 0xAC, 0xBC, 0xCC, 0xDC, 0xEC, 0xFC,
437893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0D, 0x1D, 0x2D, 0x3D, 0x4D, 0x5D, 0x6D, 0x7D,
438893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x8D, 0x9D, 0xAD, 0xBD, 0xCD, 0xDD, 0xED, 0xFD,
439893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0E, 0x1E, 0x2E, 0x3E, 0x4E, 0x5E, 0x6E, 0x7E,
440893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x8E, 0x9E, 0xAE, 0xBE, 0xCE, 0xDE, 0xEE, 0xFE,
441893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0F, 0x1F, 0x2F, 0x3F, 0x4F, 0x5F, 0x6F, 0x7F,
442893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF
443893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project};
444893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
445a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* Swaps pixel packing order within bytes */
446893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
447893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_do_packswap(png_row_infop row_info, png_bytep row)
448893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
4494215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_do_packswap");
4505f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
451b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (row_info->bit_depth < 8)
452893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
453b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_bytep rp;
454b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_const_bytep end, table;
455893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
456893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      end = row + row_info->rowbytes;
457893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
458893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (row_info->bit_depth == 1)
459b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         table = onebppswaptable;
460b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
461893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else if (row_info->bit_depth == 2)
462b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         table = twobppswaptable;
463b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
464893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else if (row_info->bit_depth == 4)
465b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         table = fourbppswaptable;
466b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
467893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else
468893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
469893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
470893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      for (rp = row; rp < end; rp++)
471893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         *rp = table[*rp];
472893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
473893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
474893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_READ_PACKSWAP_SUPPORTED or PNG_WRITE_PACKSWAP_SUPPORTED */
475893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
476893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_FILLER_SUPPORTED) || \
477893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
478b50c217251b086440efcdb273c22f86a06c80cbaChris Craik/* Remove a channel - this used to be 'png_do_strip_filler' but it used a
479b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * somewhat weird combination of flags to determine what to do.  All the calls
480b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * to png_do_strip_filler are changed in 1.5.2 to call this instead with the
481b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * correct arguments.
482b50c217251b086440efcdb273c22f86a06c80cbaChris Craik *
483b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * The routine isn't general - the channel must be the channel at the start or
484b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * end (not in the middle) of each pixel.
485b50c217251b086440efcdb273c22f86a06c80cbaChris Craik */
486893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
487b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_do_strip_channel(png_row_infop row_info, png_bytep row, int at_start)
488893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
489b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_bytep sp = row; /* source pointer */
490b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_bytep dp = row; /* destination pointer */
491b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_bytep ep = row + row_info->rowbytes; /* One beyond end of row */
492b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
493b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* At the start sp will point to the first byte to copy and dp to where
494b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * it is copied to.  ep always points just beyond the end of the row, so
495b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * the loop simply copies (channels-1) channels until sp reaches ep.
496b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    *
497b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * at_start:        0 -- convert AG, XG, ARGB, XRGB, AAGG, XXGG, etc.
498b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    *            nonzero -- convert GA, GX, RGBA, RGBX, GGAA, RRGGBBXX, etc.
499b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    */
500b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
501b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* GA, GX, XG cases */
502b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (row_info->channels == 2)
503893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
504b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      if (row_info->bit_depth == 8)
505b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      {
506b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         if (at_start) /* Skip initial filler */
507b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            ++sp;
508b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         else          /* Skip initial channel and, for sp, the filler */
509b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            sp += 2, ++dp;
510b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
511b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         /* For a 1 pixel wide image there is nothing to do */
512b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         while (sp < ep)
513b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            *dp++ = *sp, sp += 2;
514b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
515b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         row_info->pixel_depth = 8;
516b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      }
517893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
518b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      else if (row_info->bit_depth == 16)
519893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
520b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         if (at_start) /* Skip initial filler */
521b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            sp += 2;
522b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         else          /* Skip initial channel and, for sp, the filler */
523b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            sp += 4, dp += 2;
524b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
525b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         while (sp < ep)
526b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            *dp++ = *sp++, *dp++ = *sp, sp += 3;
527b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
528b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         row_info->pixel_depth = 16;
529893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
530b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
531b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      else
532b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         return; /* bad bit depth */
533b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
534b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      row_info->channels = 1;
535b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
536b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      /* Finally fix the color type if it records an alpha channel */
537b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
538b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         row_info->color_type = PNG_COLOR_TYPE_GRAY;
539b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   }
540b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
541b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* RGBA, RGBX, XRGB cases */
542b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   else if (row_info->channels == 4)
543b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   {
544b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      if (row_info->bit_depth == 8)
545893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
546b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         if (at_start) /* Skip initial filler */
547b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            ++sp;
548b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         else          /* Skip initial channels and, for sp, the filler */
549b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            sp += 4, dp += 3;
550b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
551b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         /* Note that the loop adds 3 to dp and 4 to sp each time. */
552b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         while (sp < ep)
553b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            *dp++ = *sp++, *dp++ = *sp++, *dp++ = *sp, sp += 2;
554b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
555b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         row_info->pixel_depth = 24;
556b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      }
557b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
558b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      else if (row_info->bit_depth == 16)
559b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      {
560b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         if (at_start) /* Skip initial filler */
561b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            sp += 2;
562b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         else          /* Skip initial channels and, for sp, the filler */
563b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            sp += 8, dp += 6;
564b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
565b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         while (sp < ep)
566893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
567b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            /* Copy 6 bytes, skip 2 */
568b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            *dp++ = *sp++, *dp++ = *sp++;
569b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            *dp++ = *sp++, *dp++ = *sp++;
570b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            *dp++ = *sp++, *dp++ = *sp, sp += 3;
571893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
572b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
573b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         row_info->pixel_depth = 48;
574893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
575b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
576b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      else
577b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         return; /* bad bit depth */
578b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
579b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      row_info->channels = 3;
580b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
581b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      /* Finally fix the color type if it records an alpha channel */
582b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
583b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         row_info->color_type = PNG_COLOR_TYPE_RGB;
584893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
585b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
586b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   else
587b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      return; /* The filler channel has gone already */
588b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
589b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* Fix the rowbytes value. */
590b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   row_info->rowbytes = dp-row;
591893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
592893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
593893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
594893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
595a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* Swaps red and blue bytes within a pixel */
596893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
597893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_do_bgr(png_row_infop row_info, png_bytep row)
598893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
5994215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_do_bgr");
6005f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
601b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if ((row_info->color_type & PNG_COLOR_MASK_COLOR))
602893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
603893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_uint_32 row_width = row_info->width;
604893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (row_info->bit_depth == 8)
605893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
606893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (row_info->color_type == PNG_COLOR_TYPE_RGB)
607893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
608893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_bytep rp;
609893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_uint_32 i;
610893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
611893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0, rp = row; i < row_width; i++, rp += 3)
612893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
613893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_byte save = *rp;
614893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *rp = *(rp + 2);
615893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(rp + 2) = save;
616893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
617893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
618b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
619893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
620893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
621893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_bytep rp;
622893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_uint_32 i;
623893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
624893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0, rp = row; i < row_width; i++, rp += 4)
625893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
626893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_byte save = *rp;
627893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *rp = *(rp + 2);
628893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(rp + 2) = save;
629893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
630893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
631893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
632b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
633b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_16BIT_SUPPORTED
634893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else if (row_info->bit_depth == 16)
635893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
636893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (row_info->color_type == PNG_COLOR_TYPE_RGB)
637893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
638893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_bytep rp;
639893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_uint_32 i;
640893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
641893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0, rp = row; i < row_width; i++, rp += 6)
642893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
643893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_byte save = *rp;
644893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *rp = *(rp + 4);
645893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(rp + 4) = save;
646893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               save = *(rp + 1);
647893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(rp + 1) = *(rp + 5);
648893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(rp + 5) = save;
649893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
650893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
651b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
652893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
653893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
654893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_bytep rp;
655893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_uint_32 i;
656893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
657893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0, rp = row; i < row_width; i++, rp += 8)
658893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
659893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_byte save = *rp;
660893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *rp = *(rp + 4);
661893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(rp + 4) = save;
662893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               save = *(rp + 1);
663893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(rp + 1) = *(rp + 5);
664893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(rp + 5) = save;
665893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
666893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
667893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
668b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
669893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
670893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
671893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */
672893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
673b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#if defined(PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED) || \
674b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    defined(PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED)
675b50c217251b086440efcdb273c22f86a06c80cbaChris Craik/* Added at libpng-1.5.10 */
676b50c217251b086440efcdb273c22f86a06c80cbaChris Craikvoid /* PRIVATE */
677b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_do_check_palette_indexes(png_structrp png_ptr, png_row_infop row_info)
678b50c217251b086440efcdb273c22f86a06c80cbaChris Craik{
679b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (png_ptr->num_palette < (1 << row_info->bit_depth) &&
680b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_ptr->num_palette > 0) /* num_palette can be 0 in MNG files */
681b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   {
682b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      /* Calculations moved outside switch in an attempt to stop different
683b50c217251b086440efcdb273c22f86a06c80cbaChris Craik       * compiler warnings.  'padding' is in *bits* within the last byte, it is
684b50c217251b086440efcdb273c22f86a06c80cbaChris Craik       * an 'int' because pixel_depth becomes an 'int' in the expression below,
685b50c217251b086440efcdb273c22f86a06c80cbaChris Craik       * and this calculation is used because it avoids warnings that other
686b50c217251b086440efcdb273c22f86a06c80cbaChris Craik       * forms produced on either GCC or MSVC.
687b50c217251b086440efcdb273c22f86a06c80cbaChris Craik       */
688b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      int padding = (-row_info->pixel_depth * row_info->width) & 7;
689b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_bytep rp = png_ptr->row_buf + row_info->rowbytes;
690b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
691b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      switch (row_info->bit_depth)
692b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      {
693b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         case 1:
694b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         {
695b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            /* in this case, all bytes must be 0 so we don't need
696b50c217251b086440efcdb273c22f86a06c80cbaChris Craik             * to unpack the pixels except for the rightmost one.
697b50c217251b086440efcdb273c22f86a06c80cbaChris Craik             */
698b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            for (; rp > png_ptr->row_buf; rp--)
699b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            {
700b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              if (*rp >> padding != 0)
701b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                 png_ptr->num_palette_max = 1;
702b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              padding = 0;
703b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            }
704b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
705b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            break;
706b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         }
707b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
708b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         case 2:
709b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         {
710b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            for (; rp > png_ptr->row_buf; rp--)
711b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            {
712b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              int i = ((*rp >> padding) & 0x03);
713b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
714b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              if (i > png_ptr->num_palette_max)
715b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                 png_ptr->num_palette_max = i;
716b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
717b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              i = (((*rp >> padding) >> 2) & 0x03);
718b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
719b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              if (i > png_ptr->num_palette_max)
720b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                 png_ptr->num_palette_max = i;
721b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
722b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              i = (((*rp >> padding) >> 4) & 0x03);
723b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
724b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              if (i > png_ptr->num_palette_max)
725b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                 png_ptr->num_palette_max = i;
726b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
727b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              i = (((*rp >> padding) >> 6) & 0x03);
728b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
729b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              if (i > png_ptr->num_palette_max)
730b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                 png_ptr->num_palette_max = i;
731b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
732b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              padding = 0;
733b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            }
734b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
735b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            break;
736b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         }
737b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
738b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         case 4:
739b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         {
740b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            for (; rp > png_ptr->row_buf; rp--)
741b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            {
742b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              int i = ((*rp >> padding) & 0x0f);
743b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
744b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              if (i > png_ptr->num_palette_max)
745b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                 png_ptr->num_palette_max = i;
746b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
747b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              i = (((*rp >> padding) >> 4) & 0x0f);
748b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
749b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              if (i > png_ptr->num_palette_max)
750b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                 png_ptr->num_palette_max = i;
751b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
752b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              padding = 0;
753b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            }
754b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
755b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            break;
756b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         }
757b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
758b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         case 8:
759b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         {
760b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            for (; rp > png_ptr->row_buf; rp--)
761b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            {
762b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               if (*rp > png_ptr->num_palette_max)
763b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                  png_ptr->num_palette_max = (int) *rp;
764b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            }
765b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
766b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            break;
767b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         }
768b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
769b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         default:
770b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            break;
771b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      }
772b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   }
773b50c217251b086440efcdb273c22f86a06c80cbaChris Craik}
774b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif /* PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED */
775b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
776893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
777a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
778b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED
779893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
780b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_set_user_transform_info(png_structrp png_ptr, png_voidp
781893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   user_transform_ptr, int user_transform_depth, int user_transform_channels)
782893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
7834215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_set_user_transform_info");
7845f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
785a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL)
786a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
787b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
788b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED
789b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0 &&
790b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      (png_ptr->flags & PNG_FLAG_ROW_INIT) != 0)
791b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   {
792b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_app_error(png_ptr,
793b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            "info change after png_start_read_image or png_read_update_info");
794b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      return;
795b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   }
796b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
797b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
798893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->user_transform_ptr = user_transform_ptr;
799893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->user_transform_depth = (png_byte)user_transform_depth;
800893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->user_transform_channels = (png_byte)user_transform_channels;
801893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
802893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
803893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
804893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* This function returns a pointer to the user_transform_ptr associated with
805893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * the user transform functions.  The application should free any memory
806893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * associated with this pointer before png_write_destroy and png_read_destroy
807893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * are called.
808893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
809b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED
810893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_voidp PNGAPI
811b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_get_user_transform_ptr(png_const_structrp png_ptr)
812893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
813a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL)
814a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return (NULL);
815b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
816b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   return png_ptr->user_transform_ptr;
817b50c217251b086440efcdb273c22f86a06c80cbaChris Craik}
818893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
819b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
820b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_USER_TRANSFORM_INFO_SUPPORTED
821b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_uint_32 PNGAPI
822b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_get_current_row_number(png_const_structrp png_ptr)
823b50c217251b086440efcdb273c22f86a06c80cbaChris Craik{
824b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* See the comments in png.h - this is the sub-image row when reading and
825b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * interlaced image.
826b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    */
827b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (png_ptr != NULL)
828b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      return png_ptr->row_number;
829b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
830b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   return PNG_UINT_32_MAX; /* help the app not to fail silently */
831b50c217251b086440efcdb273c22f86a06c80cbaChris Craik}
832b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
833b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_byte PNGAPI
834b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_get_current_pass_number(png_const_structrp png_ptr)
835b50c217251b086440efcdb273c22f86a06c80cbaChris Craik{
836b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (png_ptr != NULL)
837b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      return png_ptr->pass;
838b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   return 8; /* invalid */
839893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
840b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif /* PNG_USER_TRANSFORM_INFO_SUPPORTED */
841b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif /* PNG_READ_USER_TRANSFORM_SUPPORTED ||
842b50c217251b086440efcdb273c22f86a06c80cbaChris Craik          PNG_WRITE_USER_TRANSFORM_SUPPORTED */
843893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */
844