15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* pngtrans.c - transforms the data in a row (used by both readers and writers) 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Last changed in libpng 1.2.41 [December 3, 2009] 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (c) 1998-2009 Glenn Randers-Pehrson 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This code is released under the libpng license. 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * For conditions of distribution and use, see the disclaimer 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and license in png.h 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PNG_INTERNAL 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PNG_NO_PEDANTIC_WARNINGS 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "png.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Turn on BGR-to-RGB mapping */ 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_set_bgr(png_structp png_ptr) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_debug(1, "in png_set_bgr"); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->transformations |= PNG_BGR; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Turn on 16 bit byte swapping */ 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_set_swap(png_structp png_ptr) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_debug(1, "in png_set_swap"); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->bit_depth == 16) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->transformations |= PNG_SWAP_BYTES; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Turn on pixel packing */ 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_set_packing(png_structp png_ptr) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_debug(1, "in png_set_packing"); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->bit_depth < 8) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->transformations |= PNG_PACK; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->usr_bit_depth = 8; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Turn on packed pixel swapping */ 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_set_packswap(png_structp png_ptr) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_debug(1, "in png_set_packswap"); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->bit_depth < 8) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->transformations |= PNG_PACKSWAP; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_set_shift(png_structp png_ptr, png_color_8p true_bits) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_debug(1, "in png_set_shift"); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->transformations |= PNG_SHIFT; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->shift = *true_bits; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_READ_INTERLACING_SUPPORTED) || \ 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) defined(PNG_WRITE_INTERLACING_SUPPORTED) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int PNGAPI 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_set_interlace_handling(png_structp png_ptr) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_debug(1, "in png_set_interlace handling"); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr && png_ptr->interlaced) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->transformations |= PNG_INTERLACE; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (7); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (1); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Add a filler byte on read, or remove a filler or alpha byte on write. 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The filler type has changed in v0.95 to allow future 2-byte fillers 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * for 48-bit input data, as well as to avoid problems with some compilers 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * that don't like bytes as parameters. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_set_filler(png_structp png_ptr, png_uint_32 filler, int filler_loc) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_debug(1, "in png_set_filler"); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->transformations |= PNG_FILLER; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_LEGACY_SUPPORTED 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->filler = (png_byte)filler; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->filler = (png_uint_16)filler; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (filler_loc == PNG_FILLER_AFTER) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->flags |= PNG_FLAG_FILLER_AFTER; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This should probably go in the "do_read_filler" routine. 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * I attempted to do that in libpng-1.0.1a but that caused problems 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * so I restored it in libpng-1.0.2a 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->color_type == PNG_COLOR_TYPE_RGB) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->usr_channels = 4; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Also I added this in libpng-1.0.2a (what happens when we expand 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * a less-than-8-bit grayscale to GA? */ 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY && png_ptr->bit_depth >= 8) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->usr_channels = 2; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PNG_1_0_X 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Added to libpng-1.2.7 */ 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_set_add_alpha(png_structp png_ptr, png_uint_32 filler, int filler_loc) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_debug(1, "in png_set_add_alpha"); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_set_filler(png_ptr, filler, filler_loc); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->transformations |= PNG_ADD_ALPHA; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \ 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_set_swap_alpha(png_structp png_ptr) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_debug(1, "in png_set_swap_alpha"); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->transformations |= PNG_SWAP_ALPHA; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \ 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_set_invert_alpha(png_structp png_ptr) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_debug(1, "in png_set_invert_alpha"); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->transformations |= PNG_INVERT_ALPHA; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_set_invert_mono(png_structp png_ptr) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_debug(1, "in png_set_invert_mono"); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->transformations |= PNG_INVERT_MONO; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Invert monochrome grayscale data */ 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */ 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_do_invert(png_row_infop row_info, png_bytep row) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_debug(1, "in png_do_invert"); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This test removed from libpng version 1.0.13 and 1.2.0: 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if (row_info->bit_depth == 1 && 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USELESS_TESTS_SUPPORTED 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (row == NULL || row_info == NULL) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (row_info->color_type == PNG_COLOR_TYPE_GRAY) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_bytep rp = row; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_uint_32 i; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_uint_32 istop = row_info->rowbytes; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < istop; i++) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *rp = (png_byte)(~(*rp)); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rp++; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row_info->bit_depth == 8) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_bytep rp = row; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_uint_32 i; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_uint_32 istop = row_info->rowbytes; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < istop; i+=2) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *rp = (png_byte)(~(*rp)); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rp+=2; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row_info->bit_depth == 16) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_bytep rp = row; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_uint_32 i; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_uint_32 istop = row_info->rowbytes; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < istop; i+=4) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *rp = (png_byte)(~(*rp)); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *(rp+1) = (png_byte)(~(*(rp+1))); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rp+=4; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Swaps byte order on 16 bit depth images */ 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */ 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_do_swap(png_row_infop row_info, png_bytep row) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_debug(1, "in png_do_swap"); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ( 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USELESS_TESTS_SUPPORTED 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row != NULL && row_info != NULL && 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row_info->bit_depth == 16) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_bytep rp = row; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_uint_32 i; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_uint_32 istop= row_info->width * row_info->channels; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < istop; i++, rp += 2) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_byte t = *rp; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *rp = *(rp + 1); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *(rp + 1) = t; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static PNG_CONST png_byte onebppswaptable[256] = { 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0, 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8, 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4, 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC, 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2, 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA, 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6, 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE, 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1, 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9, 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5, 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD, 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3, 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB, 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7, 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static PNG_CONST png_byte twobppswaptable[256] = { 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x00, 0x40, 0x80, 0xC0, 0x10, 0x50, 0x90, 0xD0, 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x20, 0x60, 0xA0, 0xE0, 0x30, 0x70, 0xB0, 0xF0, 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x04, 0x44, 0x84, 0xC4, 0x14, 0x54, 0x94, 0xD4, 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x24, 0x64, 0xA4, 0xE4, 0x34, 0x74, 0xB4, 0xF4, 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x08, 0x48, 0x88, 0xC8, 0x18, 0x58, 0x98, 0xD8, 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x28, 0x68, 0xA8, 0xE8, 0x38, 0x78, 0xB8, 0xF8, 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x0C, 0x4C, 0x8C, 0xCC, 0x1C, 0x5C, 0x9C, 0xDC, 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x2C, 0x6C, 0xAC, 0xEC, 0x3C, 0x7C, 0xBC, 0xFC, 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x01, 0x41, 0x81, 0xC1, 0x11, 0x51, 0x91, 0xD1, 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x21, 0x61, 0xA1, 0xE1, 0x31, 0x71, 0xB1, 0xF1, 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x05, 0x45, 0x85, 0xC5, 0x15, 0x55, 0x95, 0xD5, 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x25, 0x65, 0xA5, 0xE5, 0x35, 0x75, 0xB5, 0xF5, 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x09, 0x49, 0x89, 0xC9, 0x19, 0x59, 0x99, 0xD9, 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x29, 0x69, 0xA9, 0xE9, 0x39, 0x79, 0xB9, 0xF9, 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x0D, 0x4D, 0x8D, 0xCD, 0x1D, 0x5D, 0x9D, 0xDD, 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x2D, 0x6D, 0xAD, 0xED, 0x3D, 0x7D, 0xBD, 0xFD, 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x02, 0x42, 0x82, 0xC2, 0x12, 0x52, 0x92, 0xD2, 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x22, 0x62, 0xA2, 0xE2, 0x32, 0x72, 0xB2, 0xF2, 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x06, 0x46, 0x86, 0xC6, 0x16, 0x56, 0x96, 0xD6, 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x26, 0x66, 0xA6, 0xE6, 0x36, 0x76, 0xB6, 0xF6, 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x0A, 0x4A, 0x8A, 0xCA, 0x1A, 0x5A, 0x9A, 0xDA, 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x2A, 0x6A, 0xAA, 0xEA, 0x3A, 0x7A, 0xBA, 0xFA, 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x0E, 0x4E, 0x8E, 0xCE, 0x1E, 0x5E, 0x9E, 0xDE, 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x2E, 0x6E, 0xAE, 0xEE, 0x3E, 0x7E, 0xBE, 0xFE, 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x03, 0x43, 0x83, 0xC3, 0x13, 0x53, 0x93, 0xD3, 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x23, 0x63, 0xA3, 0xE3, 0x33, 0x73, 0xB3, 0xF3, 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x07, 0x47, 0x87, 0xC7, 0x17, 0x57, 0x97, 0xD7, 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x27, 0x67, 0xA7, 0xE7, 0x37, 0x77, 0xB7, 0xF7, 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x0B, 0x4B, 0x8B, 0xCB, 0x1B, 0x5B, 0x9B, 0xDB, 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x2B, 0x6B, 0xAB, 0xEB, 0x3B, 0x7B, 0xBB, 0xFB, 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x0F, 0x4F, 0x8F, 0xCF, 0x1F, 0x5F, 0x9F, 0xDF, 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x2F, 0x6F, 0xAF, 0xEF, 0x3F, 0x7F, 0xBF, 0xFF 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static PNG_CONST png_byte fourbppswaptable[256] = { 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0, 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71, 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1, 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72, 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x82, 0x92, 0xA2, 0xB2, 0xC2, 0xD2, 0xE2, 0xF2, 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73, 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x83, 0x93, 0xA3, 0xB3, 0xC3, 0xD3, 0xE3, 0xF3, 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74, 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x84, 0x94, 0xA4, 0xB4, 0xC4, 0xD4, 0xE4, 0xF4, 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75, 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x85, 0x95, 0xA5, 0xB5, 0xC5, 0xD5, 0xE5, 0xF5, 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76, 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x86, 0x96, 0xA6, 0xB6, 0xC6, 0xD6, 0xE6, 0xF6, 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77, 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x87, 0x97, 0xA7, 0xB7, 0xC7, 0xD7, 0xE7, 0xF7, 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78, 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x88, 0x98, 0xA8, 0xB8, 0xC8, 0xD8, 0xE8, 0xF8, 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79, 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, 0xE9, 0xF9, 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x0A, 0x1A, 0x2A, 0x3A, 0x4A, 0x5A, 0x6A, 0x7A, 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x8A, 0x9A, 0xAA, 0xBA, 0xCA, 0xDA, 0xEA, 0xFA, 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x0B, 0x1B, 0x2B, 0x3B, 0x4B, 0x5B, 0x6B, 0x7B, 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x8B, 0x9B, 0xAB, 0xBB, 0xCB, 0xDB, 0xEB, 0xFB, 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x0C, 0x1C, 0x2C, 0x3C, 0x4C, 0x5C, 0x6C, 0x7C, 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x8C, 0x9C, 0xAC, 0xBC, 0xCC, 0xDC, 0xEC, 0xFC, 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x0D, 0x1D, 0x2D, 0x3D, 0x4D, 0x5D, 0x6D, 0x7D, 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x8D, 0x9D, 0xAD, 0xBD, 0xCD, 0xDD, 0xED, 0xFD, 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x0E, 0x1E, 0x2E, 0x3E, 0x4E, 0x5E, 0x6E, 0x7E, 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x8E, 0x9E, 0xAE, 0xBE, 0xCE, 0xDE, 0xEE, 0xFE, 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x0F, 0x1F, 0x2F, 0x3F, 0x4F, 0x5F, 0x6F, 0x7F, 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Swaps pixel packing order within bytes */ 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */ 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_do_packswap(png_row_infop row_info, png_bytep row) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_debug(1, "in png_do_packswap"); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ( 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USELESS_TESTS_SUPPORTED 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row != NULL && row_info != NULL && 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row_info->bit_depth < 8) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_bytep rp, end, table; 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end = row + row_info->rowbytes; 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (row_info->bit_depth == 1) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) table = (png_bytep)onebppswaptable; 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (row_info->bit_depth == 2) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) table = (png_bytep)twobppswaptable; 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (row_info->bit_depth == 4) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) table = (png_bytep)fourbppswaptable; 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (rp = row; rp < end; rp++) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *rp = table[*rp]; 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_READ_PACKSWAP_SUPPORTED or PNG_WRITE_PACKSWAP_SUPPORTED */ 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_WRITE_FILLER_SUPPORTED) || \ 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) defined(PNG_READ_STRIP_ALPHA_SUPPORTED) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Remove filler or alpha byte(s) */ 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */ 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_debug(1, "in png_do_strip_filler"); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USELESS_TESTS_SUPPORTED 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (row != NULL && row_info != NULL) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_bytep sp=row; 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_bytep dp=row; 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_uint_32 row_width=row_info->width; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_uint_32 i; 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((row_info->color_type == PNG_COLOR_TYPE_RGB || 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA && 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (flags & PNG_FLAG_STRIP_ALPHA))) && 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row_info->channels == 4) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (row_info->bit_depth == 8) 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This converts from RGBX or RGBA to RGB */ 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & PNG_FLAG_FILLER_AFTER) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dp+=3; sp+=4; 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 1; i < row_width; i++) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *dp++ = *sp++; 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *dp++ = *sp++; 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *dp++ = *sp++; 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sp++; 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This converts from XRGB or ARGB to RGB */ 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < row_width; i++) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sp++; 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *dp++ = *sp++; 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *dp++ = *sp++; 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *dp++ = *sp++; 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row_info->pixel_depth = 24; 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row_info->rowbytes = row_width * 3; 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else /* if (row_info->bit_depth == 16) */ 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & PNG_FLAG_FILLER_AFTER) 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This converts from RRGGBBXX or RRGGBBAA to RRGGBB */ 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sp += 8; dp += 6; 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 1; i < row_width; i++) 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This could be (although png_memcpy is probably slower): 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_memcpy(dp, sp, 6); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sp += 8; 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dp += 6; 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *dp++ = *sp++; 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *dp++ = *sp++; 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *dp++ = *sp++; 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *dp++ = *sp++; 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *dp++ = *sp++; 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *dp++ = *sp++; 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sp += 2; 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This converts from XXRRGGBB or AARRGGBB to RRGGBB */ 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < row_width; i++) 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This could be (although png_memcpy is probably slower): 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_memcpy(dp, sp, 6); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sp += 8; 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dp += 6; 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sp+=2; 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *dp++ = *sp++; 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *dp++ = *sp++; 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *dp++ = *sp++; 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *dp++ = *sp++; 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *dp++ = *sp++; 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *dp++ = *sp++; 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row_info->pixel_depth = 48; 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row_info->rowbytes = row_width * 6; 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row_info->channels = 3; 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if ((row_info->color_type == PNG_COLOR_TYPE_GRAY || 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (flags & PNG_FLAG_STRIP_ALPHA))) && 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row_info->channels == 2) 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (row_info->bit_depth == 8) 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This converts from GX or GA to G */ 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & PNG_FLAG_FILLER_AFTER) 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < row_width; i++) 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *dp++ = *sp++; 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sp++; 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This converts from XG or AG to G */ 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < row_width; i++) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sp++; 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *dp++ = *sp++; 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row_info->pixel_depth = 8; 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row_info->rowbytes = row_width; 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else /* if (row_info->bit_depth == 16) */ 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & PNG_FLAG_FILLER_AFTER) 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This converts from GGXX or GGAA to GG */ 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sp += 4; dp += 2; 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 1; i < row_width; i++) 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *dp++ = *sp++; 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *dp++ = *sp++; 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sp += 2; 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This converts from XXGG or AAGG to GG */ 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < row_width; i++) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sp += 2; 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *dp++ = *sp++; 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *dp++ = *sp++; 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row_info->pixel_depth = 16; 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row_info->rowbytes = row_width * 2; 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row_info->channels = 1; 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags & PNG_FLAG_STRIP_ALPHA) 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row_info->color_type &= ~PNG_COLOR_MASK_ALPHA; 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Swaps red and blue bytes within a pixel */ 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void /* PRIVATE */ 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_do_bgr(png_row_infop row_info, png_bytep row) 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_debug(1, "in png_do_bgr"); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ( 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USELESS_TESTS_SUPPORTED 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row != NULL && row_info != NULL && 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (row_info->color_type & PNG_COLOR_MASK_COLOR)) 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_uint_32 row_width = row_info->width; 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (row_info->bit_depth == 8) 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (row_info->color_type == PNG_COLOR_TYPE_RGB) 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_bytep rp; 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_uint_32 i; 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0, rp = row; i < row_width; i++, rp += 3) 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_byte save = *rp; 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *rp = *(rp + 2); 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *(rp + 2) = save; 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_bytep rp; 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_uint_32 i; 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0, rp = row; i < row_width; i++, rp += 4) 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_byte save = *rp; 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *rp = *(rp + 2); 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *(rp + 2) = save; 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (row_info->bit_depth == 16) 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (row_info->color_type == PNG_COLOR_TYPE_RGB) 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_bytep rp; 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_uint_32 i; 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0, rp = row; i < row_width; i++, rp += 6) 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_byte save = *rp; 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *rp = *(rp + 4); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *(rp + 4) = save; 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save = *(rp + 1); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *(rp + 1) = *(rp + 5); 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *(rp + 5) = save; 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_bytep rp; 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_uint_32 i; 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0, rp = row; i < row_width; i++, rp += 8) 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_byte save = *rp; 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *rp = *(rp + 4); 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *(rp + 4) = save; 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save = *(rp + 1); 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *(rp + 1) = *(rp + 5); 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *(rp + 5) = save; 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */ 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) defined(PNG_LEGACY_SUPPORTED) || \ 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PNGAPI 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_set_user_transform_info(png_structp png_ptr, png_voidp 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_transform_ptr, int user_transform_depth, int user_transform_channels) 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_debug(1, "in png_set_user_transform_info"); 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL) 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->user_transform_ptr = user_transform_ptr; 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->user_transform_depth = (png_byte)user_transform_depth; 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_ptr->user_transform_channels = (png_byte)user_transform_channels; 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (user_transform_ptr || user_transform_depth || user_transform_channels) 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) png_warning(png_ptr, 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "This version of libpng does not support user transform info"); 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* This function returns a pointer to the user_transform_ptr associated with 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the user transform functions. The application should free any memory 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * associated with this pointer before png_write_destroy and png_read_destroy 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * are called. 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_voidp PNGAPI 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)png_get_user_transform_ptr(png_structp png_ptr) 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (png_ptr == NULL) 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ((png_voidp)png_ptr->user_transform_ptr); 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ 700