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