pngtrans.c revision 893912bfc2683463dc3e2c445336752d012563d3
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 *
4893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * Last changed in libpng 1.2.17 May 15, 2007
5893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * For conditions of distribution and use, see copyright notice in png.h
6893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * Copyright (c) 1998-2007 Glenn Randers-Pehrson
7893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
8893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
9893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
10893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
11893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#define PNG_INTERNAL
12893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#include "png.h"
13893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
14893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
15893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
16893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* turn on BGR-to-RGB mapping */
17893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
18893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_bgr(png_structp png_ptr)
19893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
20893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_debug(1, "in png_set_bgr\n");
21893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if(png_ptr == NULL) return;
22893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->transformations |= PNG_BGR;
23893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
24893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
25893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
26893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
27893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* turn on 16 bit byte swapping */
28893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
29893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_swap(png_structp png_ptr)
30893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
31893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_debug(1, "in png_set_swap\n");
32893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if(png_ptr == NULL) return;
33893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->bit_depth == 16)
34893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->transformations |= PNG_SWAP_BYTES;
35893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
36893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
37893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
38893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED)
39893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* turn on pixel packing */
40893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
41893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_packing(png_structp png_ptr)
42893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
43893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_debug(1, "in png_set_packing\n");
44893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if(png_ptr == NULL) return;
45893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->bit_depth < 8)
46893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
47893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->transformations |= PNG_PACK;
48893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->usr_bit_depth = 8;
49893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
50893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
51893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
52893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
53893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
54893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* turn on packed pixel swapping */
55893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
56893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_packswap(png_structp png_ptr)
57893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
58893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_debug(1, "in png_set_packswap\n");
59893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if(png_ptr == NULL) return;
60893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->bit_depth < 8)
61893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->transformations |= PNG_PACKSWAP;
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_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED)
66893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
67893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_shift(png_structp png_ptr, png_color_8p true_bits)
68893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
69893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_debug(1, "in png_set_shift\n");
70893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if(png_ptr == NULL) return;
71893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->transformations |= PNG_SHIFT;
72893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->shift = *true_bits;
73893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
74893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
75893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
76893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_INTERLACING_SUPPORTED) || \
77893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    defined(PNG_WRITE_INTERLACING_SUPPORTED)
78893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectint PNGAPI
79893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_interlace_handling(png_structp png_ptr)
80893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
81893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_debug(1, "in png_set_interlace handling\n");
82893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr && png_ptr->interlaced)
83893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
84893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->transformations |= PNG_INTERLACE;
85893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      return (7);
86893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
87893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
88893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   return (1);
89893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
90893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
91893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
92893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)
93893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Add a filler byte on read, or remove a filler or alpha byte on write.
94893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * The filler type has changed in v0.95 to allow future 2-byte fillers
95893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * for 48-bit input data, as well as to avoid problems with some compilers
96893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * that don't like bytes as parameters.
97893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
98893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
99893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_filler(png_structp png_ptr, png_uint_32 filler, int filler_loc)
100893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
101893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_debug(1, "in png_set_filler\n");
102893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if(png_ptr == NULL) return;
103893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->transformations |= PNG_FILLER;
104893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->filler = (png_byte)filler;
105893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (filler_loc == PNG_FILLER_AFTER)
106893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->flags |= PNG_FLAG_FILLER_AFTER;
107893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else
108893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER;
109893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
110893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* This should probably go in the "do_read_filler" routine.
111893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    * I attempted to do that in libpng-1.0.1a but that caused problems
112893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    * so I restored it in libpng-1.0.2a
113893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   */
114893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
115893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->color_type == PNG_COLOR_TYPE_RGB)
116893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
117893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->usr_channels = 4;
118893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
119893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
120893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   /* Also I added this in libpng-1.0.2a (what happens when we expand
121893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    * a less-than-8-bit grayscale to GA? */
122893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
123893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY && png_ptr->bit_depth >= 8)
124893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
125893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_ptr->usr_channels = 2;
126893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
127893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
128893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
129893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if !defined(PNG_1_0_X)
130893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Added to libpng-1.2.7 */
131893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
132893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_add_alpha(png_structp png_ptr, png_uint_32 filler, int filler_loc)
133893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
134893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_debug(1, "in png_set_add_alpha\n");
135893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if(png_ptr == NULL) return;
136893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_set_filler(png_ptr, filler, filler_loc);
137893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->transformations |= PNG_ADD_ALPHA;
138893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
139893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
140893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
141893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
142893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
143893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \
144893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
145893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
146893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_swap_alpha(png_structp png_ptr)
147893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
148893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_debug(1, "in png_set_swap_alpha\n");
149893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if(png_ptr == NULL) return;
150893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->transformations |= PNG_SWAP_ALPHA;
151893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
152893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
153893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
154893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \
155893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
156893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
157893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_invert_alpha(png_structp png_ptr)
158893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
159893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_debug(1, "in png_set_invert_alpha\n");
160893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if(png_ptr == NULL) return;
161893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->transformations |= PNG_INVERT_ALPHA;
162893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
163893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
164893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
165893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED)
166893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
167893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_invert_mono(png_structp png_ptr)
168893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
169893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_debug(1, "in png_set_invert_mono\n");
170893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if(png_ptr == NULL) return;
171893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->transformations |= PNG_INVERT_MONO;
172893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
173893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
174893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* invert monochrome grayscale data */
175893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
176893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_do_invert(png_row_infop row_info, png_bytep row)
177893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
178893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_debug(1, "in png_do_invert\n");
179893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project  /* This test removed from libpng version 1.0.13 and 1.2.0:
180893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   *   if (row_info->bit_depth == 1 &&
181893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   */
182893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_USELESS_TESTS_SUPPORTED)
183893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (row == NULL || row_info == NULL)
184893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project     return;
185893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
186893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (row_info->color_type == PNG_COLOR_TYPE_GRAY)
187893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
188893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_bytep rp = row;
189893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_uint_32 i;
190893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_uint_32 istop = row_info->rowbytes;
191893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
192893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      for (i = 0; i < istop; i++)
193893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
194893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         *rp = (png_byte)(~(*rp));
195893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         rp++;
196893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
197893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
198893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
199893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      row_info->bit_depth == 8)
200893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
201893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_bytep rp = row;
202893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_uint_32 i;
203893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_uint_32 istop = row_info->rowbytes;
204893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
205893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      for (i = 0; i < istop; i+=2)
206893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
207893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         *rp = (png_byte)(~(*rp));
208893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         rp+=2;
209893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
210893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
211893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
212893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      row_info->bit_depth == 16)
213893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
214893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_bytep rp = row;
215893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_uint_32 i;
216893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_uint_32 istop = row_info->rowbytes;
217893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
218893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      for (i = 0; i < istop; i+=4)
219893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
220893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         *rp = (png_byte)(~(*rp));
221893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         *(rp+1) = (png_byte)(~(*(rp+1)));
222893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         rp+=4;
223893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
224893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
225893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
226893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
227893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
228893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
229893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* swaps byte order on 16 bit depth images */
230893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
231893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_do_swap(png_row_infop row_info, png_bytep row)
232893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
233893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_debug(1, "in png_do_swap\n");
234893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (
235893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_USELESS_TESTS_SUPPORTED)
236893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project       row != NULL && row_info != NULL &&
237893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
238893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project       row_info->bit_depth == 16)
239893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
240893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_bytep rp = row;
241893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_uint_32 i;
242893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_uint_32 istop= row_info->width * row_info->channels;
243893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
244893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      for (i = 0; i < istop; i++, rp += 2)
245893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
246893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_byte t = *rp;
247893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         *rp = *(rp + 1);
248893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         *(rp + 1) = t;
249893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
250893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
251893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
252893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
253893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
254893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
255893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic PNG_CONST png_byte onebppswaptable[256] = {
256893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,
257893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
258893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8,
259893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
260893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4,
261893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
262893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC,
263893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
264893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2,
265893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
266893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA,
267893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
268893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6,
269893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
270893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE,
271893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
272893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1,
273893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
274893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9,
275893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
276893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5,
277893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
278893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED,
279893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
280893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3,
281893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
282893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB,
283893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
284893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7,
285893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
286893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF,
287893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
288893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project};
289893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
290893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic PNG_CONST png_byte twobppswaptable[256] = {
291893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x00, 0x40, 0x80, 0xC0, 0x10, 0x50, 0x90, 0xD0,
292893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x20, 0x60, 0xA0, 0xE0, 0x30, 0x70, 0xB0, 0xF0,
293893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x04, 0x44, 0x84, 0xC4, 0x14, 0x54, 0x94, 0xD4,
294893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x24, 0x64, 0xA4, 0xE4, 0x34, 0x74, 0xB4, 0xF4,
295893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x08, 0x48, 0x88, 0xC8, 0x18, 0x58, 0x98, 0xD8,
296893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x28, 0x68, 0xA8, 0xE8, 0x38, 0x78, 0xB8, 0xF8,
297893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0C, 0x4C, 0x8C, 0xCC, 0x1C, 0x5C, 0x9C, 0xDC,
298893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x2C, 0x6C, 0xAC, 0xEC, 0x3C, 0x7C, 0xBC, 0xFC,
299893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x01, 0x41, 0x81, 0xC1, 0x11, 0x51, 0x91, 0xD1,
300893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x21, 0x61, 0xA1, 0xE1, 0x31, 0x71, 0xB1, 0xF1,
301893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x05, 0x45, 0x85, 0xC5, 0x15, 0x55, 0x95, 0xD5,
302893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x25, 0x65, 0xA5, 0xE5, 0x35, 0x75, 0xB5, 0xF5,
303893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x09, 0x49, 0x89, 0xC9, 0x19, 0x59, 0x99, 0xD9,
304893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x29, 0x69, 0xA9, 0xE9, 0x39, 0x79, 0xB9, 0xF9,
305893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0D, 0x4D, 0x8D, 0xCD, 0x1D, 0x5D, 0x9D, 0xDD,
306893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x2D, 0x6D, 0xAD, 0xED, 0x3D, 0x7D, 0xBD, 0xFD,
307893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x02, 0x42, 0x82, 0xC2, 0x12, 0x52, 0x92, 0xD2,
308893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x22, 0x62, 0xA2, 0xE2, 0x32, 0x72, 0xB2, 0xF2,
309893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x06, 0x46, 0x86, 0xC6, 0x16, 0x56, 0x96, 0xD6,
310893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x26, 0x66, 0xA6, 0xE6, 0x36, 0x76, 0xB6, 0xF6,
311893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0A, 0x4A, 0x8A, 0xCA, 0x1A, 0x5A, 0x9A, 0xDA,
312893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x2A, 0x6A, 0xAA, 0xEA, 0x3A, 0x7A, 0xBA, 0xFA,
313893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0E, 0x4E, 0x8E, 0xCE, 0x1E, 0x5E, 0x9E, 0xDE,
314893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x2E, 0x6E, 0xAE, 0xEE, 0x3E, 0x7E, 0xBE, 0xFE,
315893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x03, 0x43, 0x83, 0xC3, 0x13, 0x53, 0x93, 0xD3,
316893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x23, 0x63, 0xA3, 0xE3, 0x33, 0x73, 0xB3, 0xF3,
317893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x07, 0x47, 0x87, 0xC7, 0x17, 0x57, 0x97, 0xD7,
318893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x27, 0x67, 0xA7, 0xE7, 0x37, 0x77, 0xB7, 0xF7,
319893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0B, 0x4B, 0x8B, 0xCB, 0x1B, 0x5B, 0x9B, 0xDB,
320893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x2B, 0x6B, 0xAB, 0xEB, 0x3B, 0x7B, 0xBB, 0xFB,
321893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0F, 0x4F, 0x8F, 0xCF, 0x1F, 0x5F, 0x9F, 0xDF,
322893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x2F, 0x6F, 0xAF, 0xEF, 0x3F, 0x7F, 0xBF, 0xFF
323893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project};
324893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
325893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic PNG_CONST png_byte fourbppswaptable[256] = {
326893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70,
327893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0,
328893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71,
329893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1,
330893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72,
331893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x82, 0x92, 0xA2, 0xB2, 0xC2, 0xD2, 0xE2, 0xF2,
332893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73,
333893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x83, 0x93, 0xA3, 0xB3, 0xC3, 0xD3, 0xE3, 0xF3,
334893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74,
335893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x84, 0x94, 0xA4, 0xB4, 0xC4, 0xD4, 0xE4, 0xF4,
336893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75,
337893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x85, 0x95, 0xA5, 0xB5, 0xC5, 0xD5, 0xE5, 0xF5,
338893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76,
339893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x86, 0x96, 0xA6, 0xB6, 0xC6, 0xD6, 0xE6, 0xF6,
340893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77,
341893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x87, 0x97, 0xA7, 0xB7, 0xC7, 0xD7, 0xE7, 0xF7,
342893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78,
343893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x88, 0x98, 0xA8, 0xB8, 0xC8, 0xD8, 0xE8, 0xF8,
344893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79,
345893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, 0xE9, 0xF9,
346893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0A, 0x1A, 0x2A, 0x3A, 0x4A, 0x5A, 0x6A, 0x7A,
347893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x8A, 0x9A, 0xAA, 0xBA, 0xCA, 0xDA, 0xEA, 0xFA,
348893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0B, 0x1B, 0x2B, 0x3B, 0x4B, 0x5B, 0x6B, 0x7B,
349893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x8B, 0x9B, 0xAB, 0xBB, 0xCB, 0xDB, 0xEB, 0xFB,
350893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0C, 0x1C, 0x2C, 0x3C, 0x4C, 0x5C, 0x6C, 0x7C,
351893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x8C, 0x9C, 0xAC, 0xBC, 0xCC, 0xDC, 0xEC, 0xFC,
352893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0D, 0x1D, 0x2D, 0x3D, 0x4D, 0x5D, 0x6D, 0x7D,
353893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x8D, 0x9D, 0xAD, 0xBD, 0xCD, 0xDD, 0xED, 0xFD,
354893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0E, 0x1E, 0x2E, 0x3E, 0x4E, 0x5E, 0x6E, 0x7E,
355893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x8E, 0x9E, 0xAE, 0xBE, 0xCE, 0xDE, 0xEE, 0xFE,
356893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x0F, 0x1F, 0x2F, 0x3F, 0x4F, 0x5F, 0x6F, 0x7F,
357893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF
358893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project};
359893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
360893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* swaps pixel packing order within bytes */
361893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
362893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_do_packswap(png_row_infop row_info, png_bytep row)
363893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
364893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_debug(1, "in png_do_packswap\n");
365893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (
366893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_USELESS_TESTS_SUPPORTED)
367893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project       row != NULL && row_info != NULL &&
368893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
369893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project       row_info->bit_depth < 8)
370893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
371893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_bytep rp, end, table;
372893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
373893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      end = row + row_info->rowbytes;
374893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
375893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (row_info->bit_depth == 1)
376893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         table = (png_bytep)onebppswaptable;
377893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else if (row_info->bit_depth == 2)
378893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         table = (png_bytep)twobppswaptable;
379893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else if (row_info->bit_depth == 4)
380893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         table = (png_bytep)fourbppswaptable;
381893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else
382893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         return;
383893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
384893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      for (rp = row; rp < end; rp++)
385893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         *rp = table[*rp];
386893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
387893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
388893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_READ_PACKSWAP_SUPPORTED or PNG_WRITE_PACKSWAP_SUPPORTED */
389893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
390893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_FILLER_SUPPORTED) || \
391893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
392893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* remove filler or alpha byte(s) */
393893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
394893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags)
395893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
396893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_debug(1, "in png_do_strip_filler\n");
397893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_USELESS_TESTS_SUPPORTED)
398893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (row != NULL && row_info != NULL)
399893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
400893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
401893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_bytep sp=row;
402893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_bytep dp=row;
403893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_uint_32 row_width=row_info->width;
404893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_uint_32 i;
405893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
406893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if ((row_info->color_type == PNG_COLOR_TYPE_RGB ||
407893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA &&
408893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         (flags & PNG_FLAG_STRIP_ALPHA))) &&
409893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         row_info->channels == 4)
410893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
411893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (row_info->bit_depth == 8)
412893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
413893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            /* This converts from RGBX or RGBA to RGB */
414893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if (flags & PNG_FLAG_FILLER_AFTER)
415893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
416893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               dp+=3; sp+=4;
417893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               for (i = 1; i < row_width; i++)
418893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               {
419893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  *dp++ = *sp++;
420893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  *dp++ = *sp++;
421893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  *dp++ = *sp++;
422893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  sp++;
423893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               }
424893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
425893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            /* This converts from XRGB or ARGB to RGB */
426893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            else
427893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
428893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               for (i = 0; i < row_width; i++)
429893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               {
430893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  sp++;
431893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  *dp++ = *sp++;
432893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  *dp++ = *sp++;
433893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  *dp++ = *sp++;
434893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               }
435893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
436893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            row_info->pixel_depth = 24;
437893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            row_info->rowbytes = row_width * 3;
438893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
439893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         else /* if (row_info->bit_depth == 16) */
440893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
441893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if (flags & PNG_FLAG_FILLER_AFTER)
442893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
443893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               /* This converts from RRGGBBXX or RRGGBBAA to RRGGBB */
444893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               sp += 8; dp += 6;
445893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               for (i = 1; i < row_width; i++)
446893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               {
447893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  /* This could be (although png_memcpy is probably slower):
448893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  png_memcpy(dp, sp, 6);
449893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  sp += 8;
450893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  dp += 6;
451893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  */
452893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
453893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  *dp++ = *sp++;
454893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  *dp++ = *sp++;
455893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  *dp++ = *sp++;
456893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  *dp++ = *sp++;
457893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  *dp++ = *sp++;
458893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  *dp++ = *sp++;
459893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  sp += 2;
460893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               }
461893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
462893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            else
463893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
464893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               /* This converts from XXRRGGBB or AARRGGBB to RRGGBB */
465893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               for (i = 0; i < row_width; i++)
466893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               {
467893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  /* This could be (although png_memcpy is probably slower):
468893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  png_memcpy(dp, sp, 6);
469893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  sp += 8;
470893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  dp += 6;
471893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  */
472893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
473893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  sp+=2;
474893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  *dp++ = *sp++;
475893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  *dp++ = *sp++;
476893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  *dp++ = *sp++;
477893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  *dp++ = *sp++;
478893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  *dp++ = *sp++;
479893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  *dp++ = *sp++;
480893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               }
481893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
482893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            row_info->pixel_depth = 48;
483893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            row_info->rowbytes = row_width * 6;
484893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
485893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         row_info->channels = 3;
486893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
487893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else if ((row_info->color_type == PNG_COLOR_TYPE_GRAY ||
488893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
489893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         (flags & PNG_FLAG_STRIP_ALPHA))) &&
490893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project          row_info->channels == 2)
491893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
492893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (row_info->bit_depth == 8)
493893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
494893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            /* This converts from GX or GA to G */
495893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if (flags & PNG_FLAG_FILLER_AFTER)
496893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
497893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               for (i = 0; i < row_width; i++)
498893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               {
499893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  *dp++ = *sp++;
500893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  sp++;
501893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               }
502893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
503893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            /* This converts from XG or AG to G */
504893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            else
505893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
506893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               for (i = 0; i < row_width; i++)
507893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               {
508893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  sp++;
509893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  *dp++ = *sp++;
510893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               }
511893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
512893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            row_info->pixel_depth = 8;
513893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            row_info->rowbytes = row_width;
514893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
515893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         else /* if (row_info->bit_depth == 16) */
516893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
517893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if (flags & PNG_FLAG_FILLER_AFTER)
518893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
519893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               /* This converts from GGXX or GGAA to GG */
520893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               sp += 4; dp += 2;
521893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               for (i = 1; i < row_width; i++)
522893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               {
523893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  *dp++ = *sp++;
524893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  *dp++ = *sp++;
525893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  sp += 2;
526893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               }
527893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
528893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            else
529893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
530893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               /* This converts from XXGG or AAGG to GG */
531893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               for (i = 0; i < row_width; i++)
532893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               {
533893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  sp += 2;
534893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  *dp++ = *sp++;
535893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  *dp++ = *sp++;
536893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               }
537893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
538893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            row_info->pixel_depth = 16;
539893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            row_info->rowbytes = row_width * 2;
540893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
541893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         row_info->channels = 1;
542893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
543893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (flags & PNG_FLAG_STRIP_ALPHA)
544893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        row_info->color_type &= ~PNG_COLOR_MASK_ALPHA;
545893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
546893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
547893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
548893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
549893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
550893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* swaps red and blue bytes within a pixel */
551893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
552893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_do_bgr(png_row_infop row_info, png_bytep row)
553893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
554893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_debug(1, "in png_do_bgr\n");
555893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (
556893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_USELESS_TESTS_SUPPORTED)
557893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project       row != NULL && row_info != NULL &&
558893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
559893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project       (row_info->color_type & PNG_COLOR_MASK_COLOR))
560893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
561893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_uint_32 row_width = row_info->width;
562893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (row_info->bit_depth == 8)
563893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
564893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (row_info->color_type == PNG_COLOR_TYPE_RGB)
565893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
566893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_bytep rp;
567893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_uint_32 i;
568893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
569893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0, rp = row; i < row_width; i++, rp += 3)
570893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
571893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_byte save = *rp;
572893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *rp = *(rp + 2);
573893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(rp + 2) = save;
574893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
575893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
576893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
577893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
578893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_bytep rp;
579893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_uint_32 i;
580893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
581893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0, rp = row; i < row_width; i++, rp += 4)
582893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
583893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_byte save = *rp;
584893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *rp = *(rp + 2);
585893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(rp + 2) = save;
586893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
587893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
588893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
589893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else if (row_info->bit_depth == 16)
590893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
591893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (row_info->color_type == PNG_COLOR_TYPE_RGB)
592893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
593893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_bytep rp;
594893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_uint_32 i;
595893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
596893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0, rp = row; i < row_width; i++, rp += 6)
597893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
598893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_byte save = *rp;
599893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *rp = *(rp + 4);
600893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(rp + 4) = save;
601893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               save = *(rp + 1);
602893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(rp + 1) = *(rp + 5);
603893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(rp + 5) = save;
604893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
605893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
606893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
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 += 8)
612893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
613893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_byte save = *rp;
614893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *rp = *(rp + 4);
615893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(rp + 4) = save;
616893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               save = *(rp + 1);
617893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(rp + 1) = *(rp + 5);
618893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(rp + 5) = save;
619893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
620893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
621893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
622893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
623893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
624893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */
625893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
626893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
627893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \
628893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project    defined(PNG_LEGACY_SUPPORTED)
629893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI
630893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_set_user_transform_info(png_structp png_ptr, png_voidp
631893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   user_transform_ptr, int user_transform_depth, int user_transform_channels)
632893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
633893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_debug(1, "in png_set_user_transform_info\n");
634893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if(png_ptr == NULL) return;
635893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
636893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->user_transform_ptr = user_transform_ptr;
637893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->user_transform_depth = (png_byte)user_transform_depth;
638893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   png_ptr->user_transform_channels = (png_byte)user_transform_channels;
639893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else
640893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if(user_transform_ptr || user_transform_depth || user_transform_channels)
641893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      png_warning(png_ptr,
642893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project        "This version of libpng does not support user transform info");
643893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
644893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
645893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
646893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
647893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* This function returns a pointer to the user_transform_ptr associated with
648893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * the user transform functions.  The application should free any memory
649893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * associated with this pointer before png_write_destroy and png_read_destroy
650893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * are called.
651893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
652893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_voidp PNGAPI
653893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_get_user_transform_ptr(png_structp png_ptr)
654893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
655893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
656893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (png_ptr == NULL) return (NULL);
657893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   return ((png_voidp)png_ptr->user_transform_ptr);
658893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#else
659893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   return (NULL);
660893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
661893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
662893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */
663