xref: /plan9/sys/src/cmd/gs/libpng/pngtrans.c (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
17dd7cddfSDavid du Colombier 
27dd7cddfSDavid du Colombier /* pngtrans.c - transforms the data in a row (used by both readers and writers)
37dd7cddfSDavid du Colombier  *
4*593dc095SDavid du Colombier  * libpng  1.2.8 - December 3, 2004
57dd7cddfSDavid du Colombier  * For conditions of distribution and use, see copyright notice in png.h
6*593dc095SDavid du Colombier  * Copyright (c) 1998-2004 Glenn Randers-Pehrson
7*593dc095SDavid du Colombier  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
8*593dc095SDavid du Colombier  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
97dd7cddfSDavid du Colombier  */
107dd7cddfSDavid du Colombier 
117dd7cddfSDavid du Colombier #define PNG_INTERNAL
127dd7cddfSDavid du Colombier #include "png.h"
137dd7cddfSDavid du Colombier 
147dd7cddfSDavid du Colombier #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
15*593dc095SDavid du Colombier /* turn on BGR-to-RGB mapping */
16*593dc095SDavid du Colombier void PNGAPI
png_set_bgr(png_structp png_ptr)177dd7cddfSDavid du Colombier png_set_bgr(png_structp png_ptr)
187dd7cddfSDavid du Colombier {
197dd7cddfSDavid du Colombier    png_debug(1, "in png_set_bgr\n");
207dd7cddfSDavid du Colombier    png_ptr->transformations |= PNG_BGR;
217dd7cddfSDavid du Colombier }
227dd7cddfSDavid du Colombier #endif
237dd7cddfSDavid du Colombier 
247dd7cddfSDavid du Colombier #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
257dd7cddfSDavid du Colombier /* turn on 16 bit byte swapping */
26*593dc095SDavid du Colombier void PNGAPI
png_set_swap(png_structp png_ptr)277dd7cddfSDavid du Colombier png_set_swap(png_structp png_ptr)
287dd7cddfSDavid du Colombier {
297dd7cddfSDavid du Colombier    png_debug(1, "in png_set_swap\n");
307dd7cddfSDavid du Colombier    if (png_ptr->bit_depth == 16)
317dd7cddfSDavid du Colombier       png_ptr->transformations |= PNG_SWAP_BYTES;
327dd7cddfSDavid du Colombier }
337dd7cddfSDavid du Colombier #endif
347dd7cddfSDavid du Colombier 
357dd7cddfSDavid du Colombier #if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED)
367dd7cddfSDavid du Colombier /* turn on pixel packing */
37*593dc095SDavid du Colombier void PNGAPI
png_set_packing(png_structp png_ptr)387dd7cddfSDavid du Colombier png_set_packing(png_structp png_ptr)
397dd7cddfSDavid du Colombier {
407dd7cddfSDavid du Colombier    png_debug(1, "in png_set_packing\n");
417dd7cddfSDavid du Colombier    if (png_ptr->bit_depth < 8)
427dd7cddfSDavid du Colombier    {
437dd7cddfSDavid du Colombier       png_ptr->transformations |= PNG_PACK;
447dd7cddfSDavid du Colombier       png_ptr->usr_bit_depth = 8;
457dd7cddfSDavid du Colombier    }
467dd7cddfSDavid du Colombier }
477dd7cddfSDavid du Colombier #endif
487dd7cddfSDavid du Colombier 
497dd7cddfSDavid du Colombier #if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
507dd7cddfSDavid du Colombier /* turn on packed pixel swapping */
51*593dc095SDavid du Colombier void PNGAPI
png_set_packswap(png_structp png_ptr)527dd7cddfSDavid du Colombier png_set_packswap(png_structp png_ptr)
537dd7cddfSDavid du Colombier {
547dd7cddfSDavid du Colombier    png_debug(1, "in png_set_packswap\n");
557dd7cddfSDavid du Colombier    if (png_ptr->bit_depth < 8)
567dd7cddfSDavid du Colombier       png_ptr->transformations |= PNG_PACKSWAP;
577dd7cddfSDavid du Colombier }
587dd7cddfSDavid du Colombier #endif
597dd7cddfSDavid du Colombier 
607dd7cddfSDavid du Colombier #if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED)
61*593dc095SDavid du Colombier void PNGAPI
png_set_shift(png_structp png_ptr,png_color_8p true_bits)627dd7cddfSDavid du Colombier png_set_shift(png_structp png_ptr, png_color_8p true_bits)
637dd7cddfSDavid du Colombier {
647dd7cddfSDavid du Colombier    png_debug(1, "in png_set_shift\n");
657dd7cddfSDavid du Colombier    png_ptr->transformations |= PNG_SHIFT;
667dd7cddfSDavid du Colombier    png_ptr->shift = *true_bits;
677dd7cddfSDavid du Colombier }
687dd7cddfSDavid du Colombier #endif
697dd7cddfSDavid du Colombier 
707dd7cddfSDavid du Colombier #if defined(PNG_READ_INTERLACING_SUPPORTED) || \
717dd7cddfSDavid du Colombier     defined(PNG_WRITE_INTERLACING_SUPPORTED)
72*593dc095SDavid du Colombier int PNGAPI
png_set_interlace_handling(png_structp png_ptr)737dd7cddfSDavid du Colombier png_set_interlace_handling(png_structp png_ptr)
747dd7cddfSDavid du Colombier {
757dd7cddfSDavid du Colombier    png_debug(1, "in png_set_interlace handling\n");
767dd7cddfSDavid du Colombier    if (png_ptr->interlaced)
777dd7cddfSDavid du Colombier    {
787dd7cddfSDavid du Colombier       png_ptr->transformations |= PNG_INTERLACE;
797dd7cddfSDavid du Colombier       return (7);
807dd7cddfSDavid du Colombier    }
817dd7cddfSDavid du Colombier 
827dd7cddfSDavid du Colombier    return (1);
837dd7cddfSDavid du Colombier }
847dd7cddfSDavid du Colombier #endif
857dd7cddfSDavid du Colombier 
867dd7cddfSDavid du Colombier #if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)
877dd7cddfSDavid du Colombier /* Add a filler byte on read, or remove a filler or alpha byte on write.
887dd7cddfSDavid du Colombier  * The filler type has changed in v0.95 to allow future 2-byte fillers
89*593dc095SDavid du Colombier  * for 48-bit input data, as well as to avoid problems with some compilers
90*593dc095SDavid du Colombier  * that don't like bytes as parameters.
917dd7cddfSDavid du Colombier  */
92*593dc095SDavid du Colombier void PNGAPI
png_set_filler(png_structp png_ptr,png_uint_32 filler,int filler_loc)937dd7cddfSDavid du Colombier png_set_filler(png_structp png_ptr, png_uint_32 filler, int filler_loc)
947dd7cddfSDavid du Colombier {
957dd7cddfSDavid du Colombier    png_debug(1, "in png_set_filler\n");
967dd7cddfSDavid du Colombier    png_ptr->transformations |= PNG_FILLER;
977dd7cddfSDavid du Colombier    png_ptr->filler = (png_byte)filler;
987dd7cddfSDavid du Colombier    if (filler_loc == PNG_FILLER_AFTER)
997dd7cddfSDavid du Colombier       png_ptr->flags |= PNG_FLAG_FILLER_AFTER;
1007dd7cddfSDavid du Colombier    else
1017dd7cddfSDavid du Colombier       png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER;
1027dd7cddfSDavid du Colombier 
103*593dc095SDavid du Colombier    /* This should probably go in the "do_read_filler" routine.
104*593dc095SDavid du Colombier     * I attempted to do that in libpng-1.0.1a but that caused problems
105*593dc095SDavid du Colombier     * so I restored it in libpng-1.0.2a
106*593dc095SDavid du Colombier    */
107*593dc095SDavid du Colombier 
108*593dc095SDavid du Colombier    if (png_ptr->color_type == PNG_COLOR_TYPE_RGB)
1097dd7cddfSDavid du Colombier    {
1107dd7cddfSDavid du Colombier       png_ptr->usr_channels = 4;
1117dd7cddfSDavid du Colombier    }
112*593dc095SDavid du Colombier 
113*593dc095SDavid du Colombier    /* Also I added this in libpng-1.0.2a (what happens when we expand
114*593dc095SDavid du Colombier     * a less-than-8-bit grayscale to GA? */
115*593dc095SDavid du Colombier 
116*593dc095SDavid du Colombier    if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY && png_ptr->bit_depth >= 8)
117*593dc095SDavid du Colombier    {
118*593dc095SDavid du Colombier       png_ptr->usr_channels = 2;
1197dd7cddfSDavid du Colombier    }
120*593dc095SDavid du Colombier }
121*593dc095SDavid du Colombier 
122*593dc095SDavid du Colombier #if !defined(PNG_1_0_X)
123*593dc095SDavid du Colombier /* Added to libpng-1.2.7 */
124*593dc095SDavid du Colombier void PNGAPI
png_set_add_alpha(png_structp png_ptr,png_uint_32 filler,int filler_loc)125*593dc095SDavid du Colombier png_set_add_alpha(png_structp png_ptr, png_uint_32 filler, int filler_loc)
126*593dc095SDavid du Colombier {
127*593dc095SDavid du Colombier    png_debug(1, "in png_set_add_alpha\n");
128*593dc095SDavid du Colombier    png_set_filler(png_ptr, filler, filler_loc);
129*593dc095SDavid du Colombier    png_ptr->transformations |= PNG_ADD_ALPHA;
130*593dc095SDavid du Colombier }
131*593dc095SDavid du Colombier #endif
132*593dc095SDavid du Colombier 
1337dd7cddfSDavid du Colombier #endif
1347dd7cddfSDavid du Colombier 
1357dd7cddfSDavid du Colombier #if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \
1367dd7cddfSDavid du Colombier     defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
137*593dc095SDavid du Colombier void PNGAPI
png_set_swap_alpha(png_structp png_ptr)1387dd7cddfSDavid du Colombier png_set_swap_alpha(png_structp png_ptr)
1397dd7cddfSDavid du Colombier {
1407dd7cddfSDavid du Colombier    png_debug(1, "in png_set_swap_alpha\n");
1417dd7cddfSDavid du Colombier    png_ptr->transformations |= PNG_SWAP_ALPHA;
1427dd7cddfSDavid du Colombier }
1437dd7cddfSDavid du Colombier #endif
1447dd7cddfSDavid du Colombier 
1457dd7cddfSDavid du Colombier #if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \
1467dd7cddfSDavid du Colombier     defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
147*593dc095SDavid du Colombier void PNGAPI
png_set_invert_alpha(png_structp png_ptr)1487dd7cddfSDavid du Colombier png_set_invert_alpha(png_structp png_ptr)
1497dd7cddfSDavid du Colombier {
1507dd7cddfSDavid du Colombier    png_debug(1, "in png_set_invert_alpha\n");
1517dd7cddfSDavid du Colombier    png_ptr->transformations |= PNG_INVERT_ALPHA;
1527dd7cddfSDavid du Colombier }
1537dd7cddfSDavid du Colombier #endif
1547dd7cddfSDavid du Colombier 
1557dd7cddfSDavid du Colombier #if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED)
156*593dc095SDavid du Colombier void PNGAPI
png_set_invert_mono(png_structp png_ptr)1577dd7cddfSDavid du Colombier png_set_invert_mono(png_structp png_ptr)
1587dd7cddfSDavid du Colombier {
1597dd7cddfSDavid du Colombier    png_debug(1, "in png_set_invert_mono\n");
1607dd7cddfSDavid du Colombier    png_ptr->transformations |= PNG_INVERT_MONO;
1617dd7cddfSDavid du Colombier }
1627dd7cddfSDavid du Colombier 
163*593dc095SDavid du Colombier /* invert monochrome grayscale data */
164*593dc095SDavid du Colombier void /* PRIVATE */
png_do_invert(png_row_infop row_info,png_bytep row)1657dd7cddfSDavid du Colombier png_do_invert(png_row_infop row_info, png_bytep row)
1667dd7cddfSDavid du Colombier {
1677dd7cddfSDavid du Colombier    png_debug(1, "in png_do_invert\n");
168*593dc095SDavid du Colombier   /* This test removed from libpng version 1.0.13 and 1.2.0:
169*593dc095SDavid du Colombier    *   if (row_info->bit_depth == 1 &&
170*593dc095SDavid du Colombier    */
1717dd7cddfSDavid du Colombier #if defined(PNG_USELESS_TESTS_SUPPORTED)
172*593dc095SDavid du Colombier    if (row == NULL || row_info == NULL)
173*593dc095SDavid du Colombier      return;
1747dd7cddfSDavid du Colombier #endif
175*593dc095SDavid du Colombier    if (row_info->color_type == PNG_COLOR_TYPE_GRAY)
1767dd7cddfSDavid du Colombier    {
177*593dc095SDavid du Colombier       png_bytep rp = row;
1787dd7cddfSDavid du Colombier       png_uint_32 i;
179*593dc095SDavid du Colombier       png_uint_32 istop = row_info->rowbytes;
1807dd7cddfSDavid du Colombier 
181*593dc095SDavid du Colombier       for (i = 0; i < istop; i++)
1827dd7cddfSDavid du Colombier       {
1837dd7cddfSDavid du Colombier          *rp = (png_byte)(~(*rp));
184*593dc095SDavid du Colombier          rp++;
185*593dc095SDavid du Colombier       }
186*593dc095SDavid du Colombier    }
187*593dc095SDavid du Colombier    else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
188*593dc095SDavid du Colombier       row_info->bit_depth == 8)
189*593dc095SDavid du Colombier    {
190*593dc095SDavid du Colombier       png_bytep rp = row;
191*593dc095SDavid du Colombier       png_uint_32 i;
192*593dc095SDavid du Colombier       png_uint_32 istop = row_info->rowbytes;
193*593dc095SDavid du Colombier 
194*593dc095SDavid du Colombier       for (i = 0; i < istop; i+=2)
195*593dc095SDavid du Colombier       {
196*593dc095SDavid du Colombier          *rp = (png_byte)(~(*rp));
197*593dc095SDavid du Colombier          rp+=2;
198*593dc095SDavid du Colombier       }
199*593dc095SDavid du Colombier    }
200*593dc095SDavid du Colombier    else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
201*593dc095SDavid du Colombier       row_info->bit_depth == 16)
202*593dc095SDavid du Colombier    {
203*593dc095SDavid du Colombier       png_bytep rp = row;
204*593dc095SDavid du Colombier       png_uint_32 i;
205*593dc095SDavid du Colombier       png_uint_32 istop = row_info->rowbytes;
206*593dc095SDavid du Colombier 
207*593dc095SDavid du Colombier       for (i = 0; i < istop; i+=4)
208*593dc095SDavid du Colombier       {
209*593dc095SDavid du Colombier          *rp = (png_byte)(~(*rp));
210*593dc095SDavid du Colombier          *(rp+1) = (png_byte)(~(*(rp+1)));
211*593dc095SDavid du Colombier          rp+=4;
2127dd7cddfSDavid du Colombier       }
2137dd7cddfSDavid du Colombier    }
2147dd7cddfSDavid du Colombier }
2157dd7cddfSDavid du Colombier #endif
2167dd7cddfSDavid du Colombier 
2177dd7cddfSDavid du Colombier #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
2187dd7cddfSDavid du Colombier /* swaps byte order on 16 bit depth images */
219*593dc095SDavid du Colombier void /* PRIVATE */
png_do_swap(png_row_infop row_info,png_bytep row)2207dd7cddfSDavid du Colombier png_do_swap(png_row_infop row_info, png_bytep row)
2217dd7cddfSDavid du Colombier {
2227dd7cddfSDavid du Colombier    png_debug(1, "in png_do_swap\n");
2237dd7cddfSDavid du Colombier    if (
2247dd7cddfSDavid du Colombier #if defined(PNG_USELESS_TESTS_SUPPORTED)
2257dd7cddfSDavid du Colombier        row != NULL && row_info != NULL &&
2267dd7cddfSDavid du Colombier #endif
2277dd7cddfSDavid du Colombier        row_info->bit_depth == 16)
2287dd7cddfSDavid du Colombier    {
229*593dc095SDavid du Colombier       png_bytep rp = row;
2307dd7cddfSDavid du Colombier       png_uint_32 i;
231*593dc095SDavid du Colombier       png_uint_32 istop= row_info->width * row_info->channels;
2327dd7cddfSDavid du Colombier 
233*593dc095SDavid du Colombier       for (i = 0; i < istop; i++, rp += 2)
2347dd7cddfSDavid du Colombier       {
235*593dc095SDavid du Colombier          png_byte t = *rp;
2367dd7cddfSDavid du Colombier          *rp = *(rp + 1);
2377dd7cddfSDavid du Colombier          *(rp + 1) = t;
2387dd7cddfSDavid du Colombier       }
2397dd7cddfSDavid du Colombier    }
2407dd7cddfSDavid du Colombier }
2417dd7cddfSDavid du Colombier #endif
2427dd7cddfSDavid du Colombier 
2437dd7cddfSDavid du Colombier #if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
2447dd7cddfSDavid du Colombier static png_byte onebppswaptable[256] = {
2457dd7cddfSDavid du Colombier    0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,
2467dd7cddfSDavid du Colombier    0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
2477dd7cddfSDavid du Colombier    0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8,
2487dd7cddfSDavid du Colombier    0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
2497dd7cddfSDavid du Colombier    0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4,
2507dd7cddfSDavid du Colombier    0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
2517dd7cddfSDavid du Colombier    0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC,
2527dd7cddfSDavid du Colombier    0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
2537dd7cddfSDavid du Colombier    0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2,
2547dd7cddfSDavid du Colombier    0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
2557dd7cddfSDavid du Colombier    0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA,
2567dd7cddfSDavid du Colombier    0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
2577dd7cddfSDavid du Colombier    0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6,
2587dd7cddfSDavid du Colombier    0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
2597dd7cddfSDavid du Colombier    0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE,
2607dd7cddfSDavid du Colombier    0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
2617dd7cddfSDavid du Colombier    0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1,
2627dd7cddfSDavid du Colombier    0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
2637dd7cddfSDavid du Colombier    0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9,
2647dd7cddfSDavid du Colombier    0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
2657dd7cddfSDavid du Colombier    0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5,
2667dd7cddfSDavid du Colombier    0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
2677dd7cddfSDavid du Colombier    0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED,
2687dd7cddfSDavid du Colombier    0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
2697dd7cddfSDavid du Colombier    0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3,
2707dd7cddfSDavid du Colombier    0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
2717dd7cddfSDavid du Colombier    0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB,
2727dd7cddfSDavid du Colombier    0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
2737dd7cddfSDavid du Colombier    0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7,
2747dd7cddfSDavid du Colombier    0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
2757dd7cddfSDavid du Colombier    0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF,
2767dd7cddfSDavid du Colombier    0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
2777dd7cddfSDavid du Colombier };
2787dd7cddfSDavid du Colombier 
2797dd7cddfSDavid du Colombier static png_byte twobppswaptable[256] = {
2807dd7cddfSDavid du Colombier    0x00, 0x40, 0x80, 0xC0, 0x10, 0x50, 0x90, 0xD0,
2817dd7cddfSDavid du Colombier    0x20, 0x60, 0xA0, 0xE0, 0x30, 0x70, 0xB0, 0xF0,
2827dd7cddfSDavid du Colombier    0x04, 0x44, 0x84, 0xC4, 0x14, 0x54, 0x94, 0xD4,
2837dd7cddfSDavid du Colombier    0x24, 0x64, 0xA4, 0xE4, 0x34, 0x74, 0xB4, 0xF4,
2847dd7cddfSDavid du Colombier    0x08, 0x48, 0x88, 0xC8, 0x18, 0x58, 0x98, 0xD8,
2857dd7cddfSDavid du Colombier    0x28, 0x68, 0xA8, 0xE8, 0x38, 0x78, 0xB8, 0xF8,
2867dd7cddfSDavid du Colombier    0x0C, 0x4C, 0x8C, 0xCC, 0x1C, 0x5C, 0x9C, 0xDC,
2877dd7cddfSDavid du Colombier    0x2C, 0x6C, 0xAC, 0xEC, 0x3C, 0x7C, 0xBC, 0xFC,
2887dd7cddfSDavid du Colombier    0x01, 0x41, 0x81, 0xC1, 0x11, 0x51, 0x91, 0xD1,
2897dd7cddfSDavid du Colombier    0x21, 0x61, 0xA1, 0xE1, 0x31, 0x71, 0xB1, 0xF1,
2907dd7cddfSDavid du Colombier    0x05, 0x45, 0x85, 0xC5, 0x15, 0x55, 0x95, 0xD5,
2917dd7cddfSDavid du Colombier    0x25, 0x65, 0xA5, 0xE5, 0x35, 0x75, 0xB5, 0xF5,
2927dd7cddfSDavid du Colombier    0x09, 0x49, 0x89, 0xC9, 0x19, 0x59, 0x99, 0xD9,
2937dd7cddfSDavid du Colombier    0x29, 0x69, 0xA9, 0xE9, 0x39, 0x79, 0xB9, 0xF9,
2947dd7cddfSDavid du Colombier    0x0D, 0x4D, 0x8D, 0xCD, 0x1D, 0x5D, 0x9D, 0xDD,
2957dd7cddfSDavid du Colombier    0x2D, 0x6D, 0xAD, 0xED, 0x3D, 0x7D, 0xBD, 0xFD,
2967dd7cddfSDavid du Colombier    0x02, 0x42, 0x82, 0xC2, 0x12, 0x52, 0x92, 0xD2,
2977dd7cddfSDavid du Colombier    0x22, 0x62, 0xA2, 0xE2, 0x32, 0x72, 0xB2, 0xF2,
2987dd7cddfSDavid du Colombier    0x06, 0x46, 0x86, 0xC6, 0x16, 0x56, 0x96, 0xD6,
2997dd7cddfSDavid du Colombier    0x26, 0x66, 0xA6, 0xE6, 0x36, 0x76, 0xB6, 0xF6,
3007dd7cddfSDavid du Colombier    0x0A, 0x4A, 0x8A, 0xCA, 0x1A, 0x5A, 0x9A, 0xDA,
3017dd7cddfSDavid du Colombier    0x2A, 0x6A, 0xAA, 0xEA, 0x3A, 0x7A, 0xBA, 0xFA,
3027dd7cddfSDavid du Colombier    0x0E, 0x4E, 0x8E, 0xCE, 0x1E, 0x5E, 0x9E, 0xDE,
3037dd7cddfSDavid du Colombier    0x2E, 0x6E, 0xAE, 0xEE, 0x3E, 0x7E, 0xBE, 0xFE,
3047dd7cddfSDavid du Colombier    0x03, 0x43, 0x83, 0xC3, 0x13, 0x53, 0x93, 0xD3,
3057dd7cddfSDavid du Colombier    0x23, 0x63, 0xA3, 0xE3, 0x33, 0x73, 0xB3, 0xF3,
3067dd7cddfSDavid du Colombier    0x07, 0x47, 0x87, 0xC7, 0x17, 0x57, 0x97, 0xD7,
3077dd7cddfSDavid du Colombier    0x27, 0x67, 0xA7, 0xE7, 0x37, 0x77, 0xB7, 0xF7,
3087dd7cddfSDavid du Colombier    0x0B, 0x4B, 0x8B, 0xCB, 0x1B, 0x5B, 0x9B, 0xDB,
3097dd7cddfSDavid du Colombier    0x2B, 0x6B, 0xAB, 0xEB, 0x3B, 0x7B, 0xBB, 0xFB,
3107dd7cddfSDavid du Colombier    0x0F, 0x4F, 0x8F, 0xCF, 0x1F, 0x5F, 0x9F, 0xDF,
3117dd7cddfSDavid du Colombier    0x2F, 0x6F, 0xAF, 0xEF, 0x3F, 0x7F, 0xBF, 0xFF
3127dd7cddfSDavid du Colombier };
3137dd7cddfSDavid du Colombier 
3147dd7cddfSDavid du Colombier static png_byte fourbppswaptable[256] = {
3157dd7cddfSDavid du Colombier    0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70,
3167dd7cddfSDavid du Colombier    0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0,
3177dd7cddfSDavid du Colombier    0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71,
3187dd7cddfSDavid du Colombier    0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1,
3197dd7cddfSDavid du Colombier    0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72,
3207dd7cddfSDavid du Colombier    0x82, 0x92, 0xA2, 0xB2, 0xC2, 0xD2, 0xE2, 0xF2,
3217dd7cddfSDavid du Colombier    0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73,
3227dd7cddfSDavid du Colombier    0x83, 0x93, 0xA3, 0xB3, 0xC3, 0xD3, 0xE3, 0xF3,
3237dd7cddfSDavid du Colombier    0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74,
3247dd7cddfSDavid du Colombier    0x84, 0x94, 0xA4, 0xB4, 0xC4, 0xD4, 0xE4, 0xF4,
3257dd7cddfSDavid du Colombier    0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75,
3267dd7cddfSDavid du Colombier    0x85, 0x95, 0xA5, 0xB5, 0xC5, 0xD5, 0xE5, 0xF5,
3277dd7cddfSDavid du Colombier    0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76,
3287dd7cddfSDavid du Colombier    0x86, 0x96, 0xA6, 0xB6, 0xC6, 0xD6, 0xE6, 0xF6,
3297dd7cddfSDavid du Colombier    0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77,
3307dd7cddfSDavid du Colombier    0x87, 0x97, 0xA7, 0xB7, 0xC7, 0xD7, 0xE7, 0xF7,
3317dd7cddfSDavid du Colombier    0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78,
3327dd7cddfSDavid du Colombier    0x88, 0x98, 0xA8, 0xB8, 0xC8, 0xD8, 0xE8, 0xF8,
3337dd7cddfSDavid du Colombier    0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79,
3347dd7cddfSDavid du Colombier    0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, 0xE9, 0xF9,
3357dd7cddfSDavid du Colombier    0x0A, 0x1A, 0x2A, 0x3A, 0x4A, 0x5A, 0x6A, 0x7A,
3367dd7cddfSDavid du Colombier    0x8A, 0x9A, 0xAA, 0xBA, 0xCA, 0xDA, 0xEA, 0xFA,
3377dd7cddfSDavid du Colombier    0x0B, 0x1B, 0x2B, 0x3B, 0x4B, 0x5B, 0x6B, 0x7B,
3387dd7cddfSDavid du Colombier    0x8B, 0x9B, 0xAB, 0xBB, 0xCB, 0xDB, 0xEB, 0xFB,
3397dd7cddfSDavid du Colombier    0x0C, 0x1C, 0x2C, 0x3C, 0x4C, 0x5C, 0x6C, 0x7C,
3407dd7cddfSDavid du Colombier    0x8C, 0x9C, 0xAC, 0xBC, 0xCC, 0xDC, 0xEC, 0xFC,
3417dd7cddfSDavid du Colombier    0x0D, 0x1D, 0x2D, 0x3D, 0x4D, 0x5D, 0x6D, 0x7D,
3427dd7cddfSDavid du Colombier    0x8D, 0x9D, 0xAD, 0xBD, 0xCD, 0xDD, 0xED, 0xFD,
3437dd7cddfSDavid du Colombier    0x0E, 0x1E, 0x2E, 0x3E, 0x4E, 0x5E, 0x6E, 0x7E,
3447dd7cddfSDavid du Colombier    0x8E, 0x9E, 0xAE, 0xBE, 0xCE, 0xDE, 0xEE, 0xFE,
3457dd7cddfSDavid du Colombier    0x0F, 0x1F, 0x2F, 0x3F, 0x4F, 0x5F, 0x6F, 0x7F,
3467dd7cddfSDavid du Colombier    0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF
3477dd7cddfSDavid du Colombier };
3487dd7cddfSDavid du Colombier 
3497dd7cddfSDavid du Colombier /* swaps pixel packing order within bytes */
350*593dc095SDavid du Colombier void /* PRIVATE */
png_do_packswap(png_row_infop row_info,png_bytep row)3517dd7cddfSDavid du Colombier png_do_packswap(png_row_infop row_info, png_bytep row)
3527dd7cddfSDavid du Colombier {
3537dd7cddfSDavid du Colombier    png_debug(1, "in png_do_packswap\n");
3547dd7cddfSDavid du Colombier    if (
3557dd7cddfSDavid du Colombier #if defined(PNG_USELESS_TESTS_SUPPORTED)
3567dd7cddfSDavid du Colombier        row != NULL && row_info != NULL &&
3577dd7cddfSDavid du Colombier #endif
3587dd7cddfSDavid du Colombier        row_info->bit_depth < 8)
3597dd7cddfSDavid du Colombier    {
3607dd7cddfSDavid du Colombier       png_bytep rp, end, table;
3617dd7cddfSDavid du Colombier 
3627dd7cddfSDavid du Colombier       end = row + row_info->rowbytes;
3637dd7cddfSDavid du Colombier 
3647dd7cddfSDavid du Colombier       if (row_info->bit_depth == 1)
3657dd7cddfSDavid du Colombier          table = onebppswaptable;
3667dd7cddfSDavid du Colombier       else if (row_info->bit_depth == 2)
3677dd7cddfSDavid du Colombier          table = twobppswaptable;
3687dd7cddfSDavid du Colombier       else if (row_info->bit_depth == 4)
3697dd7cddfSDavid du Colombier          table = fourbppswaptable;
3707dd7cddfSDavid du Colombier       else
3717dd7cddfSDavid du Colombier          return;
3727dd7cddfSDavid du Colombier 
3737dd7cddfSDavid du Colombier       for (rp = row; rp < end; rp++)
3747dd7cddfSDavid du Colombier          *rp = table[*rp];
3757dd7cddfSDavid du Colombier    }
3767dd7cddfSDavid du Colombier }
3777dd7cddfSDavid du Colombier #endif /* PNG_READ_PACKSWAP_SUPPORTED or PNG_WRITE_PACKSWAP_SUPPORTED */
3787dd7cddfSDavid du Colombier 
3797dd7cddfSDavid du Colombier #if defined(PNG_WRITE_FILLER_SUPPORTED) || \
3807dd7cddfSDavid du Colombier     defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
3817dd7cddfSDavid du Colombier /* remove filler or alpha byte(s) */
382*593dc095SDavid du Colombier void /* PRIVATE */
png_do_strip_filler(png_row_infop row_info,png_bytep row,png_uint_32 flags)3837dd7cddfSDavid du Colombier png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags)
3847dd7cddfSDavid du Colombier {
3857dd7cddfSDavid du Colombier    png_debug(1, "in png_do_strip_filler\n");
3867dd7cddfSDavid du Colombier #if defined(PNG_USELESS_TESTS_SUPPORTED)
3877dd7cddfSDavid du Colombier    if (row != NULL && row_info != NULL)
3887dd7cddfSDavid du Colombier #endif
3897dd7cddfSDavid du Colombier    {
390*593dc095SDavid du Colombier       png_bytep sp=row;
391*593dc095SDavid du Colombier       png_bytep dp=row;
392*593dc095SDavid du Colombier       png_uint_32 row_width=row_info->width;
393*593dc095SDavid du Colombier       png_uint_32 i;
394*593dc095SDavid du Colombier 
395*593dc095SDavid du Colombier       if ((row_info->color_type == PNG_COLOR_TYPE_RGB ||
396*593dc095SDavid du Colombier          (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA &&
397*593dc095SDavid du Colombier          (flags & PNG_FLAG_STRIP_ALPHA))) &&
398*593dc095SDavid du Colombier          row_info->channels == 4)
3997dd7cddfSDavid du Colombier       {
4007dd7cddfSDavid du Colombier          if (row_info->bit_depth == 8)
4017dd7cddfSDavid du Colombier          {
4027dd7cddfSDavid du Colombier             /* This converts from RGBX or RGBA to RGB */
4037dd7cddfSDavid du Colombier             if (flags & PNG_FLAG_FILLER_AFTER)
4047dd7cddfSDavid du Colombier             {
405*593dc095SDavid du Colombier                dp+=3; sp+=4;
406*593dc095SDavid du Colombier                for (i = 1; i < row_width; i++)
4077dd7cddfSDavid du Colombier                {
4087dd7cddfSDavid du Colombier                   *dp++ = *sp++;
4097dd7cddfSDavid du Colombier                   *dp++ = *sp++;
4107dd7cddfSDavid du Colombier                   *dp++ = *sp++;
4117dd7cddfSDavid du Colombier                   sp++;
4127dd7cddfSDavid du Colombier                }
4137dd7cddfSDavid du Colombier             }
4147dd7cddfSDavid du Colombier             /* This converts from XRGB or ARGB to RGB */
4157dd7cddfSDavid du Colombier             else
4167dd7cddfSDavid du Colombier             {
417*593dc095SDavid du Colombier                for (i = 0; i < row_width; i++)
4187dd7cddfSDavid du Colombier                {
4197dd7cddfSDavid du Colombier                   sp++;
4207dd7cddfSDavid du Colombier                   *dp++ = *sp++;
4217dd7cddfSDavid du Colombier                   *dp++ = *sp++;
4227dd7cddfSDavid du Colombier                   *dp++ = *sp++;
4237dd7cddfSDavid du Colombier                }
4247dd7cddfSDavid du Colombier             }
4257dd7cddfSDavid du Colombier             row_info->pixel_depth = 24;
426*593dc095SDavid du Colombier             row_info->rowbytes = row_width * 3;
4277dd7cddfSDavid du Colombier          }
4287dd7cddfSDavid du Colombier          else /* if (row_info->bit_depth == 16) */
4297dd7cddfSDavid du Colombier          {
4307dd7cddfSDavid du Colombier             if (flags & PNG_FLAG_FILLER_AFTER)
4317dd7cddfSDavid du Colombier             {
4327dd7cddfSDavid du Colombier                /* This converts from RRGGBBXX or RRGGBBAA to RRGGBB */
433*593dc095SDavid du Colombier                sp += 8; dp += 6;
434*593dc095SDavid du Colombier                for (i = 1; i < row_width; i++)
4357dd7cddfSDavid du Colombier                {
436*593dc095SDavid du Colombier                   /* This could be (although png_memcpy is probably slower):
4377dd7cddfSDavid du Colombier                   png_memcpy(dp, sp, 6);
4387dd7cddfSDavid du Colombier                   sp += 8;
4397dd7cddfSDavid du Colombier                   dp += 6;
4407dd7cddfSDavid du Colombier                   */
441*593dc095SDavid du Colombier 
4427dd7cddfSDavid du Colombier                   *dp++ = *sp++;
4437dd7cddfSDavid du Colombier                   *dp++ = *sp++;
4447dd7cddfSDavid du Colombier                   *dp++ = *sp++;
4457dd7cddfSDavid du Colombier                   *dp++ = *sp++;
4467dd7cddfSDavid du Colombier                   *dp++ = *sp++;
4477dd7cddfSDavid du Colombier                   *dp++ = *sp++;
4487dd7cddfSDavid du Colombier                   sp += 2;
4497dd7cddfSDavid du Colombier                }
4507dd7cddfSDavid du Colombier             }
4517dd7cddfSDavid du Colombier             else
4527dd7cddfSDavid du Colombier             {
4537dd7cddfSDavid du Colombier                /* This converts from XXRRGGBB or AARRGGBB to RRGGBB */
454*593dc095SDavid du Colombier                for (i = 0; i < row_width; i++)
4557dd7cddfSDavid du Colombier                {
456*593dc095SDavid du Colombier                   /* This could be (although png_memcpy is probably slower):
4577dd7cddfSDavid du Colombier                   png_memcpy(dp, sp, 6);
4587dd7cddfSDavid du Colombier                   sp += 8;
4597dd7cddfSDavid du Colombier                   dp += 6;
4607dd7cddfSDavid du Colombier                   */
461*593dc095SDavid du Colombier 
462*593dc095SDavid du Colombier                   sp+=2;
4637dd7cddfSDavid du Colombier                   *dp++ = *sp++;
4647dd7cddfSDavid du Colombier                   *dp++ = *sp++;
4657dd7cddfSDavid du Colombier                   *dp++ = *sp++;
4667dd7cddfSDavid du Colombier                   *dp++ = *sp++;
4677dd7cddfSDavid du Colombier                   *dp++ = *sp++;
4687dd7cddfSDavid du Colombier                   *dp++ = *sp++;
4697dd7cddfSDavid du Colombier                }
4707dd7cddfSDavid du Colombier             }
4717dd7cddfSDavid du Colombier             row_info->pixel_depth = 48;
472*593dc095SDavid du Colombier             row_info->rowbytes = row_width * 6;
4737dd7cddfSDavid du Colombier          }
4747dd7cddfSDavid du Colombier          row_info->channels = 3;
4757dd7cddfSDavid du Colombier       }
476*593dc095SDavid du Colombier       else if ((row_info->color_type == PNG_COLOR_TYPE_GRAY ||
477*593dc095SDavid du Colombier          (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
478*593dc095SDavid du Colombier          (flags & PNG_FLAG_STRIP_ALPHA))) &&
479*593dc095SDavid du Colombier           row_info->channels == 2)
4807dd7cddfSDavid du Colombier       {
4817dd7cddfSDavid du Colombier          if (row_info->bit_depth == 8)
4827dd7cddfSDavid du Colombier          {
4837dd7cddfSDavid du Colombier             /* This converts from GX or GA to G */
4847dd7cddfSDavid du Colombier             if (flags & PNG_FLAG_FILLER_AFTER)
4857dd7cddfSDavid du Colombier             {
486*593dc095SDavid du Colombier                for (i = 0; i < row_width; i++)
4877dd7cddfSDavid du Colombier                {
4887dd7cddfSDavid du Colombier                   *dp++ = *sp++;
4897dd7cddfSDavid du Colombier                   sp++;
4907dd7cddfSDavid du Colombier                }
4917dd7cddfSDavid du Colombier             }
4927dd7cddfSDavid du Colombier             /* This converts from XG or AG to G */
4937dd7cddfSDavid du Colombier             else
4947dd7cddfSDavid du Colombier             {
495*593dc095SDavid du Colombier                for (i = 0; i < row_width; i++)
4967dd7cddfSDavid du Colombier                {
4977dd7cddfSDavid du Colombier                   sp++;
4987dd7cddfSDavid du Colombier                   *dp++ = *sp++;
4997dd7cddfSDavid du Colombier                }
5007dd7cddfSDavid du Colombier             }
5017dd7cddfSDavid du Colombier             row_info->pixel_depth = 8;
502*593dc095SDavid du Colombier             row_info->rowbytes = row_width;
5037dd7cddfSDavid du Colombier          }
5047dd7cddfSDavid du Colombier          else /* if (row_info->bit_depth == 16) */
5057dd7cddfSDavid du Colombier          {
5067dd7cddfSDavid du Colombier             if (flags & PNG_FLAG_FILLER_AFTER)
5077dd7cddfSDavid du Colombier             {
5087dd7cddfSDavid du Colombier                /* This converts from GGXX or GGAA to GG */
509*593dc095SDavid du Colombier                sp += 4; dp += 2;
510*593dc095SDavid du Colombier                for (i = 1; i < row_width; i++)
5117dd7cddfSDavid du Colombier                {
5127dd7cddfSDavid du Colombier                   *dp++ = *sp++;
5137dd7cddfSDavid du Colombier                   *dp++ = *sp++;
5147dd7cddfSDavid du Colombier                   sp += 2;
5157dd7cddfSDavid du Colombier                }
5167dd7cddfSDavid du Colombier             }
5177dd7cddfSDavid du Colombier             else
5187dd7cddfSDavid du Colombier             {
5197dd7cddfSDavid du Colombier                /* This converts from XXGG or AAGG to GG */
520*593dc095SDavid du Colombier                for (i = 0; i < row_width; i++)
5217dd7cddfSDavid du Colombier                {
5227dd7cddfSDavid du Colombier                   sp += 2;
5237dd7cddfSDavid du Colombier                   *dp++ = *sp++;
5247dd7cddfSDavid du Colombier                   *dp++ = *sp++;
5257dd7cddfSDavid du Colombier                }
5267dd7cddfSDavid du Colombier             }
5277dd7cddfSDavid du Colombier             row_info->pixel_depth = 16;
528*593dc095SDavid du Colombier             row_info->rowbytes = row_width * 2;
5297dd7cddfSDavid du Colombier          }
5307dd7cddfSDavid du Colombier          row_info->channels = 1;
5317dd7cddfSDavid du Colombier       }
532*593dc095SDavid du Colombier       if (flags & PNG_FLAG_STRIP_ALPHA)
533*593dc095SDavid du Colombier         row_info->color_type &= ~PNG_COLOR_MASK_ALPHA;
5347dd7cddfSDavid du Colombier    }
5357dd7cddfSDavid du Colombier }
5367dd7cddfSDavid du Colombier #endif
5377dd7cddfSDavid du Colombier 
5387dd7cddfSDavid du Colombier #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
5397dd7cddfSDavid du Colombier /* swaps red and blue bytes within a pixel */
540*593dc095SDavid du Colombier void /* PRIVATE */
png_do_bgr(png_row_infop row_info,png_bytep row)5417dd7cddfSDavid du Colombier png_do_bgr(png_row_infop row_info, png_bytep row)
5427dd7cddfSDavid du Colombier {
5437dd7cddfSDavid du Colombier    png_debug(1, "in png_do_bgr\n");
5447dd7cddfSDavid du Colombier    if (
5457dd7cddfSDavid du Colombier #if defined(PNG_USELESS_TESTS_SUPPORTED)
5467dd7cddfSDavid du Colombier        row != NULL && row_info != NULL &&
5477dd7cddfSDavid du Colombier #endif
5487dd7cddfSDavid du Colombier        (row_info->color_type & PNG_COLOR_MASK_COLOR))
5497dd7cddfSDavid du Colombier    {
550*593dc095SDavid du Colombier       png_uint_32 row_width = row_info->width;
5517dd7cddfSDavid du Colombier       if (row_info->bit_depth == 8)
5527dd7cddfSDavid du Colombier       {
5537dd7cddfSDavid du Colombier          if (row_info->color_type == PNG_COLOR_TYPE_RGB)
5547dd7cddfSDavid du Colombier          {
5557dd7cddfSDavid du Colombier             png_bytep rp;
5567dd7cddfSDavid du Colombier             png_uint_32 i;
5577dd7cddfSDavid du Colombier 
558*593dc095SDavid du Colombier             for (i = 0, rp = row; i < row_width; i++, rp += 3)
5597dd7cddfSDavid du Colombier             {
560*593dc095SDavid du Colombier                png_byte save = *rp;
5617dd7cddfSDavid du Colombier                *rp = *(rp + 2);
5627dd7cddfSDavid du Colombier                *(rp + 2) = save;
5637dd7cddfSDavid du Colombier             }
5647dd7cddfSDavid du Colombier          }
5657dd7cddfSDavid du Colombier          else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
5667dd7cddfSDavid du Colombier          {
5677dd7cddfSDavid du Colombier             png_bytep rp;
5687dd7cddfSDavid du Colombier             png_uint_32 i;
5697dd7cddfSDavid du Colombier 
570*593dc095SDavid du Colombier             for (i = 0, rp = row; i < row_width; i++, rp += 4)
5717dd7cddfSDavid du Colombier             {
572*593dc095SDavid du Colombier                png_byte save = *rp;
5737dd7cddfSDavid du Colombier                *rp = *(rp + 2);
5747dd7cddfSDavid du Colombier                *(rp + 2) = save;
5757dd7cddfSDavid du Colombier             }
5767dd7cddfSDavid du Colombier          }
5777dd7cddfSDavid du Colombier       }
5787dd7cddfSDavid du Colombier       else if (row_info->bit_depth == 16)
5797dd7cddfSDavid du Colombier       {
5807dd7cddfSDavid du Colombier          if (row_info->color_type == PNG_COLOR_TYPE_RGB)
5817dd7cddfSDavid du Colombier          {
5827dd7cddfSDavid du Colombier             png_bytep rp;
5837dd7cddfSDavid du Colombier             png_uint_32 i;
5847dd7cddfSDavid du Colombier 
585*593dc095SDavid du Colombier             for (i = 0, rp = row; i < row_width; i++, rp += 6)
5867dd7cddfSDavid du Colombier             {
587*593dc095SDavid du Colombier                png_byte save = *rp;
5887dd7cddfSDavid du Colombier                *rp = *(rp + 4);
589*593dc095SDavid du Colombier                *(rp + 4) = save;
590*593dc095SDavid du Colombier                save = *(rp + 1);
5917dd7cddfSDavid du Colombier                *(rp + 1) = *(rp + 5);
592*593dc095SDavid du Colombier                *(rp + 5) = save;
5937dd7cddfSDavid du Colombier             }
5947dd7cddfSDavid du Colombier          }
5957dd7cddfSDavid du Colombier          else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
5967dd7cddfSDavid du Colombier          {
5977dd7cddfSDavid du Colombier             png_bytep rp;
5987dd7cddfSDavid du Colombier             png_uint_32 i;
5997dd7cddfSDavid du Colombier 
600*593dc095SDavid du Colombier             for (i = 0, rp = row; i < row_width; i++, rp += 8)
6017dd7cddfSDavid du Colombier             {
602*593dc095SDavid du Colombier                png_byte save = *rp;
6037dd7cddfSDavid du Colombier                *rp = *(rp + 4);
604*593dc095SDavid du Colombier                *(rp + 4) = save;
605*593dc095SDavid du Colombier                save = *(rp + 1);
6067dd7cddfSDavid du Colombier                *(rp + 1) = *(rp + 5);
607*593dc095SDavid du Colombier                *(rp + 5) = save;
6087dd7cddfSDavid du Colombier             }
6097dd7cddfSDavid du Colombier          }
6107dd7cddfSDavid du Colombier       }
6117dd7cddfSDavid du Colombier    }
6127dd7cddfSDavid du Colombier }
6137dd7cddfSDavid du Colombier #endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */
6147dd7cddfSDavid du Colombier 
615*593dc095SDavid du Colombier #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
616*593dc095SDavid du Colombier     defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \
617*593dc095SDavid du Colombier     defined(PNG_LEGACY_SUPPORTED)
618*593dc095SDavid du Colombier void PNGAPI
png_set_user_transform_info(png_structp png_ptr,png_voidp user_transform_ptr,int user_transform_depth,int user_transform_channels)619*593dc095SDavid du Colombier png_set_user_transform_info(png_structp png_ptr, png_voidp
620*593dc095SDavid du Colombier    user_transform_ptr, int user_transform_depth, int user_transform_channels)
621*593dc095SDavid du Colombier {
622*593dc095SDavid du Colombier    png_debug(1, "in png_set_user_transform_info\n");
623*593dc095SDavid du Colombier #if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
624*593dc095SDavid du Colombier    png_ptr->user_transform_ptr = user_transform_ptr;
625*593dc095SDavid du Colombier    png_ptr->user_transform_depth = (png_byte)user_transform_depth;
626*593dc095SDavid du Colombier    png_ptr->user_transform_channels = (png_byte)user_transform_channels;
627*593dc095SDavid du Colombier #else
628*593dc095SDavid du Colombier    if(user_transform_ptr || user_transform_depth || user_transform_channels)
629*593dc095SDavid du Colombier       png_warning(png_ptr,
630*593dc095SDavid du Colombier         "This version of libpng does not support user transform info");
631*593dc095SDavid du Colombier #endif
632*593dc095SDavid du Colombier }
633*593dc095SDavid du Colombier #endif
634*593dc095SDavid du Colombier 
635*593dc095SDavid du Colombier /* This function returns a pointer to the user_transform_ptr associated with
636*593dc095SDavid du Colombier  * the user transform functions.  The application should free any memory
637*593dc095SDavid du Colombier  * associated with this pointer before png_write_destroy and png_read_destroy
638*593dc095SDavid du Colombier  * are called.
639*593dc095SDavid du Colombier  */
640*593dc095SDavid du Colombier png_voidp PNGAPI
png_get_user_transform_ptr(png_structp png_ptr)641*593dc095SDavid du Colombier png_get_user_transform_ptr(png_structp png_ptr)
642*593dc095SDavid du Colombier {
643*593dc095SDavid du Colombier #if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
644*593dc095SDavid du Colombier    return ((png_voidp)png_ptr->user_transform_ptr);
645*593dc095SDavid du Colombier #else
646*593dc095SDavid du Colombier    if(png_ptr)
647*593dc095SDavid du Colombier      return (NULL);
648*593dc095SDavid du Colombier    return (NULL);
649*593dc095SDavid du Colombier #endif
650*593dc095SDavid du Colombier }
651