pngtrans.c revision b50c217251b086440efcdb273c22f86a06c80cba
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 *
4b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * Last changed in libpng 1.6.2 [April 25, 2013]
5b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * Copyright (c) 1998-2013 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;
60893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->usr_bit_depth = 8;
61893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
62893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
63893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
64893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
65893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
66a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* Turn on packed pixel swapping */
67893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
68b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_set_packswap(png_structrp png_ptr)
69893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
704215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_set_packswap");
715f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
72a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL)
73a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
74b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
75893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->bit_depth < 8)
76893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->transformations |= PNG_PACKSWAP;
77893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
78893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
79893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
80893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED)
81893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
82b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_set_shift(png_structrp png_ptr, png_const_color_8p true_bits)
83893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
844215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_set_shift");
855f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
86a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL)
87a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
88b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
89893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->transformations |= PNG_SHIFT;
90893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->shift = *true_bits;
91893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
92893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
93893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
94893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_INTERLACING_SUPPORTED) || \
95893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    defined(PNG_WRITE_INTERLACING_SUPPORTED)
96893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectint PNGAPI
97b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_set_interlace_handling(png_structrp png_ptr)
98893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
994215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_set_interlace handling");
1005f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
101893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr && png_ptr->interlaced)
102893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
103893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->transformations |= PNG_INTERLACE;
104893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return (7);
105893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
106893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
107893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   return (1);
108893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
109893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
110893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
111893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)
112893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Add a filler byte on read, or remove a filler or alpha byte on write.
113893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * The filler type has changed in v0.95 to allow future 2-byte fillers
114893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * for 48-bit input data, as well as to avoid problems with some compilers
115893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * that don't like bytes as parameters.
116893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
117893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
118b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_set_filler(png_structrp png_ptr, png_uint_32 filler, int filler_loc)
119893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
1204215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_set_filler");
1215f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
122a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL)
123a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
124893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
125b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* In libpng 1.6 it is possible to determine whether this is a read or write
126b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * operation and therefore to do more checking here for a valid call.
127b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    */
128b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (png_ptr->mode & PNG_IS_READ_STRUCT)
129893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
130b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#     ifdef PNG_READ_FILLER_SUPPORTED
131b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         /* On read png_set_filler is always valid, regardless of the base PNG
132b50c217251b086440efcdb273c22f86a06c80cbaChris Craik          * format, because other transformations can give a format where the
133b50c217251b086440efcdb273c22f86a06c80cbaChris Craik          * filler code can execute (basically an 8 or 16-bit component RGB or G
134b50c217251b086440efcdb273c22f86a06c80cbaChris Craik          * format.)
135b50c217251b086440efcdb273c22f86a06c80cbaChris Craik          *
136b50c217251b086440efcdb273c22f86a06c80cbaChris Craik          * NOTE: usr_channels is not used by the read code!  (This has led to
137b50c217251b086440efcdb273c22f86a06c80cbaChris Craik          * confusion in the past.)  The filler is only used in the read code.
138b50c217251b086440efcdb273c22f86a06c80cbaChris Craik          */
139b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         png_ptr->filler = (png_uint_16)filler;
140b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#     else
141b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         png_app_error(png_ptr, "png_set_filler not supported on read");
142b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         PNG_UNUSED(filler) /* not used in the write case */
143b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         return;
144b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#     endif
145893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
146893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
147b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   else /* write */
148893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
149b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#     ifdef PNG_WRITE_FILLER_SUPPORTED
150b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         /* On write the usr_channels parameter must be set correctly at the
151b50c217251b086440efcdb273c22f86a06c80cbaChris Craik          * start to record the number of channels in the app-supplied data.
152b50c217251b086440efcdb273c22f86a06c80cbaChris Craik          */
153b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         switch (png_ptr->color_type)
154b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         {
155b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            case PNG_COLOR_TYPE_RGB:
156b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               png_ptr->usr_channels = 4;
157b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               break;
158b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
159b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            case PNG_COLOR_TYPE_GRAY:
160b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               if (png_ptr->bit_depth >= 8)
161b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               {
162b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                  png_ptr->usr_channels = 2;
163b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                  break;
164b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               }
165b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
166b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               else
167b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               {
168b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                  /* There simply isn't any code in libpng to strip out bits
169b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                   * from bytes when the components are less than a byte in
170b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                   * size!
171b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                   */
172b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                  png_app_error(png_ptr,
173b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                     "png_set_filler is invalid for low bit depth gray output");
174b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                  return;
175b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               }
176b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
177b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            default:
178b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               png_app_error(png_ptr,
179b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                  "png_set_filler: inappropriate color type");
180b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               return;
181b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         }
182b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#     else
183b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         png_app_error(png_ptr, "png_set_filler not supported on write");
184b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         return;
185b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#     endif
186893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
187b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
188b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* Here on success - libpng supports the operation, set the transformation
189b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * and the flag to say where the filler channel is.
190b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    */
191b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_ptr->transformations |= PNG_FILLER;
192b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
193b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (filler_loc == PNG_FILLER_AFTER)
194b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_ptr->flags |= PNG_FLAG_FILLER_AFTER;
195b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
196b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   else
197b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER;
198893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
199893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
200893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Added to libpng-1.2.7 */
201893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
202b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_set_add_alpha(png_structrp png_ptr, png_uint_32 filler, int filler_loc)
203893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
2044215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_set_add_alpha");
2055f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
206a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL)
207a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
208b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
209893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_set_filler(png_ptr, filler, filler_loc);
210b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* The above may fail to do anything. */
211b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (png_ptr->transformations & PNG_FILLER)
212b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_ptr->transformations |= PNG_ADD_ALPHA;
213893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
214893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
215893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
216893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
217893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \
218893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
219893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
220b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_set_swap_alpha(png_structrp png_ptr)
221893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
2224215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_set_swap_alpha");
2235f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
224a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL)
225a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
226b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
227893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->transformations |= PNG_SWAP_ALPHA;
228893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
229893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
230893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
231893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \
232893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
233893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
234b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_set_invert_alpha(png_structrp png_ptr)
235893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
2364215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_set_invert_alpha");
2375f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
238a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL)
239a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
240b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
241893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->transformations |= PNG_INVERT_ALPHA;
242893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
243893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
244893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
245893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED)
246893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
247b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_set_invert_mono(png_structrp png_ptr)
248893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
2494215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_set_invert_mono");
2505f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
251a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL)
252a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
253b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
254893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->transformations |= PNG_INVERT_MONO;
255893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
256893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
257a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* Invert monochrome grayscale data */
258893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
259893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_do_invert(png_row_infop row_info, png_bytep row)
260893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
2614215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_do_invert");
2625f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
263893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  /* This test removed from libpng version 1.0.13 and 1.2.0:
264893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   *   if (row_info->bit_depth == 1 &&
265893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   */
266893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (row_info->color_type == PNG_COLOR_TYPE_GRAY)
267893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
268893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_bytep rp = row;
269b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_size_t i;
270b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_size_t istop = row_info->rowbytes;
271893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
272893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      for (i = 0; i < istop; i++)
273893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
274893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         *rp = (png_byte)(~(*rp));
275893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         rp++;
276893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
277893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
278b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
279893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
280893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      row_info->bit_depth == 8)
281893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
282893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_bytep rp = row;
283b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_size_t i;
284b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_size_t istop = row_info->rowbytes;
285893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
286b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      for (i = 0; i < istop; i += 2)
287893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
288893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         *rp = (png_byte)(~(*rp));
289b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         rp += 2;
290893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
291893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
292b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
293b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_16BIT_SUPPORTED
294893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
295893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      row_info->bit_depth == 16)
296893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
297893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_bytep rp = row;
298b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_size_t i;
299b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_size_t istop = row_info->rowbytes;
300893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
301b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      for (i = 0; i < istop; i += 4)
302893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
303893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         *rp = (png_byte)(~(*rp));
304b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         *(rp + 1) = (png_byte)(~(*(rp + 1)));
305b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         rp += 4;
306893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
307893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
308b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
309893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
310893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
311893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
312b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_16BIT_SUPPORTED
313893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
314a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* Swaps byte order on 16 bit depth images */
315893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
316893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_do_swap(png_row_infop row_info, png_bytep row)
317893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
3184215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_do_swap");
3195f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
320b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (row_info->bit_depth == 16)
321893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
322893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_bytep rp = row;
323893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_uint_32 i;
324893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_uint_32 istop= row_info->width * row_info->channels;
325893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
326893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      for (i = 0; i < istop; i++, rp += 2)
327893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
328893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_byte t = *rp;
329893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         *rp = *(rp + 1);
330893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         *(rp + 1) = t;
331893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
332893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
333893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
334893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
335b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
336893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
337893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
338893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic PNG_CONST png_byte onebppswaptable[256] = {
339893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,
340893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
341893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8,
342893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
343893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4,
344893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
345893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC,
346893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
347893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2,
348893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
349893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA,
350893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
351893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6,
352893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
353893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE,
354893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
355893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1,
356893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
357893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9,
358893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
359893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5,
360893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
361893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED,
362893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
363893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3,
364893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
365893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB,
366893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
367893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7,
368893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
369893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF,
370893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
371893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project};
372893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
373893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic PNG_CONST png_byte twobppswaptable[256] = {
374893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x00, 0x40, 0x80, 0xC0, 0x10, 0x50, 0x90, 0xD0,
375893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x20, 0x60, 0xA0, 0xE0, 0x30, 0x70, 0xB0, 0xF0,
376893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x04, 0x44, 0x84, 0xC4, 0x14, 0x54, 0x94, 0xD4,
377893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x24, 0x64, 0xA4, 0xE4, 0x34, 0x74, 0xB4, 0xF4,
378893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x08, 0x48, 0x88, 0xC8, 0x18, 0x58, 0x98, 0xD8,
379893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x28, 0x68, 0xA8, 0xE8, 0x38, 0x78, 0xB8, 0xF8,
380893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0C, 0x4C, 0x8C, 0xCC, 0x1C, 0x5C, 0x9C, 0xDC,
381893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x2C, 0x6C, 0xAC, 0xEC, 0x3C, 0x7C, 0xBC, 0xFC,
382893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x01, 0x41, 0x81, 0xC1, 0x11, 0x51, 0x91, 0xD1,
383893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x21, 0x61, 0xA1, 0xE1, 0x31, 0x71, 0xB1, 0xF1,
384893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x05, 0x45, 0x85, 0xC5, 0x15, 0x55, 0x95, 0xD5,
385893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x25, 0x65, 0xA5, 0xE5, 0x35, 0x75, 0xB5, 0xF5,
386893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x09, 0x49, 0x89, 0xC9, 0x19, 0x59, 0x99, 0xD9,
387893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x29, 0x69, 0xA9, 0xE9, 0x39, 0x79, 0xB9, 0xF9,
388893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0D, 0x4D, 0x8D, 0xCD, 0x1D, 0x5D, 0x9D, 0xDD,
389893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x2D, 0x6D, 0xAD, 0xED, 0x3D, 0x7D, 0xBD, 0xFD,
390893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x02, 0x42, 0x82, 0xC2, 0x12, 0x52, 0x92, 0xD2,
391893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x22, 0x62, 0xA2, 0xE2, 0x32, 0x72, 0xB2, 0xF2,
392893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x06, 0x46, 0x86, 0xC6, 0x16, 0x56, 0x96, 0xD6,
393893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x26, 0x66, 0xA6, 0xE6, 0x36, 0x76, 0xB6, 0xF6,
394893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0A, 0x4A, 0x8A, 0xCA, 0x1A, 0x5A, 0x9A, 0xDA,
395893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x2A, 0x6A, 0xAA, 0xEA, 0x3A, 0x7A, 0xBA, 0xFA,
396893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0E, 0x4E, 0x8E, 0xCE, 0x1E, 0x5E, 0x9E, 0xDE,
397893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x2E, 0x6E, 0xAE, 0xEE, 0x3E, 0x7E, 0xBE, 0xFE,
398893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x03, 0x43, 0x83, 0xC3, 0x13, 0x53, 0x93, 0xD3,
399893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x23, 0x63, 0xA3, 0xE3, 0x33, 0x73, 0xB3, 0xF3,
400893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x07, 0x47, 0x87, 0xC7, 0x17, 0x57, 0x97, 0xD7,
401893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x27, 0x67, 0xA7, 0xE7, 0x37, 0x77, 0xB7, 0xF7,
402893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0B, 0x4B, 0x8B, 0xCB, 0x1B, 0x5B, 0x9B, 0xDB,
403893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x2B, 0x6B, 0xAB, 0xEB, 0x3B, 0x7B, 0xBB, 0xFB,
404893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0F, 0x4F, 0x8F, 0xCF, 0x1F, 0x5F, 0x9F, 0xDF,
405893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x2F, 0x6F, 0xAF, 0xEF, 0x3F, 0x7F, 0xBF, 0xFF
406893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project};
407893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
408893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic PNG_CONST png_byte fourbppswaptable[256] = {
409893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70,
410893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0,
411893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71,
412893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1,
413893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72,
414893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x82, 0x92, 0xA2, 0xB2, 0xC2, 0xD2, 0xE2, 0xF2,
415893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73,
416893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x83, 0x93, 0xA3, 0xB3, 0xC3, 0xD3, 0xE3, 0xF3,
417893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74,
418893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x84, 0x94, 0xA4, 0xB4, 0xC4, 0xD4, 0xE4, 0xF4,
419893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75,
420893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x85, 0x95, 0xA5, 0xB5, 0xC5, 0xD5, 0xE5, 0xF5,
421893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76,
422893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x86, 0x96, 0xA6, 0xB6, 0xC6, 0xD6, 0xE6, 0xF6,
423893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77,
424893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x87, 0x97, 0xA7, 0xB7, 0xC7, 0xD7, 0xE7, 0xF7,
425893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78,
426893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x88, 0x98, 0xA8, 0xB8, 0xC8, 0xD8, 0xE8, 0xF8,
427893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79,
428893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, 0xE9, 0xF9,
429893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0A, 0x1A, 0x2A, 0x3A, 0x4A, 0x5A, 0x6A, 0x7A,
430893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x8A, 0x9A, 0xAA, 0xBA, 0xCA, 0xDA, 0xEA, 0xFA,
431893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0B, 0x1B, 0x2B, 0x3B, 0x4B, 0x5B, 0x6B, 0x7B,
432893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x8B, 0x9B, 0xAB, 0xBB, 0xCB, 0xDB, 0xEB, 0xFB,
433893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0C, 0x1C, 0x2C, 0x3C, 0x4C, 0x5C, 0x6C, 0x7C,
434893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x8C, 0x9C, 0xAC, 0xBC, 0xCC, 0xDC, 0xEC, 0xFC,
435893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0D, 0x1D, 0x2D, 0x3D, 0x4D, 0x5D, 0x6D, 0x7D,
436893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x8D, 0x9D, 0xAD, 0xBD, 0xCD, 0xDD, 0xED, 0xFD,
437893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0E, 0x1E, 0x2E, 0x3E, 0x4E, 0x5E, 0x6E, 0x7E,
438893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x8E, 0x9E, 0xAE, 0xBE, 0xCE, 0xDE, 0xEE, 0xFE,
439893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0F, 0x1F, 0x2F, 0x3F, 0x4F, 0x5F, 0x6F, 0x7F,
440893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF
441893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project};
442893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
443a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* Swaps pixel packing order within bytes */
444893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
445893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_do_packswap(png_row_infop row_info, png_bytep row)
446893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
4474215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_do_packswap");
4485f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
449b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (row_info->bit_depth < 8)
450893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
451b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_bytep rp;
452b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_const_bytep end, table;
453893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
454893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      end = row + row_info->rowbytes;
455893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
456893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (row_info->bit_depth == 1)
457b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         table = onebppswaptable;
458b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
459893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else if (row_info->bit_depth == 2)
460b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         table = twobppswaptable;
461b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
462893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else if (row_info->bit_depth == 4)
463b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         table = fourbppswaptable;
464b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
465893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else
466893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
467893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
468893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      for (rp = row; rp < end; rp++)
469893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         *rp = table[*rp];
470893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
471893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
472893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_READ_PACKSWAP_SUPPORTED or PNG_WRITE_PACKSWAP_SUPPORTED */
473893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
474893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_FILLER_SUPPORTED) || \
475893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
476b50c217251b086440efcdb273c22f86a06c80cbaChris Craik/* Remove a channel - this used to be 'png_do_strip_filler' but it used a
477b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * somewhat weird combination of flags to determine what to do.  All the calls
478b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * to png_do_strip_filler are changed in 1.5.2 to call this instead with the
479b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * correct arguments.
480b50c217251b086440efcdb273c22f86a06c80cbaChris Craik *
481b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * The routine isn't general - the channel must be the channel at the start or
482b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * end (not in the middle) of each pixel.
483b50c217251b086440efcdb273c22f86a06c80cbaChris Craik */
484893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
485b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_do_strip_channel(png_row_infop row_info, png_bytep row, int at_start)
486893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
487b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_bytep sp = row; /* source pointer */
488b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_bytep dp = row; /* destination pointer */
489b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   png_bytep ep = row + row_info->rowbytes; /* One beyond end of row */
490b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
491b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* At the start sp will point to the first byte to copy and dp to where
492b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * it is copied to.  ep always points just beyond the end of the row, so
493b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * the loop simply copies (channels-1) channels until sp reaches ep.
494b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    *
495b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * at_start:        0 -- convert AG, XG, ARGB, XRGB, AAGG, XXGG, etc.
496b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    *            nonzero -- convert GA, GX, RGBA, RGBX, GGAA, RRGGBBXX, etc.
497b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    */
498b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
499b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* GA, GX, XG cases */
500b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (row_info->channels == 2)
501893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
502b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      if (row_info->bit_depth == 8)
503b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      {
504b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         if (at_start) /* Skip initial filler */
505b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            ++sp;
506b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         else          /* Skip initial channel and, for sp, the filler */
507b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            sp += 2, ++dp;
508b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
509b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         /* For a 1 pixel wide image there is nothing to do */
510b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         while (sp < ep)
511b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            *dp++ = *sp, sp += 2;
512b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
513b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         row_info->pixel_depth = 8;
514b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      }
515893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
516b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      else if (row_info->bit_depth == 16)
517893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
518b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         if (at_start) /* Skip initial filler */
519b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            sp += 2;
520b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         else          /* Skip initial channel and, for sp, the filler */
521b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            sp += 4, dp += 2;
522b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
523b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         while (sp < ep)
524b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            *dp++ = *sp++, *dp++ = *sp, sp += 3;
525b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
526b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         row_info->pixel_depth = 16;
527893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
528b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
529b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      else
530b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         return; /* bad bit depth */
531b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
532b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      row_info->channels = 1;
533b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
534b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      /* Finally fix the color type if it records an alpha channel */
535b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
536b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         row_info->color_type = PNG_COLOR_TYPE_GRAY;
537b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   }
538b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
539b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* RGBA, RGBX, XRGB cases */
540b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   else if (row_info->channels == 4)
541b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   {
542b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      if (row_info->bit_depth == 8)
543893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
544b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         if (at_start) /* Skip initial filler */
545b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            ++sp;
546b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         else          /* Skip initial channels and, for sp, the filler */
547b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            sp += 4, dp += 3;
548b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
549b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         /* Note that the loop adds 3 to dp and 4 to sp each time. */
550b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         while (sp < ep)
551b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            *dp++ = *sp++, *dp++ = *sp++, *dp++ = *sp, sp += 2;
552b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
553b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         row_info->pixel_depth = 24;
554b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      }
555b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
556b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      else if (row_info->bit_depth == 16)
557b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      {
558b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         if (at_start) /* Skip initial filler */
559b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            sp += 2;
560b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         else          /* Skip initial channels and, for sp, the filler */
561b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            sp += 8, dp += 6;
562b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
563b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         while (sp < ep)
564893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
565b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            /* Copy 6 bytes, skip 2 */
566b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            *dp++ = *sp++, *dp++ = *sp++;
567b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            *dp++ = *sp++, *dp++ = *sp++;
568b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            *dp++ = *sp++, *dp++ = *sp, sp += 3;
569893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
570b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
571b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         row_info->pixel_depth = 48;
572893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
573b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
574b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      else
575b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         return; /* bad bit depth */
576b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
577b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      row_info->channels = 3;
578b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
579b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      /* Finally fix the color type if it records an alpha channel */
580b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
581b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         row_info->color_type = PNG_COLOR_TYPE_RGB;
582893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
583b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
584b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   else
585b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      return; /* The filler channel has gone already */
586b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
587b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* Fix the rowbytes value. */
588b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   row_info->rowbytes = dp-row;
589893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
590893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
591893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
592893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
593a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* Swaps red and blue bytes within a pixel */
594893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
595893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_do_bgr(png_row_infop row_info, png_bytep row)
596893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
5974215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_do_bgr");
5985f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
599b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if ((row_info->color_type & PNG_COLOR_MASK_COLOR))
600893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
601893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_uint_32 row_width = row_info->width;
602893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (row_info->bit_depth == 8)
603893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
604893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (row_info->color_type == PNG_COLOR_TYPE_RGB)
605893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
606893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_bytep rp;
607893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_uint_32 i;
608893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
609893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0, rp = row; i < row_width; i++, rp += 3)
610893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
611893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_byte save = *rp;
612893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *rp = *(rp + 2);
613893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(rp + 2) = save;
614893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
615893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
616b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
617893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
618893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
619893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_bytep rp;
620893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_uint_32 i;
621893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
622893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0, rp = row; i < row_width; i++, rp += 4)
623893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
624893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_byte save = *rp;
625893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *rp = *(rp + 2);
626893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(rp + 2) = save;
627893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
628893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
629893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
630b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
631b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_16BIT_SUPPORTED
632893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else if (row_info->bit_depth == 16)
633893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
634893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (row_info->color_type == PNG_COLOR_TYPE_RGB)
635893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
636893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_bytep rp;
637893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_uint_32 i;
638893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
639893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0, rp = row; i < row_width; i++, rp += 6)
640893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
641893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_byte save = *rp;
642893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *rp = *(rp + 4);
643893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(rp + 4) = save;
644893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               save = *(rp + 1);
645893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(rp + 1) = *(rp + 5);
646893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(rp + 5) = save;
647893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
648893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
649b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
650893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
651893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
652893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_bytep rp;
653893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_uint_32 i;
654893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
655893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0, rp = row; i < row_width; i++, rp += 8)
656893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
657893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_byte save = *rp;
658893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *rp = *(rp + 4);
659893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(rp + 4) = save;
660893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               save = *(rp + 1);
661893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(rp + 1) = *(rp + 5);
662893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(rp + 5) = save;
663893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
664893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
665893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
666b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
667893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
668893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
669893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */
670893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
671b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#if defined(PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED) || \
672b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    defined(PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED)
673b50c217251b086440efcdb273c22f86a06c80cbaChris Craik/* Added at libpng-1.5.10 */
674b50c217251b086440efcdb273c22f86a06c80cbaChris Craikvoid /* PRIVATE */
675b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_do_check_palette_indexes(png_structrp png_ptr, png_row_infop row_info)
676b50c217251b086440efcdb273c22f86a06c80cbaChris Craik{
677b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (png_ptr->num_palette < (1 << row_info->bit_depth) &&
678b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_ptr->num_palette > 0) /* num_palette can be 0 in MNG files */
679b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   {
680b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      /* Calculations moved outside switch in an attempt to stop different
681b50c217251b086440efcdb273c22f86a06c80cbaChris Craik       * compiler warnings.  'padding' is in *bits* within the last byte, it is
682b50c217251b086440efcdb273c22f86a06c80cbaChris Craik       * an 'int' because pixel_depth becomes an 'int' in the expression below,
683b50c217251b086440efcdb273c22f86a06c80cbaChris Craik       * and this calculation is used because it avoids warnings that other
684b50c217251b086440efcdb273c22f86a06c80cbaChris Craik       * forms produced on either GCC or MSVC.
685b50c217251b086440efcdb273c22f86a06c80cbaChris Craik       */
686b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      int padding = (-row_info->pixel_depth * row_info->width) & 7;
687b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_bytep rp = png_ptr->row_buf + row_info->rowbytes;
688b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
689b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      switch (row_info->bit_depth)
690b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      {
691b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         case 1:
692b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         {
693b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            /* in this case, all bytes must be 0 so we don't need
694b50c217251b086440efcdb273c22f86a06c80cbaChris Craik             * to unpack the pixels except for the rightmost one.
695b50c217251b086440efcdb273c22f86a06c80cbaChris Craik             */
696b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            for (; rp > png_ptr->row_buf; rp--)
697b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            {
698b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              if (*rp >> padding != 0)
699b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                 png_ptr->num_palette_max = 1;
700b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              padding = 0;
701b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            }
702b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
703b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            break;
704b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         }
705b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
706b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         case 2:
707b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         {
708b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            for (; rp > png_ptr->row_buf; rp--)
709b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            {
710b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              int i = ((*rp >> padding) & 0x03);
711b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
712b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              if (i > png_ptr->num_palette_max)
713b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                 png_ptr->num_palette_max = i;
714b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
715b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              i = (((*rp >> padding) >> 2) & 0x03);
716b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
717b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              if (i > png_ptr->num_palette_max)
718b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                 png_ptr->num_palette_max = i;
719b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
720b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              i = (((*rp >> padding) >> 4) & 0x03);
721b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
722b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              if (i > png_ptr->num_palette_max)
723b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                 png_ptr->num_palette_max = i;
724b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
725b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              i = (((*rp >> padding) >> 6) & 0x03);
726b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
727b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              if (i > png_ptr->num_palette_max)
728b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                 png_ptr->num_palette_max = i;
729b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
730b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              padding = 0;
731b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            }
732b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
733b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            break;
734b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         }
735b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
736b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         case 4:
737b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         {
738b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            for (; rp > png_ptr->row_buf; rp--)
739b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            {
740b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              int i = ((*rp >> padding) & 0x0f);
741b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
742b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              if (i > png_ptr->num_palette_max)
743b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                 png_ptr->num_palette_max = i;
744b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
745b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              i = (((*rp >> padding) >> 4) & 0x0f);
746b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
747b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              if (i > png_ptr->num_palette_max)
748b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                 png_ptr->num_palette_max = i;
749b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
750b50c217251b086440efcdb273c22f86a06c80cbaChris Craik              padding = 0;
751b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            }
752b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
753b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            break;
754b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         }
755b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
756b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         case 8:
757b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         {
758b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            for (; rp > png_ptr->row_buf; rp--)
759b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            {
760b50c217251b086440efcdb273c22f86a06c80cbaChris Craik               if (*rp > png_ptr->num_palette_max)
761b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                  png_ptr->num_palette_max = (int) *rp;
762b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            }
763b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
764b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            break;
765b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         }
766b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
767b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         default:
768b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            break;
769b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      }
770b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   }
771b50c217251b086440efcdb273c22f86a06c80cbaChris Craik}
772b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif /* PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED */
773b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
774893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
775a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott    defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
776b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED
777893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
778b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_set_user_transform_info(png_structrp png_ptr, png_voidp
779893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   user_transform_ptr, int user_transform_depth, int user_transform_channels)
780893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
7814215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_set_user_transform_info");
7825f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
783a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL)
784a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return;
785b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
786b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED
787b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0 &&
788b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      (png_ptr->flags & PNG_FLAG_ROW_INIT) != 0)
789b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   {
790b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      png_app_error(png_ptr,
791b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            "info change after png_start_read_image or png_read_update_info");
792b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      return;
793b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   }
794b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif
795b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
796893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->user_transform_ptr = user_transform_ptr;
797893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->user_transform_depth = (png_byte)user_transform_depth;
798893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->user_transform_channels = (png_byte)user_transform_channels;
799893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
800893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
801893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
802893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* This function returns a pointer to the user_transform_ptr associated with
803893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * the user transform functions.  The application should free any memory
804893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * associated with this pointer before png_write_destroy and png_read_destroy
805893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * are called.
806893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
807b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED
808893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_voidp PNGAPI
809b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_get_user_transform_ptr(png_const_structrp png_ptr)
810893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
811a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott   if (png_ptr == NULL)
812a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      return (NULL);
813b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
814b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   return png_ptr->user_transform_ptr;
815b50c217251b086440efcdb273c22f86a06c80cbaChris Craik}
816893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
817b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
818b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_USER_TRANSFORM_INFO_SUPPORTED
819b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_uint_32 PNGAPI
820b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_get_current_row_number(png_const_structrp png_ptr)
821b50c217251b086440efcdb273c22f86a06c80cbaChris Craik{
822b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   /* See the comments in png.h - this is the sub-image row when reading and
823b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    * interlaced image.
824b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    */
825b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (png_ptr != NULL)
826b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      return png_ptr->row_number;
827b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
828b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   return PNG_UINT_32_MAX; /* help the app not to fail silently */
829b50c217251b086440efcdb273c22f86a06c80cbaChris Craik}
830b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
831b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_byte PNGAPI
832b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_get_current_pass_number(png_const_structrp png_ptr)
833b50c217251b086440efcdb273c22f86a06c80cbaChris Craik{
834b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (png_ptr != NULL)
835b50c217251b086440efcdb273c22f86a06c80cbaChris Craik      return png_ptr->pass;
836b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   return 8; /* invalid */
837893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
838b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif /* PNG_USER_TRANSFORM_INFO_SUPPORTED */
839b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif /* PNG_READ_USER_TRANSFORM_SUPPORTED ||
840b50c217251b086440efcdb273c22f86a06c80cbaChris Craik          PNG_WRITE_USER_TRANSFORM_SUPPORTED */
841893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */
842