pngtrans.c revision b50c217251b086440efcdb273c22f86a06c80cba
1893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 2893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* pngtrans.c - transforms the data in a row (used by both readers and writers) 3893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * 4b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * Last changed in libpng 1.6.2 [April 25, 2013] 5b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * Copyright (c) 1998-2013 Glenn Randers-Pehrson 6893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) 7893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) 8a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * 9a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * This code is released under the libpng license. 10a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * For conditions of distribution and use, see the disclaimer 11a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott * and license in png.h 12893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 13893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 14b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#include "pngpriv.h" 15b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 16893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) 174215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project 18893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) 19a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* Turn on BGR-to-RGB mapping */ 20893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 21b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_set_bgr(png_structrp png_ptr) 22893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 234215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_set_bgr"); 245f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 25a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (png_ptr == NULL) 26a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott return; 27b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 28893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->transformations |= PNG_BGR; 29893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 30893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 31893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 32893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) 33a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* Turn on 16 bit byte swapping */ 34893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 35b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_set_swap(png_structrp png_ptr) 36893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 374215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_set_swap"); 385f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 39a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (png_ptr == NULL) 40a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott return; 41b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 42893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->bit_depth == 16) 43893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->transformations |= PNG_SWAP_BYTES; 44893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 45893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 46893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 47893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED) 48a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* Turn on pixel packing */ 49893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 50b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_set_packing(png_structrp png_ptr) 51893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 524215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_set_packing"); 535f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 54a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (png_ptr == NULL) 55a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott return; 56b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 57893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->bit_depth < 8) 58893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 59893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->transformations |= PNG_PACK; 60893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->usr_bit_depth = 8; 61893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 62893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 63893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 64893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 65893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED) 66a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* Turn on packed pixel swapping */ 67893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 68b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_set_packswap(png_structrp png_ptr) 69893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 704215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_set_packswap"); 715f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 72a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (png_ptr == NULL) 73a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott return; 74b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 75893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr->bit_depth < 8) 76893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->transformations |= PNG_PACKSWAP; 77893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 78893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 79893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 80893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) 81893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 82b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_set_shift(png_structrp png_ptr, png_const_color_8p true_bits) 83893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 844215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_set_shift"); 855f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 86a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (png_ptr == NULL) 87a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott return; 88b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 89893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->transformations |= PNG_SHIFT; 90893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->shift = *true_bits; 91893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 92893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 93893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 94893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_INTERLACING_SUPPORTED) || \ 95893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project defined(PNG_WRITE_INTERLACING_SUPPORTED) 96893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectint PNGAPI 97b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_set_interlace_handling(png_structrp png_ptr) 98893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 994215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_set_interlace handling"); 1005f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 101893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (png_ptr && png_ptr->interlaced) 102893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 103893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->transformations |= PNG_INTERLACE; 104893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return (7); 105893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 106893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 107893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return (1); 108893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 109893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 110893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 111893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) 112893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Add a filler byte on read, or remove a filler or alpha byte on write. 113893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * The filler type has changed in v0.95 to allow future 2-byte fillers 114893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * for 48-bit input data, as well as to avoid problems with some compilers 115893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * that don't like bytes as parameters. 116893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 117893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 118b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_set_filler(png_structrp png_ptr, png_uint_32 filler, int filler_loc) 119893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1204215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_set_filler"); 1215f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 122a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (png_ptr == NULL) 123a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott return; 124893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 125b50c217251b086440efcdb273c22f86a06c80cbaChris Craik /* In libpng 1.6 it is possible to determine whether this is a read or write 126b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * operation and therefore to do more checking here for a valid call. 127b50c217251b086440efcdb273c22f86a06c80cbaChris Craik */ 128b50c217251b086440efcdb273c22f86a06c80cbaChris Craik if (png_ptr->mode & PNG_IS_READ_STRUCT) 129893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 130b50c217251b086440efcdb273c22f86a06c80cbaChris Craik# ifdef PNG_READ_FILLER_SUPPORTED 131b50c217251b086440efcdb273c22f86a06c80cbaChris Craik /* On read png_set_filler is always valid, regardless of the base PNG 132b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * format, because other transformations can give a format where the 133b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * filler code can execute (basically an 8 or 16-bit component RGB or G 134b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * format.) 135b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * 136b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * NOTE: usr_channels is not used by the read code! (This has led to 137b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * confusion in the past.) The filler is only used in the read code. 138b50c217251b086440efcdb273c22f86a06c80cbaChris Craik */ 139b50c217251b086440efcdb273c22f86a06c80cbaChris Craik png_ptr->filler = (png_uint_16)filler; 140b50c217251b086440efcdb273c22f86a06c80cbaChris Craik# else 141b50c217251b086440efcdb273c22f86a06c80cbaChris Craik png_app_error(png_ptr, "png_set_filler not supported on read"); 142b50c217251b086440efcdb273c22f86a06c80cbaChris Craik PNG_UNUSED(filler) /* not used in the write case */ 143b50c217251b086440efcdb273c22f86a06c80cbaChris Craik return; 144b50c217251b086440efcdb273c22f86a06c80cbaChris Craik# endif 145893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 146893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 147b50c217251b086440efcdb273c22f86a06c80cbaChris Craik else /* write */ 148893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 149b50c217251b086440efcdb273c22f86a06c80cbaChris Craik# ifdef PNG_WRITE_FILLER_SUPPORTED 150b50c217251b086440efcdb273c22f86a06c80cbaChris Craik /* On write the usr_channels parameter must be set correctly at the 151b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * start to record the number of channels in the app-supplied data. 152b50c217251b086440efcdb273c22f86a06c80cbaChris Craik */ 153b50c217251b086440efcdb273c22f86a06c80cbaChris Craik switch (png_ptr->color_type) 154b50c217251b086440efcdb273c22f86a06c80cbaChris Craik { 155b50c217251b086440efcdb273c22f86a06c80cbaChris Craik case PNG_COLOR_TYPE_RGB: 156b50c217251b086440efcdb273c22f86a06c80cbaChris Craik png_ptr->usr_channels = 4; 157b50c217251b086440efcdb273c22f86a06c80cbaChris Craik break; 158b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 159b50c217251b086440efcdb273c22f86a06c80cbaChris Craik case PNG_COLOR_TYPE_GRAY: 160b50c217251b086440efcdb273c22f86a06c80cbaChris Craik if (png_ptr->bit_depth >= 8) 161b50c217251b086440efcdb273c22f86a06c80cbaChris Craik { 162b50c217251b086440efcdb273c22f86a06c80cbaChris Craik png_ptr->usr_channels = 2; 163b50c217251b086440efcdb273c22f86a06c80cbaChris Craik break; 164b50c217251b086440efcdb273c22f86a06c80cbaChris Craik } 165b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 166b50c217251b086440efcdb273c22f86a06c80cbaChris Craik else 167b50c217251b086440efcdb273c22f86a06c80cbaChris Craik { 168b50c217251b086440efcdb273c22f86a06c80cbaChris Craik /* There simply isn't any code in libpng to strip out bits 169b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * from bytes when the components are less than a byte in 170b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * size! 171b50c217251b086440efcdb273c22f86a06c80cbaChris Craik */ 172b50c217251b086440efcdb273c22f86a06c80cbaChris Craik png_app_error(png_ptr, 173b50c217251b086440efcdb273c22f86a06c80cbaChris Craik "png_set_filler is invalid for low bit depth gray output"); 174b50c217251b086440efcdb273c22f86a06c80cbaChris Craik return; 175b50c217251b086440efcdb273c22f86a06c80cbaChris Craik } 176b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 177b50c217251b086440efcdb273c22f86a06c80cbaChris Craik default: 178b50c217251b086440efcdb273c22f86a06c80cbaChris Craik png_app_error(png_ptr, 179b50c217251b086440efcdb273c22f86a06c80cbaChris Craik "png_set_filler: inappropriate color type"); 180b50c217251b086440efcdb273c22f86a06c80cbaChris Craik return; 181b50c217251b086440efcdb273c22f86a06c80cbaChris Craik } 182b50c217251b086440efcdb273c22f86a06c80cbaChris Craik# else 183b50c217251b086440efcdb273c22f86a06c80cbaChris Craik png_app_error(png_ptr, "png_set_filler not supported on write"); 184b50c217251b086440efcdb273c22f86a06c80cbaChris Craik return; 185b50c217251b086440efcdb273c22f86a06c80cbaChris Craik# endif 186893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 187b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 188b50c217251b086440efcdb273c22f86a06c80cbaChris Craik /* Here on success - libpng supports the operation, set the transformation 189b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * and the flag to say where the filler channel is. 190b50c217251b086440efcdb273c22f86a06c80cbaChris Craik */ 191b50c217251b086440efcdb273c22f86a06c80cbaChris Craik png_ptr->transformations |= PNG_FILLER; 192b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 193b50c217251b086440efcdb273c22f86a06c80cbaChris Craik if (filler_loc == PNG_FILLER_AFTER) 194b50c217251b086440efcdb273c22f86a06c80cbaChris Craik png_ptr->flags |= PNG_FLAG_FILLER_AFTER; 195b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 196b50c217251b086440efcdb273c22f86a06c80cbaChris Craik else 197b50c217251b086440efcdb273c22f86a06c80cbaChris Craik png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER; 198893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 199893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 200893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Added to libpng-1.2.7 */ 201893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 202b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_set_add_alpha(png_structrp png_ptr, png_uint_32 filler, int filler_loc) 203893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 2044215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_set_add_alpha"); 2055f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 206a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (png_ptr == NULL) 207a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott return; 208b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 209893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_set_filler(png_ptr, filler, filler_loc); 210b50c217251b086440efcdb273c22f86a06c80cbaChris Craik /* The above may fail to do anything. */ 211b50c217251b086440efcdb273c22f86a06c80cbaChris Craik if (png_ptr->transformations & PNG_FILLER) 212b50c217251b086440efcdb273c22f86a06c80cbaChris Craik png_ptr->transformations |= PNG_ADD_ALPHA; 213893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 214893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 215893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 216893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 217893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \ 218893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) 219893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 220b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_set_swap_alpha(png_structrp png_ptr) 221893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 2224215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_set_swap_alpha"); 2235f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 224a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (png_ptr == NULL) 225a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott return; 226b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 227893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->transformations |= PNG_SWAP_ALPHA; 228893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 229893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 230893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 231893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \ 232893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) 233893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 234b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_set_invert_alpha(png_structrp png_ptr) 235893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 2364215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_set_invert_alpha"); 2375f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 238a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (png_ptr == NULL) 239a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott return; 240b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 241893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->transformations |= PNG_INVERT_ALPHA; 242893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 243893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 244893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 245893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) 246893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 247b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_set_invert_mono(png_structrp png_ptr) 248893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 2494215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_set_invert_mono"); 2505f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 251a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (png_ptr == NULL) 252a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott return; 253b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 254893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->transformations |= PNG_INVERT_MONO; 255893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 256893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 257a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* Invert monochrome grayscale data */ 258893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 259893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_do_invert(png_row_infop row_info, png_bytep row) 260893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 2614215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_do_invert"); 2625f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 263893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project /* This test removed from libpng version 1.0.13 and 1.2.0: 264893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * if (row_info->bit_depth == 1 && 265893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 266893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (row_info->color_type == PNG_COLOR_TYPE_GRAY) 267893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 268893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_bytep rp = row; 269b50c217251b086440efcdb273c22f86a06c80cbaChris Craik png_size_t i; 270b50c217251b086440efcdb273c22f86a06c80cbaChris Craik png_size_t istop = row_info->rowbytes; 271893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 272893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < istop; i++) 273893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 274893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *rp = (png_byte)(~(*rp)); 275893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project rp++; 276893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 277893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 278b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 279893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && 280893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project row_info->bit_depth == 8) 281893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 282893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_bytep rp = row; 283b50c217251b086440efcdb273c22f86a06c80cbaChris Craik png_size_t i; 284b50c217251b086440efcdb273c22f86a06c80cbaChris Craik png_size_t istop = row_info->rowbytes; 285893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 286b50c217251b086440efcdb273c22f86a06c80cbaChris Craik for (i = 0; i < istop; i += 2) 287893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 288893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *rp = (png_byte)(~(*rp)); 289b50c217251b086440efcdb273c22f86a06c80cbaChris Craik rp += 2; 290893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 291893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 292b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 293b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_16BIT_SUPPORTED 294893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && 295893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project row_info->bit_depth == 16) 296893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 297893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_bytep rp = row; 298b50c217251b086440efcdb273c22f86a06c80cbaChris Craik png_size_t i; 299b50c217251b086440efcdb273c22f86a06c80cbaChris Craik png_size_t istop = row_info->rowbytes; 300893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 301b50c217251b086440efcdb273c22f86a06c80cbaChris Craik for (i = 0; i < istop; i += 4) 302893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 303893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *rp = (png_byte)(~(*rp)); 304b50c217251b086440efcdb273c22f86a06c80cbaChris Craik *(rp + 1) = (png_byte)(~(*(rp + 1))); 305b50c217251b086440efcdb273c22f86a06c80cbaChris Craik rp += 4; 306893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 307893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 308b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif 309893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 310893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 311893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 312b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_16BIT_SUPPORTED 313893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) 314a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* Swaps byte order on 16 bit depth images */ 315893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 316893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_do_swap(png_row_infop row_info, png_bytep row) 317893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 3184215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_do_swap"); 3195f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 320b50c217251b086440efcdb273c22f86a06c80cbaChris Craik if (row_info->bit_depth == 16) 321893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 322893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_bytep rp = row; 323893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 i; 324893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 istop= row_info->width * row_info->channels; 325893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 326893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < istop; i++, rp += 2) 327893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 328893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_byte t = *rp; 329893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *rp = *(rp + 1); 330893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(rp + 1) = t; 331893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 332893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 333893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 334893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 335b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif 336893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 337893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED) 338893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic PNG_CONST png_byte onebppswaptable[256] = { 339893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 340893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0, 341893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, 342893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8, 343893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, 344893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4, 345893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, 346893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC, 347893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, 348893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2, 349893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, 350893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA, 351893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, 352893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6, 353893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, 354893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE, 355893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, 356893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1, 357893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, 358893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9, 359893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, 360893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5, 361893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, 362893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD, 363893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, 364893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3, 365893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, 366893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB, 367893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, 368893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7, 369893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 370893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF 371893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}; 372893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 373893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic PNG_CONST png_byte twobppswaptable[256] = { 374893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x00, 0x40, 0x80, 0xC0, 0x10, 0x50, 0x90, 0xD0, 375893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x20, 0x60, 0xA0, 0xE0, 0x30, 0x70, 0xB0, 0xF0, 376893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x04, 0x44, 0x84, 0xC4, 0x14, 0x54, 0x94, 0xD4, 377893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x24, 0x64, 0xA4, 0xE4, 0x34, 0x74, 0xB4, 0xF4, 378893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x08, 0x48, 0x88, 0xC8, 0x18, 0x58, 0x98, 0xD8, 379893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x28, 0x68, 0xA8, 0xE8, 0x38, 0x78, 0xB8, 0xF8, 380893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x0C, 0x4C, 0x8C, 0xCC, 0x1C, 0x5C, 0x9C, 0xDC, 381893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x2C, 0x6C, 0xAC, 0xEC, 0x3C, 0x7C, 0xBC, 0xFC, 382893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x01, 0x41, 0x81, 0xC1, 0x11, 0x51, 0x91, 0xD1, 383893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x21, 0x61, 0xA1, 0xE1, 0x31, 0x71, 0xB1, 0xF1, 384893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x05, 0x45, 0x85, 0xC5, 0x15, 0x55, 0x95, 0xD5, 385893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x25, 0x65, 0xA5, 0xE5, 0x35, 0x75, 0xB5, 0xF5, 386893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x09, 0x49, 0x89, 0xC9, 0x19, 0x59, 0x99, 0xD9, 387893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x29, 0x69, 0xA9, 0xE9, 0x39, 0x79, 0xB9, 0xF9, 388893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x0D, 0x4D, 0x8D, 0xCD, 0x1D, 0x5D, 0x9D, 0xDD, 389893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x2D, 0x6D, 0xAD, 0xED, 0x3D, 0x7D, 0xBD, 0xFD, 390893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x02, 0x42, 0x82, 0xC2, 0x12, 0x52, 0x92, 0xD2, 391893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x22, 0x62, 0xA2, 0xE2, 0x32, 0x72, 0xB2, 0xF2, 392893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x06, 0x46, 0x86, 0xC6, 0x16, 0x56, 0x96, 0xD6, 393893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x26, 0x66, 0xA6, 0xE6, 0x36, 0x76, 0xB6, 0xF6, 394893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x0A, 0x4A, 0x8A, 0xCA, 0x1A, 0x5A, 0x9A, 0xDA, 395893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x2A, 0x6A, 0xAA, 0xEA, 0x3A, 0x7A, 0xBA, 0xFA, 396893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x0E, 0x4E, 0x8E, 0xCE, 0x1E, 0x5E, 0x9E, 0xDE, 397893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x2E, 0x6E, 0xAE, 0xEE, 0x3E, 0x7E, 0xBE, 0xFE, 398893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x03, 0x43, 0x83, 0xC3, 0x13, 0x53, 0x93, 0xD3, 399893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x23, 0x63, 0xA3, 0xE3, 0x33, 0x73, 0xB3, 0xF3, 400893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x07, 0x47, 0x87, 0xC7, 0x17, 0x57, 0x97, 0xD7, 401893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x27, 0x67, 0xA7, 0xE7, 0x37, 0x77, 0xB7, 0xF7, 402893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x0B, 0x4B, 0x8B, 0xCB, 0x1B, 0x5B, 0x9B, 0xDB, 403893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x2B, 0x6B, 0xAB, 0xEB, 0x3B, 0x7B, 0xBB, 0xFB, 404893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x0F, 0x4F, 0x8F, 0xCF, 0x1F, 0x5F, 0x9F, 0xDF, 405893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x2F, 0x6F, 0xAF, 0xEF, 0x3F, 0x7F, 0xBF, 0xFF 406893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}; 407893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 408893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectstatic PNG_CONST png_byte fourbppswaptable[256] = { 409893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 410893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0, 411893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71, 412893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1, 413893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72, 414893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x82, 0x92, 0xA2, 0xB2, 0xC2, 0xD2, 0xE2, 0xF2, 415893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73, 416893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x83, 0x93, 0xA3, 0xB3, 0xC3, 0xD3, 0xE3, 0xF3, 417893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74, 418893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x84, 0x94, 0xA4, 0xB4, 0xC4, 0xD4, 0xE4, 0xF4, 419893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75, 420893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x85, 0x95, 0xA5, 0xB5, 0xC5, 0xD5, 0xE5, 0xF5, 421893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76, 422893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x86, 0x96, 0xA6, 0xB6, 0xC6, 0xD6, 0xE6, 0xF6, 423893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77, 424893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x87, 0x97, 0xA7, 0xB7, 0xC7, 0xD7, 0xE7, 0xF7, 425893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78, 426893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x88, 0x98, 0xA8, 0xB8, 0xC8, 0xD8, 0xE8, 0xF8, 427893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79, 428893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, 0xE9, 0xF9, 429893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x0A, 0x1A, 0x2A, 0x3A, 0x4A, 0x5A, 0x6A, 0x7A, 430893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x8A, 0x9A, 0xAA, 0xBA, 0xCA, 0xDA, 0xEA, 0xFA, 431893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x0B, 0x1B, 0x2B, 0x3B, 0x4B, 0x5B, 0x6B, 0x7B, 432893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x8B, 0x9B, 0xAB, 0xBB, 0xCB, 0xDB, 0xEB, 0xFB, 433893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x0C, 0x1C, 0x2C, 0x3C, 0x4C, 0x5C, 0x6C, 0x7C, 434893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x8C, 0x9C, 0xAC, 0xBC, 0xCC, 0xDC, 0xEC, 0xFC, 435893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x0D, 0x1D, 0x2D, 0x3D, 0x4D, 0x5D, 0x6D, 0x7D, 436893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x8D, 0x9D, 0xAD, 0xBD, 0xCD, 0xDD, 0xED, 0xFD, 437893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x0E, 0x1E, 0x2E, 0x3E, 0x4E, 0x5E, 0x6E, 0x7E, 438893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x8E, 0x9E, 0xAE, 0xBE, 0xCE, 0xDE, 0xEE, 0xFE, 439893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x0F, 0x1F, 0x2F, 0x3F, 0x4F, 0x5F, 0x6F, 0x7F, 440893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF 441893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project}; 442893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 443a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* Swaps pixel packing order within bytes */ 444893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 445893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_do_packswap(png_row_infop row_info, png_bytep row) 446893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 4474215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_do_packswap"); 4485f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 449b50c217251b086440efcdb273c22f86a06c80cbaChris Craik if (row_info->bit_depth < 8) 450893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 451b50c217251b086440efcdb273c22f86a06c80cbaChris Craik png_bytep rp; 452b50c217251b086440efcdb273c22f86a06c80cbaChris Craik png_const_bytep end, table; 453893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 454893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project end = row + row_info->rowbytes; 455893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 456893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (row_info->bit_depth == 1) 457b50c217251b086440efcdb273c22f86a06c80cbaChris Craik table = onebppswaptable; 458b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 459893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (row_info->bit_depth == 2) 460b50c217251b086440efcdb273c22f86a06c80cbaChris Craik table = twobppswaptable; 461b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 462893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (row_info->bit_depth == 4) 463b50c217251b086440efcdb273c22f86a06c80cbaChris Craik table = fourbppswaptable; 464b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 465893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 466893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project return; 467893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 468893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (rp = row; rp < end; rp++) 469893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *rp = table[*rp]; 470893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 471893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 472893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_READ_PACKSWAP_SUPPORTED or PNG_WRITE_PACKSWAP_SUPPORTED */ 473893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 474893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_WRITE_FILLER_SUPPORTED) || \ 475893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project defined(PNG_READ_STRIP_ALPHA_SUPPORTED) 476b50c217251b086440efcdb273c22f86a06c80cbaChris Craik/* Remove a channel - this used to be 'png_do_strip_filler' but it used a 477b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * somewhat weird combination of flags to determine what to do. All the calls 478b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * to png_do_strip_filler are changed in 1.5.2 to call this instead with the 479b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * correct arguments. 480b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * 481b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * The routine isn't general - the channel must be the channel at the start or 482b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * end (not in the middle) of each pixel. 483b50c217251b086440efcdb273c22f86a06c80cbaChris Craik */ 484893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 485b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_do_strip_channel(png_row_infop row_info, png_bytep row, int at_start) 486893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 487b50c217251b086440efcdb273c22f86a06c80cbaChris Craik png_bytep sp = row; /* source pointer */ 488b50c217251b086440efcdb273c22f86a06c80cbaChris Craik png_bytep dp = row; /* destination pointer */ 489b50c217251b086440efcdb273c22f86a06c80cbaChris Craik png_bytep ep = row + row_info->rowbytes; /* One beyond end of row */ 490b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 491b50c217251b086440efcdb273c22f86a06c80cbaChris Craik /* At the start sp will point to the first byte to copy and dp to where 492b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * it is copied to. ep always points just beyond the end of the row, so 493b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * the loop simply copies (channels-1) channels until sp reaches ep. 494b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * 495b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * at_start: 0 -- convert AG, XG, ARGB, XRGB, AAGG, XXGG, etc. 496b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * nonzero -- convert GA, GX, RGBA, RGBX, GGAA, RRGGBBXX, etc. 497b50c217251b086440efcdb273c22f86a06c80cbaChris Craik */ 498b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 499b50c217251b086440efcdb273c22f86a06c80cbaChris Craik /* GA, GX, XG cases */ 500b50c217251b086440efcdb273c22f86a06c80cbaChris Craik if (row_info->channels == 2) 501893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 502b50c217251b086440efcdb273c22f86a06c80cbaChris Craik if (row_info->bit_depth == 8) 503b50c217251b086440efcdb273c22f86a06c80cbaChris Craik { 504b50c217251b086440efcdb273c22f86a06c80cbaChris Craik if (at_start) /* Skip initial filler */ 505b50c217251b086440efcdb273c22f86a06c80cbaChris Craik ++sp; 506b50c217251b086440efcdb273c22f86a06c80cbaChris Craik else /* Skip initial channel and, for sp, the filler */ 507b50c217251b086440efcdb273c22f86a06c80cbaChris Craik sp += 2, ++dp; 508b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 509b50c217251b086440efcdb273c22f86a06c80cbaChris Craik /* For a 1 pixel wide image there is nothing to do */ 510b50c217251b086440efcdb273c22f86a06c80cbaChris Craik while (sp < ep) 511b50c217251b086440efcdb273c22f86a06c80cbaChris Craik *dp++ = *sp, sp += 2; 512b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 513b50c217251b086440efcdb273c22f86a06c80cbaChris Craik row_info->pixel_depth = 8; 514b50c217251b086440efcdb273c22f86a06c80cbaChris Craik } 515893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 516b50c217251b086440efcdb273c22f86a06c80cbaChris Craik else if (row_info->bit_depth == 16) 517893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 518b50c217251b086440efcdb273c22f86a06c80cbaChris Craik if (at_start) /* Skip initial filler */ 519b50c217251b086440efcdb273c22f86a06c80cbaChris Craik sp += 2; 520b50c217251b086440efcdb273c22f86a06c80cbaChris Craik else /* Skip initial channel and, for sp, the filler */ 521b50c217251b086440efcdb273c22f86a06c80cbaChris Craik sp += 4, dp += 2; 522b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 523b50c217251b086440efcdb273c22f86a06c80cbaChris Craik while (sp < ep) 524b50c217251b086440efcdb273c22f86a06c80cbaChris Craik *dp++ = *sp++, *dp++ = *sp, sp += 3; 525b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 526b50c217251b086440efcdb273c22f86a06c80cbaChris Craik row_info->pixel_depth = 16; 527893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 528b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 529b50c217251b086440efcdb273c22f86a06c80cbaChris Craik else 530b50c217251b086440efcdb273c22f86a06c80cbaChris Craik return; /* bad bit depth */ 531b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 532b50c217251b086440efcdb273c22f86a06c80cbaChris Craik row_info->channels = 1; 533b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 534b50c217251b086440efcdb273c22f86a06c80cbaChris Craik /* Finally fix the color type if it records an alpha channel */ 535b50c217251b086440efcdb273c22f86a06c80cbaChris Craik if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) 536b50c217251b086440efcdb273c22f86a06c80cbaChris Craik row_info->color_type = PNG_COLOR_TYPE_GRAY; 537b50c217251b086440efcdb273c22f86a06c80cbaChris Craik } 538b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 539b50c217251b086440efcdb273c22f86a06c80cbaChris Craik /* RGBA, RGBX, XRGB cases */ 540b50c217251b086440efcdb273c22f86a06c80cbaChris Craik else if (row_info->channels == 4) 541b50c217251b086440efcdb273c22f86a06c80cbaChris Craik { 542b50c217251b086440efcdb273c22f86a06c80cbaChris Craik if (row_info->bit_depth == 8) 543893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 544b50c217251b086440efcdb273c22f86a06c80cbaChris Craik if (at_start) /* Skip initial filler */ 545b50c217251b086440efcdb273c22f86a06c80cbaChris Craik ++sp; 546b50c217251b086440efcdb273c22f86a06c80cbaChris Craik else /* Skip initial channels and, for sp, the filler */ 547b50c217251b086440efcdb273c22f86a06c80cbaChris Craik sp += 4, dp += 3; 548b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 549b50c217251b086440efcdb273c22f86a06c80cbaChris Craik /* Note that the loop adds 3 to dp and 4 to sp each time. */ 550b50c217251b086440efcdb273c22f86a06c80cbaChris Craik while (sp < ep) 551b50c217251b086440efcdb273c22f86a06c80cbaChris Craik *dp++ = *sp++, *dp++ = *sp++, *dp++ = *sp, sp += 2; 552b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 553b50c217251b086440efcdb273c22f86a06c80cbaChris Craik row_info->pixel_depth = 24; 554b50c217251b086440efcdb273c22f86a06c80cbaChris Craik } 555b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 556b50c217251b086440efcdb273c22f86a06c80cbaChris Craik else if (row_info->bit_depth == 16) 557b50c217251b086440efcdb273c22f86a06c80cbaChris Craik { 558b50c217251b086440efcdb273c22f86a06c80cbaChris Craik if (at_start) /* Skip initial filler */ 559b50c217251b086440efcdb273c22f86a06c80cbaChris Craik sp += 2; 560b50c217251b086440efcdb273c22f86a06c80cbaChris Craik else /* Skip initial channels and, for sp, the filler */ 561b50c217251b086440efcdb273c22f86a06c80cbaChris Craik sp += 8, dp += 6; 562b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 563b50c217251b086440efcdb273c22f86a06c80cbaChris Craik while (sp < ep) 564893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 565b50c217251b086440efcdb273c22f86a06c80cbaChris Craik /* Copy 6 bytes, skip 2 */ 566b50c217251b086440efcdb273c22f86a06c80cbaChris Craik *dp++ = *sp++, *dp++ = *sp++; 567b50c217251b086440efcdb273c22f86a06c80cbaChris Craik *dp++ = *sp++, *dp++ = *sp++; 568b50c217251b086440efcdb273c22f86a06c80cbaChris Craik *dp++ = *sp++, *dp++ = *sp, sp += 3; 569893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 570b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 571b50c217251b086440efcdb273c22f86a06c80cbaChris Craik row_info->pixel_depth = 48; 572893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 573b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 574b50c217251b086440efcdb273c22f86a06c80cbaChris Craik else 575b50c217251b086440efcdb273c22f86a06c80cbaChris Craik return; /* bad bit depth */ 576b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 577b50c217251b086440efcdb273c22f86a06c80cbaChris Craik row_info->channels = 3; 578b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 579b50c217251b086440efcdb273c22f86a06c80cbaChris Craik /* Finally fix the color type if it records an alpha channel */ 580b50c217251b086440efcdb273c22f86a06c80cbaChris Craik if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) 581b50c217251b086440efcdb273c22f86a06c80cbaChris Craik row_info->color_type = PNG_COLOR_TYPE_RGB; 582893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 583b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 584b50c217251b086440efcdb273c22f86a06c80cbaChris Craik else 585b50c217251b086440efcdb273c22f86a06c80cbaChris Craik return; /* The filler channel has gone already */ 586b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 587b50c217251b086440efcdb273c22f86a06c80cbaChris Craik /* Fix the rowbytes value. */ 588b50c217251b086440efcdb273c22f86a06c80cbaChris Craik row_info->rowbytes = dp-row; 589893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 590893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 591893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 592893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) 593a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott/* Swaps red and blue bytes within a pixel */ 594893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 595893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_do_bgr(png_row_infop row_info, png_bytep row) 596893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 5974215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_do_bgr"); 5985f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 599b50c217251b086440efcdb273c22f86a06c80cbaChris Craik if ((row_info->color_type & PNG_COLOR_MASK_COLOR)) 600893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 601893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 row_width = row_info->width; 602893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (row_info->bit_depth == 8) 603893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 604893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (row_info->color_type == PNG_COLOR_TYPE_RGB) 605893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 606893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_bytep rp; 607893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 i; 608893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 609893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0, rp = row; i < row_width; i++, rp += 3) 610893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 611893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_byte save = *rp; 612893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *rp = *(rp + 2); 613893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(rp + 2) = save; 614893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 615893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 616b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 617893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) 618893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 619893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_bytep rp; 620893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 i; 621893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 622893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0, rp = row; i < row_width; i++, rp += 4) 623893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 624893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_byte save = *rp; 625893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *rp = *(rp + 2); 626893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(rp + 2) = save; 627893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 628893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 629893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 630b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 631b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_16BIT_SUPPORTED 632893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (row_info->bit_depth == 16) 633893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 634893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (row_info->color_type == PNG_COLOR_TYPE_RGB) 635893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 636893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_bytep rp; 637893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 i; 638893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 639893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0, rp = row; i < row_width; i++, rp += 6) 640893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 641893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_byte save = *rp; 642893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *rp = *(rp + 4); 643893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(rp + 4) = save; 644893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project save = *(rp + 1); 645893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(rp + 1) = *(rp + 5); 646893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(rp + 5) = save; 647893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 648893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 649b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 650893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) 651893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 652893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_bytep rp; 653893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 i; 654893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 655893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0, rp = row; i < row_width; i++, rp += 8) 656893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 657893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_byte save = *rp; 658893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *rp = *(rp + 4); 659893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(rp + 4) = save; 660893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project save = *(rp + 1); 661893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(rp + 1) = *(rp + 5); 662893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(rp + 5) = save; 663893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 664893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 665893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 666b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif 667893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 668893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 669893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */ 670893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 671b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#if defined(PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED) || \ 672b50c217251b086440efcdb273c22f86a06c80cbaChris Craik defined(PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED) 673b50c217251b086440efcdb273c22f86a06c80cbaChris Craik/* Added at libpng-1.5.10 */ 674b50c217251b086440efcdb273c22f86a06c80cbaChris Craikvoid /* PRIVATE */ 675b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_do_check_palette_indexes(png_structrp png_ptr, png_row_infop row_info) 676b50c217251b086440efcdb273c22f86a06c80cbaChris Craik{ 677b50c217251b086440efcdb273c22f86a06c80cbaChris Craik if (png_ptr->num_palette < (1 << row_info->bit_depth) && 678b50c217251b086440efcdb273c22f86a06c80cbaChris Craik png_ptr->num_palette > 0) /* num_palette can be 0 in MNG files */ 679b50c217251b086440efcdb273c22f86a06c80cbaChris Craik { 680b50c217251b086440efcdb273c22f86a06c80cbaChris Craik /* Calculations moved outside switch in an attempt to stop different 681b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * compiler warnings. 'padding' is in *bits* within the last byte, it is 682b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * an 'int' because pixel_depth becomes an 'int' in the expression below, 683b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * and this calculation is used because it avoids warnings that other 684b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * forms produced on either GCC or MSVC. 685b50c217251b086440efcdb273c22f86a06c80cbaChris Craik */ 686b50c217251b086440efcdb273c22f86a06c80cbaChris Craik int padding = (-row_info->pixel_depth * row_info->width) & 7; 687b50c217251b086440efcdb273c22f86a06c80cbaChris Craik png_bytep rp = png_ptr->row_buf + row_info->rowbytes; 688b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 689b50c217251b086440efcdb273c22f86a06c80cbaChris Craik switch (row_info->bit_depth) 690b50c217251b086440efcdb273c22f86a06c80cbaChris Craik { 691b50c217251b086440efcdb273c22f86a06c80cbaChris Craik case 1: 692b50c217251b086440efcdb273c22f86a06c80cbaChris Craik { 693b50c217251b086440efcdb273c22f86a06c80cbaChris Craik /* in this case, all bytes must be 0 so we don't need 694b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * to unpack the pixels except for the rightmost one. 695b50c217251b086440efcdb273c22f86a06c80cbaChris Craik */ 696b50c217251b086440efcdb273c22f86a06c80cbaChris Craik for (; rp > png_ptr->row_buf; rp--) 697b50c217251b086440efcdb273c22f86a06c80cbaChris Craik { 698b50c217251b086440efcdb273c22f86a06c80cbaChris Craik if (*rp >> padding != 0) 699b50c217251b086440efcdb273c22f86a06c80cbaChris Craik png_ptr->num_palette_max = 1; 700b50c217251b086440efcdb273c22f86a06c80cbaChris Craik padding = 0; 701b50c217251b086440efcdb273c22f86a06c80cbaChris Craik } 702b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 703b50c217251b086440efcdb273c22f86a06c80cbaChris Craik break; 704b50c217251b086440efcdb273c22f86a06c80cbaChris Craik } 705b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 706b50c217251b086440efcdb273c22f86a06c80cbaChris Craik case 2: 707b50c217251b086440efcdb273c22f86a06c80cbaChris Craik { 708b50c217251b086440efcdb273c22f86a06c80cbaChris Craik for (; rp > png_ptr->row_buf; rp--) 709b50c217251b086440efcdb273c22f86a06c80cbaChris Craik { 710b50c217251b086440efcdb273c22f86a06c80cbaChris Craik int i = ((*rp >> padding) & 0x03); 711b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 712b50c217251b086440efcdb273c22f86a06c80cbaChris Craik if (i > png_ptr->num_palette_max) 713b50c217251b086440efcdb273c22f86a06c80cbaChris Craik png_ptr->num_palette_max = i; 714b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 715b50c217251b086440efcdb273c22f86a06c80cbaChris Craik i = (((*rp >> padding) >> 2) & 0x03); 716b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 717b50c217251b086440efcdb273c22f86a06c80cbaChris Craik if (i > png_ptr->num_palette_max) 718b50c217251b086440efcdb273c22f86a06c80cbaChris Craik png_ptr->num_palette_max = i; 719b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 720b50c217251b086440efcdb273c22f86a06c80cbaChris Craik i = (((*rp >> padding) >> 4) & 0x03); 721b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 722b50c217251b086440efcdb273c22f86a06c80cbaChris Craik if (i > png_ptr->num_palette_max) 723b50c217251b086440efcdb273c22f86a06c80cbaChris Craik png_ptr->num_palette_max = i; 724b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 725b50c217251b086440efcdb273c22f86a06c80cbaChris Craik i = (((*rp >> padding) >> 6) & 0x03); 726b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 727b50c217251b086440efcdb273c22f86a06c80cbaChris Craik if (i > png_ptr->num_palette_max) 728b50c217251b086440efcdb273c22f86a06c80cbaChris Craik png_ptr->num_palette_max = i; 729b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 730b50c217251b086440efcdb273c22f86a06c80cbaChris Craik padding = 0; 731b50c217251b086440efcdb273c22f86a06c80cbaChris Craik } 732b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 733b50c217251b086440efcdb273c22f86a06c80cbaChris Craik break; 734b50c217251b086440efcdb273c22f86a06c80cbaChris Craik } 735b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 736b50c217251b086440efcdb273c22f86a06c80cbaChris Craik case 4: 737b50c217251b086440efcdb273c22f86a06c80cbaChris Craik { 738b50c217251b086440efcdb273c22f86a06c80cbaChris Craik for (; rp > png_ptr->row_buf; rp--) 739b50c217251b086440efcdb273c22f86a06c80cbaChris Craik { 740b50c217251b086440efcdb273c22f86a06c80cbaChris Craik int i = ((*rp >> padding) & 0x0f); 741b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 742b50c217251b086440efcdb273c22f86a06c80cbaChris Craik if (i > png_ptr->num_palette_max) 743b50c217251b086440efcdb273c22f86a06c80cbaChris Craik png_ptr->num_palette_max = i; 744b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 745b50c217251b086440efcdb273c22f86a06c80cbaChris Craik i = (((*rp >> padding) >> 4) & 0x0f); 746b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 747b50c217251b086440efcdb273c22f86a06c80cbaChris Craik if (i > png_ptr->num_palette_max) 748b50c217251b086440efcdb273c22f86a06c80cbaChris Craik png_ptr->num_palette_max = i; 749b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 750b50c217251b086440efcdb273c22f86a06c80cbaChris Craik padding = 0; 751b50c217251b086440efcdb273c22f86a06c80cbaChris Craik } 752b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 753b50c217251b086440efcdb273c22f86a06c80cbaChris Craik break; 754b50c217251b086440efcdb273c22f86a06c80cbaChris Craik } 755b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 756b50c217251b086440efcdb273c22f86a06c80cbaChris Craik case 8: 757b50c217251b086440efcdb273c22f86a06c80cbaChris Craik { 758b50c217251b086440efcdb273c22f86a06c80cbaChris Craik for (; rp > png_ptr->row_buf; rp--) 759b50c217251b086440efcdb273c22f86a06c80cbaChris Craik { 760b50c217251b086440efcdb273c22f86a06c80cbaChris Craik if (*rp > png_ptr->num_palette_max) 761b50c217251b086440efcdb273c22f86a06c80cbaChris Craik png_ptr->num_palette_max = (int) *rp; 762b50c217251b086440efcdb273c22f86a06c80cbaChris Craik } 763b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 764b50c217251b086440efcdb273c22f86a06c80cbaChris Craik break; 765b50c217251b086440efcdb273c22f86a06c80cbaChris Craik } 766b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 767b50c217251b086440efcdb273c22f86a06c80cbaChris Craik default: 768b50c217251b086440efcdb273c22f86a06c80cbaChris Craik break; 769b50c217251b086440efcdb273c22f86a06c80cbaChris Craik } 770b50c217251b086440efcdb273c22f86a06c80cbaChris Craik } 771b50c217251b086440efcdb273c22f86a06c80cbaChris Craik} 772b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif /* PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED */ 773b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 774893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ 775a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) 776b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED 777893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid PNGAPI 778b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_set_user_transform_info(png_structrp png_ptr, png_voidp 779893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project user_transform_ptr, int user_transform_depth, int user_transform_channels) 780893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 7814215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_set_user_transform_info"); 7825f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 783a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (png_ptr == NULL) 784a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott return; 785b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 786b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED 787b50c217251b086440efcdb273c22f86a06c80cbaChris Craik if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0 && 788b50c217251b086440efcdb273c22f86a06c80cbaChris Craik (png_ptr->flags & PNG_FLAG_ROW_INIT) != 0) 789b50c217251b086440efcdb273c22f86a06c80cbaChris Craik { 790b50c217251b086440efcdb273c22f86a06c80cbaChris Craik png_app_error(png_ptr, 791b50c217251b086440efcdb273c22f86a06c80cbaChris Craik "info change after png_start_read_image or png_read_update_info"); 792b50c217251b086440efcdb273c22f86a06c80cbaChris Craik return; 793b50c217251b086440efcdb273c22f86a06c80cbaChris Craik } 794b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif 795b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 796893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->user_transform_ptr = user_transform_ptr; 797893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->user_transform_depth = (png_byte)user_transform_depth; 798893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_ptr->user_transform_channels = (png_byte)user_transform_channels; 799893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 800893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 801893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 802893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* This function returns a pointer to the user_transform_ptr associated with 803893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * the user transform functions. The application should free any memory 804893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * associated with this pointer before png_write_destroy and png_read_destroy 805893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * are called. 806893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 807b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED 808893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_voidp PNGAPI 809b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_get_user_transform_ptr(png_const_structrp png_ptr) 810893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 811a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott if (png_ptr == NULL) 812a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott return (NULL); 813b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 814b50c217251b086440efcdb273c22f86a06c80cbaChris Craik return png_ptr->user_transform_ptr; 815b50c217251b086440efcdb273c22f86a06c80cbaChris Craik} 816893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 817b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 818b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_USER_TRANSFORM_INFO_SUPPORTED 819b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_uint_32 PNGAPI 820b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_get_current_row_number(png_const_structrp png_ptr) 821b50c217251b086440efcdb273c22f86a06c80cbaChris Craik{ 822b50c217251b086440efcdb273c22f86a06c80cbaChris Craik /* See the comments in png.h - this is the sub-image row when reading and 823b50c217251b086440efcdb273c22f86a06c80cbaChris Craik * interlaced image. 824b50c217251b086440efcdb273c22f86a06c80cbaChris Craik */ 825b50c217251b086440efcdb273c22f86a06c80cbaChris Craik if (png_ptr != NULL) 826b50c217251b086440efcdb273c22f86a06c80cbaChris Craik return png_ptr->row_number; 827b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 828b50c217251b086440efcdb273c22f86a06c80cbaChris Craik return PNG_UINT_32_MAX; /* help the app not to fail silently */ 829b50c217251b086440efcdb273c22f86a06c80cbaChris Craik} 830b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 831b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_byte PNGAPI 832b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_get_current_pass_number(png_const_structrp png_ptr) 833b50c217251b086440efcdb273c22f86a06c80cbaChris Craik{ 834b50c217251b086440efcdb273c22f86a06c80cbaChris Craik if (png_ptr != NULL) 835b50c217251b086440efcdb273c22f86a06c80cbaChris Craik return png_ptr->pass; 836b50c217251b086440efcdb273c22f86a06c80cbaChris Craik return 8; /* invalid */ 837893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 838b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif /* PNG_USER_TRANSFORM_INFO_SUPPORTED */ 839b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#endif /* PNG_READ_USER_TRANSFORM_SUPPORTED || 840b50c217251b086440efcdb273c22f86a06c80cbaChris Craik PNG_WRITE_USER_TRANSFORM_SUPPORTED */ 841893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ 842