1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* pngtrans.c - transforms the data in a row (used by both readers and writers)
2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *
3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Last changed in libpng 1.6.2 [April 25, 2013]
4e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Copyright (c) 1998-2013 Glenn Randers-Pehrson
5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
7e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *
8e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * This code is released under the libpng license.
9e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * For conditions of distribution and use, see the disclaimer
10e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * and license in png.h
11e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */
12e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
13e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "pngpriv.h"
14e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
15e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
16e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
17e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
18e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* Turn on BGR-to-RGB mapping */
19e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid PNGAPI
20e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_set_bgr(png_structrp png_ptr)
21e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
22e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   png_debug(1, "in png_set_bgr");
23e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
24e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   if (png_ptr == NULL)
25e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      return;
26e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
27e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   png_ptr->transformations |= PNG_BGR;
28e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
29e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif
30e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
31e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
32e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* Turn on 16 bit byte swapping */
33e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid PNGAPI
34e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_set_swap(png_structrp png_ptr)
35e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
36e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   png_debug(1, "in png_set_swap");
37e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
38e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   if (png_ptr == NULL)
39e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      return;
40e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
41e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   if (png_ptr->bit_depth == 16)
42e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      png_ptr->transformations |= PNG_SWAP_BYTES;
43e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
44e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif
45e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
46e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED)
47e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* Turn on pixel packing */
48e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid PNGAPI
49e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_set_packing(png_structrp png_ptr)
50e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
51e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   png_debug(1, "in png_set_packing");
52e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
53e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   if (png_ptr == NULL)
54e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      return;
55e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
56e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   if (png_ptr->bit_depth < 8)
57e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   {
58e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      png_ptr->transformations |= PNG_PACK;
59e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      png_ptr->usr_bit_depth = 8;
60e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   }
61e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
62e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif
63e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
64e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
65e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* Turn on packed pixel swapping */
66e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid PNGAPI
67e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_set_packswap(png_structrp png_ptr)
68e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
69e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   png_debug(1, "in png_set_packswap");
70e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
71e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   if (png_ptr == NULL)
72e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      return;
73e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
74e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   if (png_ptr->bit_depth < 8)
75e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      png_ptr->transformations |= PNG_PACKSWAP;
76e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
77e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif
78e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
79e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED)
80e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid PNGAPI
81e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_set_shift(png_structrp png_ptr, png_const_color_8p true_bits)
82e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
83e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   png_debug(1, "in png_set_shift");
84e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
85e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   if (png_ptr == NULL)
86e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      return;
87e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
88e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   png_ptr->transformations |= PNG_SHIFT;
89e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   png_ptr->shift = *true_bits;
90e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
91e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif
92e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
93e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if defined(PNG_READ_INTERLACING_SUPPORTED) || \
94e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    defined(PNG_WRITE_INTERLACING_SUPPORTED)
95e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovint PNGAPI
96e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_set_interlace_handling(png_structrp png_ptr)
97e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
98e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   png_debug(1, "in png_set_interlace handling");
99e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
100e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   if (png_ptr && png_ptr->interlaced)
101e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   {
102e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      png_ptr->transformations |= PNG_INTERLACE;
103e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      return (7);
104e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   }
105e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
106e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   return (1);
107e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
108e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif
109e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
110e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)
111e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* Add a filler byte on read, or remove a filler or alpha byte on write.
112e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * The filler type has changed in v0.95 to allow future 2-byte fillers
113e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * for 48-bit input data, as well as to avoid problems with some compilers
114e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * that don't like bytes as parameters.
115e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */
116e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid PNGAPI
117e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_set_filler(png_structrp png_ptr, png_uint_32 filler, int filler_loc)
118e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
119e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   png_debug(1, "in png_set_filler");
120e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
121e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   if (png_ptr == NULL)
122e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      return;
123e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
124e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   /* In libpng 1.6 it is possible to determine whether this is a read or write
125e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    * operation and therefore to do more checking here for a valid call.
126e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    */
127e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   if (png_ptr->mode & PNG_IS_READ_STRUCT)
128e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   {
129e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#     ifdef PNG_READ_FILLER_SUPPORTED
130e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         /* On read png_set_filler is always valid, regardless of the base PNG
131e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov          * format, because other transformations can give a format where the
132e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov          * filler code can execute (basically an 8 or 16-bit component RGB or G
133e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov          * format.)
134e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov          *
135e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov          * NOTE: usr_channels is not used by the read code!  (This has led to
136e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov          * confusion in the past.)  The filler is only used in the read code.
137e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov          */
138e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         png_ptr->filler = (png_uint_16)filler;
139e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#     else
140e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         png_app_error(png_ptr, "png_set_filler not supported on read");
141e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         PNG_UNUSED(filler) /* not used in the write case */
142e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         return;
143e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#     endif
144e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   }
145e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
146e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   else /* write */
147e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   {
148e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#     ifdef PNG_WRITE_FILLER_SUPPORTED
149e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         /* On write the usr_channels parameter must be set correctly at the
150e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov          * start to record the number of channels in the app-supplied data.
151e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov          */
152e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         switch (png_ptr->color_type)
153e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         {
154e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            case PNG_COLOR_TYPE_RGB:
155e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov               png_ptr->usr_channels = 4;
156e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov               break;
157e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
158e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            case PNG_COLOR_TYPE_GRAY:
159e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov               if (png_ptr->bit_depth >= 8)
160e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov               {
161e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                  png_ptr->usr_channels = 2;
162e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                  break;
163e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov               }
164e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
165e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov               else
166e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov               {
167e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                  /* There simply isn't any code in libpng to strip out bits
168e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                   * from bytes when the components are less than a byte in
169e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                   * size!
170e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                   */
171e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                  png_app_error(png_ptr,
172e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                     "png_set_filler is invalid for low bit depth gray output");
173e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                  return;
174e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov               }
175e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
176e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            default:
177e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov               png_app_error(png_ptr,
178e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                  "png_set_filler: inappropriate color type");
179e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov               return;
180e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         }
181e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#     else
182e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         png_app_error(png_ptr, "png_set_filler not supported on write");
183e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         return;
184e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#     endif
185e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   }
186e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
187e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   /* Here on success - libpng supports the operation, set the transformation
188e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    * and the flag to say where the filler channel is.
189e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    */
190e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   png_ptr->transformations |= PNG_FILLER;
191e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
192e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   if (filler_loc == PNG_FILLER_AFTER)
193e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      png_ptr->flags |= PNG_FLAG_FILLER_AFTER;
194e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
195e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   else
196e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER;
197e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
198e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
199e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* Added to libpng-1.2.7 */
200e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid PNGAPI
201e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_set_add_alpha(png_structrp png_ptr, png_uint_32 filler, int filler_loc)
202e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
203e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   png_debug(1, "in png_set_add_alpha");
204e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
205e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   if (png_ptr == NULL)
206e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      return;
207e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
208e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   png_set_filler(png_ptr, filler, filler_loc);
209e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   /* The above may fail to do anything. */
210e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   if (png_ptr->transformations & PNG_FILLER)
211e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      png_ptr->transformations |= PNG_ADD_ALPHA;
212e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
213e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
214e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif
215e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
216e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \
217e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
218e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid PNGAPI
219e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_set_swap_alpha(png_structrp png_ptr)
220e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
221e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   png_debug(1, "in png_set_swap_alpha");
222e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
223e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   if (png_ptr == NULL)
224e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      return;
225e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
226e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   png_ptr->transformations |= PNG_SWAP_ALPHA;
227e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
228e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif
229e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
230e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \
231e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
232e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid PNGAPI
233e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_set_invert_alpha(png_structrp png_ptr)
234e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
235e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   png_debug(1, "in png_set_invert_alpha");
236e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
237e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   if (png_ptr == NULL)
238e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      return;
239e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
240e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   png_ptr->transformations |= PNG_INVERT_ALPHA;
241e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
242e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif
243e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
244e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED)
245e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid PNGAPI
246e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_set_invert_mono(png_structrp png_ptr)
247e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
248e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   png_debug(1, "in png_set_invert_mono");
249e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
250e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   if (png_ptr == NULL)
251e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      return;
252e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
253e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   png_ptr->transformations |= PNG_INVERT_MONO;
254e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
255e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
256e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* Invert monochrome grayscale data */
257e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid /* PRIVATE */
258e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_do_invert(png_row_infop row_info, png_bytep row)
259e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
260e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   png_debug(1, "in png_do_invert");
261e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
262e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov  /* This test removed from libpng version 1.0.13 and 1.2.0:
263e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   *   if (row_info->bit_depth == 1 &&
264e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   */
265e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   if (row_info->color_type == PNG_COLOR_TYPE_GRAY)
266e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   {
267e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      png_bytep rp = row;
268e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      png_size_t i;
269e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      png_size_t istop = row_info->rowbytes;
270e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
271e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      for (i = 0; i < istop; i++)
272e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      {
273e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         *rp = (png_byte)(~(*rp));
274e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         rp++;
275e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      }
276e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   }
277e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
278e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
279e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      row_info->bit_depth == 8)
280e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   {
281e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      png_bytep rp = row;
282e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      png_size_t i;
283e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      png_size_t istop = row_info->rowbytes;
284e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
285e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      for (i = 0; i < istop; i += 2)
286e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      {
287e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         *rp = (png_byte)(~(*rp));
288e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         rp += 2;
289e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      }
290e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   }
291e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
292e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef PNG_16BIT_SUPPORTED
293e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
294e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      row_info->bit_depth == 16)
295e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   {
296e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      png_bytep rp = row;
297e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      png_size_t i;
298e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      png_size_t istop = row_info->rowbytes;
299e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
300e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      for (i = 0; i < istop; i += 4)
301e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      {
302e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         *rp = (png_byte)(~(*rp));
303e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         *(rp + 1) = (png_byte)(~(*(rp + 1)));
304e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         rp += 4;
305e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      }
306e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   }
307e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif
308e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
309e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif
310e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
311e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef PNG_16BIT_SUPPORTED
312e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
313e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* Swaps byte order on 16 bit depth images */
314e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid /* PRIVATE */
315e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_do_swap(png_row_infop row_info, png_bytep row)
316e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
317e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   png_debug(1, "in png_do_swap");
318e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
319e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   if (row_info->bit_depth == 16)
320e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   {
321e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      png_bytep rp = row;
322e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      png_uint_32 i;
323e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      png_uint_32 istop= row_info->width * row_info->channels;
324e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
325e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      for (i = 0; i < istop; i++, rp += 2)
326e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      {
327e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         png_byte t = *rp;
328e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         *rp = *(rp + 1);
329e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         *(rp + 1) = t;
330e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      }
331e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   }
332e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
333e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif
334e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif
335e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
336e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
337e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic PNG_CONST png_byte onebppswaptable[256] = {
338e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,
339e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
340e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8,
341e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
342e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4,
343e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
344e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC,
345e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
346e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2,
347e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
348e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA,
349e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
350e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6,
351e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
352e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE,
353e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
354e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1,
355e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
356e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9,
357e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
358e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5,
359e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
360e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED,
361e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
362e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3,
363e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
364e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB,
365e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
366e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7,
367e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
368e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF,
369e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
370e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov};
371e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
372e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic PNG_CONST png_byte twobppswaptable[256] = {
373e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x00, 0x40, 0x80, 0xC0, 0x10, 0x50, 0x90, 0xD0,
374e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x20, 0x60, 0xA0, 0xE0, 0x30, 0x70, 0xB0, 0xF0,
375e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x04, 0x44, 0x84, 0xC4, 0x14, 0x54, 0x94, 0xD4,
376e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x24, 0x64, 0xA4, 0xE4, 0x34, 0x74, 0xB4, 0xF4,
377e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x08, 0x48, 0x88, 0xC8, 0x18, 0x58, 0x98, 0xD8,
378e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x28, 0x68, 0xA8, 0xE8, 0x38, 0x78, 0xB8, 0xF8,
379e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x0C, 0x4C, 0x8C, 0xCC, 0x1C, 0x5C, 0x9C, 0xDC,
380e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x2C, 0x6C, 0xAC, 0xEC, 0x3C, 0x7C, 0xBC, 0xFC,
381e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x01, 0x41, 0x81, 0xC1, 0x11, 0x51, 0x91, 0xD1,
382e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x21, 0x61, 0xA1, 0xE1, 0x31, 0x71, 0xB1, 0xF1,
383e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x05, 0x45, 0x85, 0xC5, 0x15, 0x55, 0x95, 0xD5,
384e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x25, 0x65, 0xA5, 0xE5, 0x35, 0x75, 0xB5, 0xF5,
385e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x09, 0x49, 0x89, 0xC9, 0x19, 0x59, 0x99, 0xD9,
386e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x29, 0x69, 0xA9, 0xE9, 0x39, 0x79, 0xB9, 0xF9,
387e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x0D, 0x4D, 0x8D, 0xCD, 0x1D, 0x5D, 0x9D, 0xDD,
388e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x2D, 0x6D, 0xAD, 0xED, 0x3D, 0x7D, 0xBD, 0xFD,
389e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x02, 0x42, 0x82, 0xC2, 0x12, 0x52, 0x92, 0xD2,
390e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x22, 0x62, 0xA2, 0xE2, 0x32, 0x72, 0xB2, 0xF2,
391e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x06, 0x46, 0x86, 0xC6, 0x16, 0x56, 0x96, 0xD6,
392e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x26, 0x66, 0xA6, 0xE6, 0x36, 0x76, 0xB6, 0xF6,
393e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x0A, 0x4A, 0x8A, 0xCA, 0x1A, 0x5A, 0x9A, 0xDA,
394e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x2A, 0x6A, 0xAA, 0xEA, 0x3A, 0x7A, 0xBA, 0xFA,
395e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x0E, 0x4E, 0x8E, 0xCE, 0x1E, 0x5E, 0x9E, 0xDE,
396e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x2E, 0x6E, 0xAE, 0xEE, 0x3E, 0x7E, 0xBE, 0xFE,
397e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x03, 0x43, 0x83, 0xC3, 0x13, 0x53, 0x93, 0xD3,
398e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x23, 0x63, 0xA3, 0xE3, 0x33, 0x73, 0xB3, 0xF3,
399e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x07, 0x47, 0x87, 0xC7, 0x17, 0x57, 0x97, 0xD7,
400e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x27, 0x67, 0xA7, 0xE7, 0x37, 0x77, 0xB7, 0xF7,
401e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x0B, 0x4B, 0x8B, 0xCB, 0x1B, 0x5B, 0x9B, 0xDB,
402e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x2B, 0x6B, 0xAB, 0xEB, 0x3B, 0x7B, 0xBB, 0xFB,
403e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x0F, 0x4F, 0x8F, 0xCF, 0x1F, 0x5F, 0x9F, 0xDF,
404e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x2F, 0x6F, 0xAF, 0xEF, 0x3F, 0x7F, 0xBF, 0xFF
405e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov};
406e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
407e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic PNG_CONST png_byte fourbppswaptable[256] = {
408e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70,
409e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0,
410e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71,
411e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1,
412e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72,
413e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x82, 0x92, 0xA2, 0xB2, 0xC2, 0xD2, 0xE2, 0xF2,
414e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73,
415e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x83, 0x93, 0xA3, 0xB3, 0xC3, 0xD3, 0xE3, 0xF3,
416e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74,
417e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x84, 0x94, 0xA4, 0xB4, 0xC4, 0xD4, 0xE4, 0xF4,
418e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75,
419e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x85, 0x95, 0xA5, 0xB5, 0xC5, 0xD5, 0xE5, 0xF5,
420e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76,
421e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x86, 0x96, 0xA6, 0xB6, 0xC6, 0xD6, 0xE6, 0xF6,
422e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77,
423e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x87, 0x97, 0xA7, 0xB7, 0xC7, 0xD7, 0xE7, 0xF7,
424e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78,
425e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x88, 0x98, 0xA8, 0xB8, 0xC8, 0xD8, 0xE8, 0xF8,
426e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79,
427e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, 0xE9, 0xF9,
428e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x0A, 0x1A, 0x2A, 0x3A, 0x4A, 0x5A, 0x6A, 0x7A,
429e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x8A, 0x9A, 0xAA, 0xBA, 0xCA, 0xDA, 0xEA, 0xFA,
430e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x0B, 0x1B, 0x2B, 0x3B, 0x4B, 0x5B, 0x6B, 0x7B,
431e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x8B, 0x9B, 0xAB, 0xBB, 0xCB, 0xDB, 0xEB, 0xFB,
432e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x0C, 0x1C, 0x2C, 0x3C, 0x4C, 0x5C, 0x6C, 0x7C,
433e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x8C, 0x9C, 0xAC, 0xBC, 0xCC, 0xDC, 0xEC, 0xFC,
434e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x0D, 0x1D, 0x2D, 0x3D, 0x4D, 0x5D, 0x6D, 0x7D,
435e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x8D, 0x9D, 0xAD, 0xBD, 0xCD, 0xDD, 0xED, 0xFD,
436e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x0E, 0x1E, 0x2E, 0x3E, 0x4E, 0x5E, 0x6E, 0x7E,
437e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x8E, 0x9E, 0xAE, 0xBE, 0xCE, 0xDE, 0xEE, 0xFE,
438e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x0F, 0x1F, 0x2F, 0x3F, 0x4F, 0x5F, 0x6F, 0x7F,
439e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF
440e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov};
441e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
442e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* Swaps pixel packing order within bytes */
443e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid /* PRIVATE */
444e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_do_packswap(png_row_infop row_info, png_bytep row)
445e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
446e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   png_debug(1, "in png_do_packswap");
447e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
448e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   if (row_info->bit_depth < 8)
449e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   {
450e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      png_bytep rp;
451e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      png_const_bytep end, table;
452e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
453e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      end = row + row_info->rowbytes;
454e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
455e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      if (row_info->bit_depth == 1)
456e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         table = onebppswaptable;
457e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
458e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      else if (row_info->bit_depth == 2)
459e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         table = twobppswaptable;
460e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
461e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      else if (row_info->bit_depth == 4)
462e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         table = fourbppswaptable;
463e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
464e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      else
465e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         return;
466e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
467e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      for (rp = row; rp < end; rp++)
468e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         *rp = table[*rp];
469e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   }
470e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
471e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif /* PNG_READ_PACKSWAP_SUPPORTED or PNG_WRITE_PACKSWAP_SUPPORTED */
472e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
473e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if defined(PNG_WRITE_FILLER_SUPPORTED) || \
474e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
475e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* Remove a channel - this used to be 'png_do_strip_filler' but it used a
476e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * somewhat weird combination of flags to determine what to do.  All the calls
477e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * to png_do_strip_filler are changed in 1.5.2 to call this instead with the
478e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * correct arguments.
479e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *
480e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * The routine isn't general - the channel must be the channel at the start or
481e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * end (not in the middle) of each pixel.
482e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */
483e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid /* PRIVATE */
484e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_do_strip_channel(png_row_infop row_info, png_bytep row, int at_start)
485e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
486e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   png_bytep sp = row; /* source pointer */
487e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   png_bytep dp = row; /* destination pointer */
488e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   png_bytep ep = row + row_info->rowbytes; /* One beyond end of row */
489e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
490e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   /* At the start sp will point to the first byte to copy and dp to where
491e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    * it is copied to.  ep always points just beyond the end of the row, so
492e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    * the loop simply copies (channels-1) channels until sp reaches ep.
493e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    *
494e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    * at_start:        0 -- convert AG, XG, ARGB, XRGB, AAGG, XXGG, etc.
495e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    *            nonzero -- convert GA, GX, RGBA, RGBX, GGAA, RRGGBBXX, etc.
496e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    */
497e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
498e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   /* GA, GX, XG cases */
499e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   if (row_info->channels == 2)
500e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   {
501e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      if (row_info->bit_depth == 8)
502e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      {
503e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         if (at_start) /* Skip initial filler */
504e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            ++sp;
505e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         else          /* Skip initial channel and, for sp, the filler */
506e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            sp += 2, ++dp;
507e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
508e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         /* For a 1 pixel wide image there is nothing to do */
509e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         while (sp < ep)
510e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            *dp++ = *sp, sp += 2;
511e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
512e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         row_info->pixel_depth = 8;
513e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      }
514e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
515e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      else if (row_info->bit_depth == 16)
516e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      {
517e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         if (at_start) /* Skip initial filler */
518e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            sp += 2;
519e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         else          /* Skip initial channel and, for sp, the filler */
520e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            sp += 4, dp += 2;
521e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
522e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         while (sp < ep)
523e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            *dp++ = *sp++, *dp++ = *sp, sp += 3;
524e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
525e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         row_info->pixel_depth = 16;
526e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      }
527e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
528e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      else
529e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         return; /* bad bit depth */
530e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
531e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      row_info->channels = 1;
532e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
533e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      /* Finally fix the color type if it records an alpha channel */
534e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
535e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         row_info->color_type = PNG_COLOR_TYPE_GRAY;
536e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   }
537e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
538e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   /* RGBA, RGBX, XRGB cases */
539e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   else if (row_info->channels == 4)
540e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   {
541e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      if (row_info->bit_depth == 8)
542e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      {
543e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         if (at_start) /* Skip initial filler */
544e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            ++sp;
545e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         else          /* Skip initial channels and, for sp, the filler */
546e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            sp += 4, dp += 3;
547e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
548e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         /* Note that the loop adds 3 to dp and 4 to sp each time. */
549e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         while (sp < ep)
550e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            *dp++ = *sp++, *dp++ = *sp++, *dp++ = *sp, sp += 2;
551e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
552e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         row_info->pixel_depth = 24;
553e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      }
554e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
555e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      else if (row_info->bit_depth == 16)
556e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      {
557e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         if (at_start) /* Skip initial filler */
558e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            sp += 2;
559e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         else          /* Skip initial channels and, for sp, the filler */
560e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            sp += 8, dp += 6;
561e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
562e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         while (sp < ep)
563e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         {
564e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            /* Copy 6 bytes, skip 2 */
565e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            *dp++ = *sp++, *dp++ = *sp++;
566e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            *dp++ = *sp++, *dp++ = *sp++;
567e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            *dp++ = *sp++, *dp++ = *sp, sp += 3;
568e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         }
569e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
570e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         row_info->pixel_depth = 48;
571e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      }
572e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
573e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      else
574e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         return; /* bad bit depth */
575e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
576e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      row_info->channels = 3;
577e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
578e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      /* Finally fix the color type if it records an alpha channel */
579e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
580e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         row_info->color_type = PNG_COLOR_TYPE_RGB;
581e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   }
582e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
583e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   else
584e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      return; /* The filler channel has gone already */
585e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
586e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   /* Fix the rowbytes value. */
587e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   row_info->rowbytes = dp-row;
588e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
589e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif
590e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
591e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
592e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* Swaps red and blue bytes within a pixel */
593e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid /* PRIVATE */
594e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_do_bgr(png_row_infop row_info, png_bytep row)
595e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
596e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   png_debug(1, "in png_do_bgr");
597e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
598e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   if ((row_info->color_type & PNG_COLOR_MASK_COLOR))
599e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   {
600e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      png_uint_32 row_width = row_info->width;
601e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      if (row_info->bit_depth == 8)
602e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      {
603e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         if (row_info->color_type == PNG_COLOR_TYPE_RGB)
604e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         {
605e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            png_bytep rp;
606e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            png_uint_32 i;
607e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
608e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            for (i = 0, rp = row; i < row_width; i++, rp += 3)
609e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            {
610e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov               png_byte save = *rp;
611e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov               *rp = *(rp + 2);
612e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov               *(rp + 2) = save;
613e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
614e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         }
615e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
616e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
617e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         {
618e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            png_bytep rp;
619e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            png_uint_32 i;
620e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
621e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            for (i = 0, rp = row; i < row_width; i++, rp += 4)
622e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            {
623e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov               png_byte save = *rp;
624e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov               *rp = *(rp + 2);
625e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov               *(rp + 2) = save;
626e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
627e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         }
628e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      }
629e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
630e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef PNG_16BIT_SUPPORTED
631e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      else if (row_info->bit_depth == 16)
632e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      {
633e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         if (row_info->color_type == PNG_COLOR_TYPE_RGB)
634e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         {
635e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            png_bytep rp;
636e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            png_uint_32 i;
637e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
638e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            for (i = 0, rp = row; i < row_width; i++, rp += 6)
639e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            {
640e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov               png_byte save = *rp;
641e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov               *rp = *(rp + 4);
642e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov               *(rp + 4) = save;
643e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov               save = *(rp + 1);
644e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov               *(rp + 1) = *(rp + 5);
645e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov               *(rp + 5) = save;
646e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
647e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         }
648e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
649e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
650e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         {
651e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            png_bytep rp;
652e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            png_uint_32 i;
653e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
654e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            for (i = 0, rp = row; i < row_width; i++, rp += 8)
655e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            {
656e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov               png_byte save = *rp;
657e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov               *rp = *(rp + 4);
658e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov               *(rp + 4) = save;
659e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov               save = *(rp + 1);
660e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov               *(rp + 1) = *(rp + 5);
661e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov               *(rp + 5) = save;
662e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
663e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         }
664e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      }
665e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif
666e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   }
667e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
668e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */
669e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
670e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if defined(PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED) || \
671e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    defined(PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED)
672e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* Added at libpng-1.5.10 */
673e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid /* PRIVATE */
674e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_do_check_palette_indexes(png_structrp png_ptr, png_row_infop row_info)
675e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
676e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   if (png_ptr->num_palette < (1 << row_info->bit_depth) &&
677e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      png_ptr->num_palette > 0) /* num_palette can be 0 in MNG files */
678e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   {
679e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      /* Calculations moved outside switch in an attempt to stop different
680e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov       * compiler warnings.  'padding' is in *bits* within the last byte, it is
681e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov       * an 'int' because pixel_depth becomes an 'int' in the expression below,
682e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov       * and this calculation is used because it avoids warnings that other
683e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov       * forms produced on either GCC or MSVC.
684e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov       */
685e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      int padding = (-row_info->pixel_depth * row_info->width) & 7;
686e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      png_bytep rp = png_ptr->row_buf + row_info->rowbytes;
687e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
688e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      switch (row_info->bit_depth)
689e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      {
690e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         case 1:
691e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         {
692e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            /* in this case, all bytes must be 0 so we don't need
693e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov             * to unpack the pixels except for the rightmost one.
694e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov             */
695e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            for (; rp > png_ptr->row_buf; rp--)
696e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            {
697e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov              if (*rp >> padding != 0)
698e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                 png_ptr->num_palette_max = 1;
699e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov              padding = 0;
700e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
701e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
702e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            break;
703e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         }
704e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
705e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         case 2:
706e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         {
707e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            for (; rp > png_ptr->row_buf; rp--)
708e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            {
709e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov              int i = ((*rp >> padding) & 0x03);
710e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
711e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov              if (i > png_ptr->num_palette_max)
712e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                 png_ptr->num_palette_max = i;
713e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
714e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov              i = (((*rp >> padding) >> 2) & 0x03);
715e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
716e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov              if (i > png_ptr->num_palette_max)
717e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                 png_ptr->num_palette_max = i;
718e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
719e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov              i = (((*rp >> padding) >> 4) & 0x03);
720e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
721e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov              if (i > png_ptr->num_palette_max)
722e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                 png_ptr->num_palette_max = i;
723e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
724e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov              i = (((*rp >> padding) >> 6) & 0x03);
725e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
726e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov              if (i > png_ptr->num_palette_max)
727e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                 png_ptr->num_palette_max = i;
728e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
729e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov              padding = 0;
730e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
731e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
732e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            break;
733e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         }
734e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
735e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         case 4:
736e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         {
737e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            for (; rp > png_ptr->row_buf; rp--)
738e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            {
739e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov              int i = ((*rp >> padding) & 0x0f);
740e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
741e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov              if (i > png_ptr->num_palette_max)
742e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                 png_ptr->num_palette_max = i;
743e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
744e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov              i = (((*rp >> padding) >> 4) & 0x0f);
745e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
746e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov              if (i > png_ptr->num_palette_max)
747e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                 png_ptr->num_palette_max = i;
748e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
749e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov              padding = 0;
750e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
751e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
752e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            break;
753e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         }
754e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
755e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         case 8:
756e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         {
757e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            for (; rp > png_ptr->row_buf; rp--)
758e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            {
759e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov               if (*rp > png_ptr->num_palette_max)
760e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov                  png_ptr->num_palette_max = (int) *rp;
761e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            }
762e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
763e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            break;
764e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         }
765e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
766e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov         default:
767e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            break;
768e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      }
769e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   }
770e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
771e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif /* PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED */
772e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
773e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
774e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
775e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED
776e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid PNGAPI
777e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_set_user_transform_info(png_structrp png_ptr, png_voidp
778e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   user_transform_ptr, int user_transform_depth, int user_transform_channels)
779e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
780e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   png_debug(1, "in png_set_user_transform_info");
781e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
782e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   if (png_ptr == NULL)
783e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      return;
784e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
785e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED
786e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0 &&
787e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      (png_ptr->flags & PNG_FLAG_ROW_INIT) != 0)
788e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   {
789e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      png_app_error(png_ptr,
790e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov            "info change after png_start_read_image or png_read_update_info");
791e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      return;
792e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   }
793e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif
794e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
795e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   png_ptr->user_transform_ptr = user_transform_ptr;
796e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   png_ptr->user_transform_depth = (png_byte)user_transform_depth;
797e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   png_ptr->user_transform_channels = (png_byte)user_transform_channels;
798e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
799e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif
800e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
801e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* This function returns a pointer to the user_transform_ptr associated with
802e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * the user transform functions.  The application should free any memory
803e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * associated with this pointer before png_write_destroy and png_read_destroy
804e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * are called.
805e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */
806e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED
807e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_voidp PNGAPI
808e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_get_user_transform_ptr(png_const_structrp png_ptr)
809e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
810e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   if (png_ptr == NULL)
811e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      return (NULL);
812e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
813e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   return png_ptr->user_transform_ptr;
814e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
815e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif
816e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
817e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef PNG_USER_TRANSFORM_INFO_SUPPORTED
818e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_uint_32 PNGAPI
819e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_get_current_row_number(png_const_structrp png_ptr)
820e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
821e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   /* See the comments in png.h - this is the sub-image row when reading and
822e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    * interlaced image.
823e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov    */
824e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   if (png_ptr != NULL)
825e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      return png_ptr->row_number;
826e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
827e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   return PNG_UINT_32_MAX; /* help the app not to fail silently */
828e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
829e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
830e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_byte PNGAPI
831e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_get_current_pass_number(png_const_structrp png_ptr)
832e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{
833e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   if (png_ptr != NULL)
834e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov      return png_ptr->pass;
835e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov   return 8; /* invalid */
836e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
837e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif /* PNG_USER_TRANSFORM_INFO_SUPPORTED */
838e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif /* PNG_READ_USER_TRANSFORM_SUPPORTED ||
839e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov          PNG_WRITE_USER_TRANSFORM_SUPPORTED */
840e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */
841