1893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
2893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* pngwtran.c - transforms the data in a row for PNG writers
3893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *
4851c67770f9cebece9c79e914a54c348f539a512Matt Sarett * Last changed in libpng 1.6.24 [August 4, 2016]
57a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis * Copyright (c) 1998-2002,2004,2006-2016 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#ifdef PNG_WRITE_SUPPORTED
17b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_WRITE_TRANSFORMS_SUPPORTED
18893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
195f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_PACK_SUPPORTED
20893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Pack pixels into bytes.  Pass the true bit depth in bit_depth.  The
21893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * row_info bit depth should be 8 (one pixel per byte).  The channels
22893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * should be 1 (this only happens on grayscale and paletted images).
23893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
24b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripuraristatic void
25893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth)
26893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
274215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_do_pack");
285f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
29893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   if (row_info->bit_depth == 8 &&
30893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      row_info->channels == 1)
31893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
32893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      switch ((int)bit_depth)
33893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
34893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         case 1:
35893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
36893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_bytep sp, dp;
37893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            int mask, v;
38893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_uint_32 i;
39893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_uint_32 row_width = row_info->width;
40893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
41893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            sp = row;
42893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            dp = row;
43893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            mask = 0x80;
44893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            v = 0;
45893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
46893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0; i < row_width; i++)
47893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
48893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               if (*sp != 0)
49893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  v |= mask;
50b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
51893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               sp++;
52b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
53893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               if (mask > 1)
54893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  mask >>= 1;
55b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
56893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               else
57893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               {
58893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  mask = 0x80;
59893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  *dp = (png_byte)v;
60893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  dp++;
61893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  v = 0;
62893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               }
63893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
64b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
65893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if (mask != 0x80)
66893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *dp = (png_byte)v;
67b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
68893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            break;
69893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
70b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
71893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         case 2:
72893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
73893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_bytep sp, dp;
749b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett            unsigned int shift;
759b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett            int v;
76893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_uint_32 i;
77893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_uint_32 row_width = row_info->width;
78893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
79893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            sp = row;
80893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            dp = row;
81893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            shift = 6;
82893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            v = 0;
83b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
84893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0; i < row_width; i++)
85893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
86893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_byte value;
87893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
88893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               value = (png_byte)(*sp & 0x03);
89893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               v |= (value << shift);
90b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
91893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               if (shift == 0)
92893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               {
93893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  shift = 6;
94893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  *dp = (png_byte)v;
95893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  dp++;
96893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  v = 0;
97893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               }
98b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
99893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               else
100893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  shift -= 2;
101b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
102893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               sp++;
103893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
104b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
105893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if (shift != 6)
106893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *dp = (png_byte)v;
107b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
108893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            break;
109893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
110b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
111893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         case 4:
112893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
113893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_bytep sp, dp;
1149b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett            unsigned int shift;
1159b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett            int v;
116893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_uint_32 i;
117893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_uint_32 row_width = row_info->width;
118893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
119893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            sp = row;
120893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            dp = row;
121893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            shift = 4;
122893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            v = 0;
123b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
124893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0; i < row_width; i++)
125893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
126893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_byte value;
127893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
128893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               value = (png_byte)(*sp & 0x0f);
129893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               v |= (value << shift);
130893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
131893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               if (shift == 0)
132893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               {
133893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  shift = 4;
134893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  *dp = (png_byte)v;
135893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  dp++;
136893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  v = 0;
137893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               }
138b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
139893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               else
140893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project                  shift -= 4;
141893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
142893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               sp++;
143893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
144b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
145893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            if (shift != 4)
146893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *dp = (png_byte)v;
147b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
148893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            break;
149893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
150b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
151b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         default:
152b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            break;
153893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
154b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
155893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      row_info->bit_depth = (png_byte)bit_depth;
156893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      row_info->pixel_depth = (png_byte)(bit_depth * row_info->channels);
157893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth,
158b50c217251b086440efcdb273c22f86a06c80cbaChris Craik          row_info->width);
159893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
160893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
161893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
162893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1635f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_SHIFT_SUPPORTED
164893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Shift pixel values to take advantage of whole range.  Pass the
165893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * true number of bits in bit_depth.  The row should be packed
166893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * according to row_info->bit_depth.  Thus, if you had a row of
167893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * bit depth 4, but the pixels only had values from 0 to 7, you
168893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * would pass 3 as bit_depth, and this routine would translate the
169893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * data to 0 to 15.
170893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */
171b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripuraristatic void
172b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_do_shift(png_row_infop row_info, png_bytep row,
173b50c217251b086440efcdb273c22f86a06c80cbaChris Craik    png_const_color_8p bit_depth)
174893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
1754215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_do_shift");
1765f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
177b50c217251b086440efcdb273c22f86a06c80cbaChris Craik   if (row_info->color_type != PNG_COLOR_TYPE_PALETTE)
178893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
179893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      int shift_start[4], shift_dec[4];
180851c67770f9cebece9c79e914a54c348f539a512Matt Sarett      int channels = 0;
181893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
1829b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett      if ((row_info->color_type & PNG_COLOR_MASK_COLOR) != 0)
183893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
184893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         shift_start[channels] = row_info->bit_depth - bit_depth->red;
185893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         shift_dec[channels] = bit_depth->red;
186893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         channels++;
187b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
188893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         shift_start[channels] = row_info->bit_depth - bit_depth->green;
189893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         shift_dec[channels] = bit_depth->green;
190893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         channels++;
191b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
192893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         shift_start[channels] = row_info->bit_depth - bit_depth->blue;
193893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         shift_dec[channels] = bit_depth->blue;
194893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         channels++;
195893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
196b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
197893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else
198893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
199893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         shift_start[channels] = row_info->bit_depth - bit_depth->gray;
200893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         shift_dec[channels] = bit_depth->gray;
201893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         channels++;
202893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
203b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
2049b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett      if ((row_info->color_type & PNG_COLOR_MASK_ALPHA) != 0)
205893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
206893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         shift_start[channels] = row_info->bit_depth - bit_depth->alpha;
207893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         shift_dec[channels] = bit_depth->alpha;
208893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         channels++;
209893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
210893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
211a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott      /* With low row depths, could only be grayscale, so one channel */
212893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (row_info->bit_depth < 8)
213893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
214893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_bytep bp = row;
215b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         png_size_t i;
216b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         unsigned int mask;
217b50c217251b086440efcdb273c22f86a06c80cbaChris Craik         png_size_t row_bytes = row_info->rowbytes;
218893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
219893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (bit_depth->gray == 1 && row_info->bit_depth == 2)
220893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            mask = 0x55;
221b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
222893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         else if (row_info->bit_depth == 4 && bit_depth->gray == 3)
223893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            mask = 0x11;
224b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
225893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         else
226893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            mask = 0xff;
227893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
228893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         for (i = 0; i < row_bytes; i++, bp++)
229893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
230893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            int j;
231b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            unsigned int v, out;
232893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
233893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            v = *bp;
234b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            out = 0;
235b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
236893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (j = shift_start[0]; j > -shift_dec[0]; j -= shift_dec[0])
237893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
238893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               if (j > 0)
239b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                  out |= v << j;
240b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
241893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               else
242b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                  out |= (v >> (-j)) & mask;
243893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
244b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
245b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            *bp = (png_byte)(out & 0xff);
246893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
247893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
248b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
249893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else if (row_info->bit_depth == 8)
250893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
251893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_bytep bp = row;
252893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_uint_32 i;
253893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_uint_32 istop = channels * row_info->width;
254893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
255893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         for (i = 0; i < istop; i++, bp++)
256893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
257893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
258b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            const unsigned int c = i%channels;
259893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            int j;
260b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            unsigned int v, out;
261893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
262893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            v = *bp;
263b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            out = 0;
264b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
265893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c])
266893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
267893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               if (j > 0)
268b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                  out |= v << j;
269b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
270893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               else
271b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                  out |= v >> (-j);
272893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
273b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
274b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            *bp = (png_byte)(out & 0xff);
275893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
276893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
277b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
278893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else
279893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
280893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_bytep bp;
281893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_uint_32 i;
282893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         png_uint_32 istop = channels * row_info->width;
283893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
284893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         for (bp = row, i = 0; i < istop; i++)
285893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
286b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            const unsigned int c = i%channels;
287893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            int j;
288b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            unsigned int value, v;
289893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
290b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            v = png_get_uint_16(bp);
291893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            value = 0;
292b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
293893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c])
294893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
295893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               if (j > 0)
296b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                  value |= v << j;
297b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
298893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               else
299b50c217251b086440efcdb273c22f86a06c80cbaChris Craik                  value |= v >> (-j);
300893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
301b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            *bp++ = (png_byte)((value >> 8) & 0xff);
302893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            *bp++ = (png_byte)(value & 0xff);
303893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
304893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
305893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
306893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
307893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
308893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
3095f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED
310b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripuraristatic void
311893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_do_write_swap_alpha(png_row_infop row_info, png_bytep row)
312893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
3134215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_do_write_swap_alpha");
3145f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
315893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
316893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
317893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
318893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (row_info->bit_depth == 8)
319893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
320b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            /* This converts from ARGB to RGBA */
321893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_bytep sp, dp;
322893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_uint_32 i;
323893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_uint_32 row_width = row_info->width;
324b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
325893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0, sp = dp = row; i < row_width; i++)
326893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
327893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_byte save = *(sp++);
328893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(dp++) = *(sp++);
329893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(dp++) = *(sp++);
330893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(dp++) = *(sp++);
331893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(dp++) = save;
332893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
333893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
334b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
335b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_WRITE_16BIT_SUPPORTED
336893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         else
337893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
338b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            /* This converts from AARRGGBB to RRGGBBAA */
339893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_bytep sp, dp;
340893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_uint_32 i;
341893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_uint_32 row_width = row_info->width;
342893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
343893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0, sp = dp = row; i < row_width; i++)
344893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
345893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_byte save[2];
346893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               save[0] = *(sp++);
347893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               save[1] = *(sp++);
348893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(dp++) = *(sp++);
349893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(dp++) = *(sp++);
350893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(dp++) = *(sp++);
351893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(dp++) = *(sp++);
352893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(dp++) = *(sp++);
353893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(dp++) = *(sp++);
354893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(dp++) = save[0];
355893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(dp++) = save[1];
356893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
357893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
3589b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#endif /* WRITE_16BIT */
359893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
360b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
361893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
362893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
363893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (row_info->bit_depth == 8)
364893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
365b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            /* This converts from AG to GA */
366893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_bytep sp, dp;
367893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_uint_32 i;
368893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_uint_32 row_width = row_info->width;
369893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
370893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0, sp = dp = row; i < row_width; i++)
371893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
372893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_byte save = *(sp++);
373893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(dp++) = *(sp++);
374893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(dp++) = save;
375893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
376893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
377b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
378b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_WRITE_16BIT_SUPPORTED
379893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         else
380893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
381b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            /* This converts from AAGG to GGAA */
382893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_bytep sp, dp;
383893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_uint_32 i;
384893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_uint_32 row_width = row_info->width;
385893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
386893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0, sp = dp = row; i < row_width; i++)
387893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
388893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               png_byte save[2];
389893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               save[0] = *(sp++);
390893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               save[1] = *(sp++);
391893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(dp++) = *(sp++);
392893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(dp++) = *(sp++);
393893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(dp++) = save[0];
394893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(dp++) = save[1];
395893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
396893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
3979b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#endif /* WRITE_16BIT */
398893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
399893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
400893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
401893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
402893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
4035f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED
404b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripuraristatic void
405893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_do_write_invert_alpha(png_row_infop row_info, png_bytep row)
406893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
4074215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project   png_debug(1, "in png_do_write_invert_alpha");
4085f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
409893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   {
410893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
411893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
412893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (row_info->bit_depth == 8)
413893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
414b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            /* This inverts the alpha channel in RGBA */
415893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_bytep sp, dp;
416893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_uint_32 i;
417893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_uint_32 row_width = row_info->width;
418b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
419893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0, sp = dp = row; i < row_width; i++)
420893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
421a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott               /* Does nothing
422893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(dp++) = *(sp++);
423893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(dp++) = *(sp++);
424893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(dp++) = *(sp++);
425893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               */
426893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               sp+=3; dp = sp;
4279b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett               *dp = (png_byte)(255 - *(sp++));
428893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
429893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
430b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
431b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_WRITE_16BIT_SUPPORTED
432893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         else
433893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
434b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            /* This inverts the alpha channel in RRGGBBAA */
435893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_bytep sp, dp;
436893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_uint_32 i;
437893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_uint_32 row_width = row_info->width;
438893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
439893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0, sp = dp = row; i < row_width; i++)
440893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
441a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott               /* Does nothing
442893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(dp++) = *(sp++);
443893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(dp++) = *(sp++);
444893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(dp++) = *(sp++);
445893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(dp++) = *(sp++);
446893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(dp++) = *(sp++);
447893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(dp++) = *(sp++);
448893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               */
449893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               sp+=6; dp = sp;
450893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(dp++) = (png_byte)(255 - *(sp++));
4519b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett               *dp     = (png_byte)(255 - *(sp++));
452893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
453893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
4549b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#endif /* WRITE_16BIT */
455893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
456b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
457893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
458893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      {
459893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         if (row_info->bit_depth == 8)
460893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
461b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            /* This inverts the alpha channel in GA */
462893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_bytep sp, dp;
463893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_uint_32 i;
464893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_uint_32 row_width = row_info->width;
465893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
466893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0, sp = dp = row; i < row_width; i++)
467893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
468893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(dp++) = *(sp++);
469893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(dp++) = (png_byte)(255 - *(sp++));
470893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
471893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
472b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
473b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_WRITE_16BIT_SUPPORTED
474893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         else
475893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         {
476b50c217251b086440efcdb273c22f86a06c80cbaChris Craik            /* This inverts the alpha channel in GGAA */
477893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_bytep sp, dp;
478893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_uint_32 i;
479893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            png_uint_32 row_width = row_info->width;
480893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
481893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            for (i = 0, sp = dp = row; i < row_width; i++)
482893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            {
483a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott               /* Does nothing
484893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(dp++) = *(sp++);
485893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(dp++) = *(sp++);
486893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               */
487893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               sp+=2; dp = sp;
488893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project               *(dp++) = (png_byte)(255 - *(sp++));
4899b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett               *dp     = (png_byte)(255 - *(sp++));
490893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project            }
491893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project         }
4929b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#endif /* WRITE_16BIT */
493893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project      }
494893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project   }
495893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
496893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif
497893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
498b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari/* Transform the data according to the user's wishes.  The order of
499b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari * transformations is significant.
500b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari */
501893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */
502b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripuraripng_do_write_transformations(png_structrp png_ptr, png_row_infop row_info)
503893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{
504b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari   png_debug(1, "in png_do_write_transformations");
5055f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott
506b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari   if (png_ptr == NULL)
507b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari      return;
508893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
509b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED
5109b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if ((png_ptr->transformations & PNG_USER_TRANSFORM) != 0)
511b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari      if (png_ptr->write_user_transform_fn != NULL)
512b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari         (*(png_ptr->write_user_transform_fn)) /* User write transform
513b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari                                                 function */
514b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari             (png_ptr,  /* png_ptr */
515b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari             row_info,  /* row_info: */
516b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari                /*  png_uint_32 width;       width of row */
517b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari                /*  png_size_t rowbytes;     number of bytes in row */
518b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari                /*  png_byte color_type;     color type of pixels */
519b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari                /*  png_byte bit_depth;      bit depth of samples */
520b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari                /*  png_byte channels;       number of channels (1-4) */
521b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari                /*  png_byte pixel_depth;    bits per pixel (depth*channels) */
522b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari             png_ptr->row_buf + 1);      /* start of pixel data for row */
523b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#endif
524b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
525b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#ifdef PNG_WRITE_FILLER_SUPPORTED
5269b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if ((png_ptr->transformations & PNG_FILLER) != 0)
527b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari      png_do_strip_channel(row_info, png_ptr->row_buf + 1,
5287a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis          !(png_ptr->flags & PNG_FLAG_FILLER_AFTER));
529b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#endif
530b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
531b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#ifdef PNG_WRITE_PACKSWAP_SUPPORTED
5329b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if ((png_ptr->transformations & PNG_PACKSWAP) != 0)
533b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari      png_do_packswap(row_info, png_ptr->row_buf + 1);
534b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#endif
535893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
536b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#ifdef PNG_WRITE_PACK_SUPPORTED
5379b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if ((png_ptr->transformations & PNG_PACK) != 0)
538b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari      png_do_pack(row_info, png_ptr->row_buf + 1,
539b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari          (png_uint_32)png_ptr->bit_depth);
540b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#endif
541b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
542b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#ifdef PNG_WRITE_SWAP_SUPPORTED
5439b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#  ifdef PNG_16BIT_SUPPORTED
5449b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if ((png_ptr->transformations & PNG_SWAP_BYTES) != 0)
545b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari      png_do_swap(row_info, png_ptr->row_buf + 1);
5469b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#  endif
547b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#endif
548b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari
549b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#ifdef PNG_WRITE_SHIFT_SUPPORTED
5509b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if ((png_ptr->transformations & PNG_SHIFT) != 0)
551b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari      png_do_shift(row_info, png_ptr->row_buf + 1,
5527a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis           &(png_ptr->shift));
553b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#endif
554893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
555b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED
5569b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if ((png_ptr->transformations & PNG_SWAP_ALPHA) != 0)
557b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari      png_do_write_swap_alpha(row_info, png_ptr->row_buf + 1);
558b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#endif
559b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
560b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED
5619b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if ((png_ptr->transformations & PNG_INVERT_ALPHA) != 0)
562b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari      png_do_write_invert_alpha(row_info, png_ptr->row_buf + 1);
563b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#endif
564b50c217251b086440efcdb273c22f86a06c80cbaChris Craik
565b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#ifdef PNG_WRITE_BGR_SUPPORTED
5669b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if ((png_ptr->transformations & PNG_BGR) != 0)
567b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari      png_do_bgr(row_info, png_ptr->row_buf + 1);
568b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#endif
569893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project
570b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#ifdef PNG_WRITE_INVERT_SUPPORTED
5719b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett   if ((png_ptr->transformations & PNG_INVERT_MONO) != 0)
572b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari      png_do_invert(row_info, png_ptr->row_buf + 1);
573b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#endif
574893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}
5759b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#endif /* WRITE_TRANSFORMS */
5769b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#endif /* WRITE */
577