1893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 2893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* pngwtran.c - transforms the data in a row for PNG writers 3893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * 4851c67770f9cebece9c79e914a54c348f539a512Matt Sarett * Last changed in libpng 1.6.24 [August 4, 2016] 57a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis * Copyright (c) 1998-2002,2004,2006-2016 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#ifdef PNG_WRITE_SUPPORTED 17b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_WRITE_TRANSFORMS_SUPPORTED 18893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 195f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_PACK_SUPPORTED 20893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Pack pixels into bytes. Pass the true bit depth in bit_depth. The 21893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * row_info bit depth should be 8 (one pixel per byte). The channels 22893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * should be 1 (this only happens on grayscale and paletted images). 23893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 24b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripuraristatic void 25893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth) 26893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 274215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_do_pack"); 285f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 29893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (row_info->bit_depth == 8 && 30893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project row_info->channels == 1) 31893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 32893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project switch ((int)bit_depth) 33893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 34893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 1: 35893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 36893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_bytep sp, dp; 37893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int mask, v; 38893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 i; 39893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 row_width = row_info->width; 40893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 41893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project sp = row; 42893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project dp = row; 43893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project mask = 0x80; 44893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project v = 0; 45893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 46893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < row_width; i++) 47893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 48893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (*sp != 0) 49893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project v |= mask; 50b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 51893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project sp++; 52b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 53893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (mask > 1) 54893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project mask >>= 1; 55b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 56893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 57893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 58893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project mask = 0x80; 59893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *dp = (png_byte)v; 60893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project dp++; 61893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project v = 0; 62893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 63893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 64b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 65893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (mask != 0x80) 66893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *dp = (png_byte)v; 67b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 68893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 69893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 70b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 71893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 2: 72893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 73893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_bytep sp, dp; 749b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett unsigned int shift; 759b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett int v; 76893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 i; 77893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 row_width = row_info->width; 78893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 79893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project sp = row; 80893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project dp = row; 81893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project shift = 6; 82893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project v = 0; 83b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 84893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < row_width; i++) 85893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 86893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_byte value; 87893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 88893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project value = (png_byte)(*sp & 0x03); 89893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project v |= (value << shift); 90b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 91893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (shift == 0) 92893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 93893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project shift = 6; 94893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *dp = (png_byte)v; 95893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project dp++; 96893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project v = 0; 97893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 98b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 99893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 100893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project shift -= 2; 101b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 102893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project sp++; 103893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 104b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 105893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (shift != 6) 106893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *dp = (png_byte)v; 107b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 108893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 109893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 110b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 111893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project case 4: 112893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 113893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_bytep sp, dp; 1149b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett unsigned int shift; 1159b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett int v; 116893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 i; 117893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 row_width = row_info->width; 118893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 119893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project sp = row; 120893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project dp = row; 121893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project shift = 4; 122893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project v = 0; 123b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 124893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < row_width; i++) 125893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 126893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_byte value; 127893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 128893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project value = (png_byte)(*sp & 0x0f); 129893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project v |= (value << shift); 130893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 131893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (shift == 0) 132893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 133893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project shift = 4; 134893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *dp = (png_byte)v; 135893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project dp++; 136893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project v = 0; 137893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 138b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 139893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 140893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project shift -= 4; 141893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 142893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project sp++; 143893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 144b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 145893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (shift != 4) 146893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *dp = (png_byte)v; 147b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 148893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project break; 149893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 150b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 151b50c217251b086440efcdb273c22f86a06c80cbaChris Craik default: 152b50c217251b086440efcdb273c22f86a06c80cbaChris Craik break; 153893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 154b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 155893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project row_info->bit_depth = (png_byte)bit_depth; 156893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project row_info->pixel_depth = (png_byte)(bit_depth * row_info->channels); 157893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, 158b50c217251b086440efcdb273c22f86a06c80cbaChris Craik row_info->width); 159893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 160893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 161893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 162893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1635f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_SHIFT_SUPPORTED 164893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project/* Shift pixel values to take advantage of whole range. Pass the 165893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * true number of bits in bit_depth. The row should be packed 166893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * according to row_info->bit_depth. Thus, if you had a row of 167893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * bit depth 4, but the pixels only had values from 0 to 7, you 168893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * would pass 3 as bit_depth, and this routine would translate the 169893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project * data to 0 to 15. 170893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 171b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripuraristatic void 172b50c217251b086440efcdb273c22f86a06c80cbaChris Craikpng_do_shift(png_row_infop row_info, png_bytep row, 173b50c217251b086440efcdb273c22f86a06c80cbaChris Craik png_const_color_8p bit_depth) 174893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 1754215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_do_shift"); 1765f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 177b50c217251b086440efcdb273c22f86a06c80cbaChris Craik if (row_info->color_type != PNG_COLOR_TYPE_PALETTE) 178893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 179893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int shift_start[4], shift_dec[4]; 180851c67770f9cebece9c79e914a54c348f539a512Matt Sarett int channels = 0; 181893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 1829b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett if ((row_info->color_type & PNG_COLOR_MASK_COLOR) != 0) 183893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 184893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project shift_start[channels] = row_info->bit_depth - bit_depth->red; 185893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project shift_dec[channels] = bit_depth->red; 186893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project channels++; 187b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 188893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project shift_start[channels] = row_info->bit_depth - bit_depth->green; 189893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project shift_dec[channels] = bit_depth->green; 190893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project channels++; 191b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 192893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project shift_start[channels] = row_info->bit_depth - bit_depth->blue; 193893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project shift_dec[channels] = bit_depth->blue; 194893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project channels++; 195893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 196b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 197893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 198893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 199893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project shift_start[channels] = row_info->bit_depth - bit_depth->gray; 200893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project shift_dec[channels] = bit_depth->gray; 201893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project channels++; 202893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 203b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 2049b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett if ((row_info->color_type & PNG_COLOR_MASK_ALPHA) != 0) 205893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 206893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project shift_start[channels] = row_info->bit_depth - bit_depth->alpha; 207893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project shift_dec[channels] = bit_depth->alpha; 208893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project channels++; 209893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 210893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 211a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* With low row depths, could only be grayscale, so one channel */ 212893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (row_info->bit_depth < 8) 213893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 214893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_bytep bp = row; 215b50c217251b086440efcdb273c22f86a06c80cbaChris Craik png_size_t i; 216b50c217251b086440efcdb273c22f86a06c80cbaChris Craik unsigned int mask; 217b50c217251b086440efcdb273c22f86a06c80cbaChris Craik png_size_t row_bytes = row_info->rowbytes; 218893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 219893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (bit_depth->gray == 1 && row_info->bit_depth == 2) 220893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project mask = 0x55; 221b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 222893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (row_info->bit_depth == 4 && bit_depth->gray == 3) 223893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project mask = 0x11; 224b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 225893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 226893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project mask = 0xff; 227893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 228893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < row_bytes; i++, bp++) 229893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 230893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int j; 231b50c217251b086440efcdb273c22f86a06c80cbaChris Craik unsigned int v, out; 232893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 233893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project v = *bp; 234b50c217251b086440efcdb273c22f86a06c80cbaChris Craik out = 0; 235b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 236893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (j = shift_start[0]; j > -shift_dec[0]; j -= shift_dec[0]) 237893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 238893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (j > 0) 239b50c217251b086440efcdb273c22f86a06c80cbaChris Craik out |= v << j; 240b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 241893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 242b50c217251b086440efcdb273c22f86a06c80cbaChris Craik out |= (v >> (-j)) & mask; 243893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 244b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 245b50c217251b086440efcdb273c22f86a06c80cbaChris Craik *bp = (png_byte)(out & 0xff); 246893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 247893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 248b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 249893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (row_info->bit_depth == 8) 250893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 251893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_bytep bp = row; 252893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 i; 253893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 istop = channels * row_info->width; 254893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 255893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0; i < istop; i++, bp++) 256893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 257893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 258b50c217251b086440efcdb273c22f86a06c80cbaChris Craik const unsigned int c = i%channels; 259893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int j; 260b50c217251b086440efcdb273c22f86a06c80cbaChris Craik unsigned int v, out; 261893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 262893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project v = *bp; 263b50c217251b086440efcdb273c22f86a06c80cbaChris Craik out = 0; 264b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 265893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c]) 266893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 267893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (j > 0) 268b50c217251b086440efcdb273c22f86a06c80cbaChris Craik out |= v << j; 269b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 270893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 271b50c217251b086440efcdb273c22f86a06c80cbaChris Craik out |= v >> (-j); 272893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 273b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 274b50c217251b086440efcdb273c22f86a06c80cbaChris Craik *bp = (png_byte)(out & 0xff); 275893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 276893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 277b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 278893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 279893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 280893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_bytep bp; 281893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 i; 282893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 istop = channels * row_info->width; 283893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 284893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (bp = row, i = 0; i < istop; i++) 285893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 286b50c217251b086440efcdb273c22f86a06c80cbaChris Craik const unsigned int c = i%channels; 287893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project int j; 288b50c217251b086440efcdb273c22f86a06c80cbaChris Craik unsigned int value, v; 289893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 290b50c217251b086440efcdb273c22f86a06c80cbaChris Craik v = png_get_uint_16(bp); 291893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project value = 0; 292b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 293893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c]) 294893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 295893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (j > 0) 296b50c217251b086440efcdb273c22f86a06c80cbaChris Craik value |= v << j; 297b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 298893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 299b50c217251b086440efcdb273c22f86a06c80cbaChris Craik value |= v >> (-j); 300893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 301b50c217251b086440efcdb273c22f86a06c80cbaChris Craik *bp++ = (png_byte)((value >> 8) & 0xff); 302893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *bp++ = (png_byte)(value & 0xff); 303893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 304893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 305893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 306893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 307893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 308893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 3095f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED 310b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripuraristatic void 311893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_do_write_swap_alpha(png_row_infop row_info, png_bytep row) 312893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 3134215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_do_write_swap_alpha"); 3145f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 315893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 316893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) 317893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 318893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (row_info->bit_depth == 8) 319893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 320b50c217251b086440efcdb273c22f86a06c80cbaChris Craik /* This converts from ARGB to RGBA */ 321893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_bytep sp, dp; 322893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 i; 323893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 row_width = row_info->width; 324b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 325893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0, sp = dp = row; i < row_width; i++) 326893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 327893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_byte save = *(sp++); 328893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(dp++) = *(sp++); 329893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(dp++) = *(sp++); 330893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(dp++) = *(sp++); 331893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(dp++) = save; 332893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 333893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 334b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 335b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_WRITE_16BIT_SUPPORTED 336893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 337893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 338b50c217251b086440efcdb273c22f86a06c80cbaChris Craik /* This converts from AARRGGBB to RRGGBBAA */ 339893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_bytep sp, dp; 340893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 i; 341893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 row_width = row_info->width; 342893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 343893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0, sp = dp = row; i < row_width; i++) 344893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 345893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_byte save[2]; 346893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project save[0] = *(sp++); 347893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project save[1] = *(sp++); 348893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(dp++) = *(sp++); 349893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(dp++) = *(sp++); 350893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(dp++) = *(sp++); 351893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(dp++) = *(sp++); 352893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(dp++) = *(sp++); 353893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(dp++) = *(sp++); 354893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(dp++) = save[0]; 355893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(dp++) = save[1]; 356893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 357893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 3589b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#endif /* WRITE_16BIT */ 359893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 360b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 361893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) 362893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 363893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (row_info->bit_depth == 8) 364893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 365b50c217251b086440efcdb273c22f86a06c80cbaChris Craik /* This converts from AG to GA */ 366893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_bytep sp, dp; 367893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 i; 368893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 row_width = row_info->width; 369893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 370893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0, sp = dp = row; i < row_width; i++) 371893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 372893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_byte save = *(sp++); 373893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(dp++) = *(sp++); 374893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(dp++) = save; 375893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 376893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 377b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 378b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_WRITE_16BIT_SUPPORTED 379893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 380893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 381b50c217251b086440efcdb273c22f86a06c80cbaChris Craik /* This converts from AAGG to GGAA */ 382893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_bytep sp, dp; 383893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 i; 384893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 row_width = row_info->width; 385893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 386893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0, sp = dp = row; i < row_width; i++) 387893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 388893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_byte save[2]; 389893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project save[0] = *(sp++); 390893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project save[1] = *(sp++); 391893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(dp++) = *(sp++); 392893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(dp++) = *(sp++); 393893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(dp++) = save[0]; 394893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(dp++) = save[1]; 395893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 396893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 3979b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#endif /* WRITE_16BIT */ 398893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 399893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 400893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 401893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 402893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 4035f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott#ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED 404b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripuraristatic void 405893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectpng_do_write_invert_alpha(png_row_infop row_info, png_bytep row) 406893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 4074215dd1533c56e1a89ae6f1d6ea68677fac27fdaThe Android Open Source Project png_debug(1, "in png_do_write_invert_alpha"); 4085f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 409893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 410893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) 411893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 412893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (row_info->bit_depth == 8) 413893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 414b50c217251b086440efcdb273c22f86a06c80cbaChris Craik /* This inverts the alpha channel in RGBA */ 415893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_bytep sp, dp; 416893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 i; 417893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 row_width = row_info->width; 418b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 419893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0, sp = dp = row; i < row_width; i++) 420893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 421a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Does nothing 422893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(dp++) = *(sp++); 423893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(dp++) = *(sp++); 424893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(dp++) = *(sp++); 425893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 426893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project sp+=3; dp = sp; 4279b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett *dp = (png_byte)(255 - *(sp++)); 428893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 429893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 430b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 431b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_WRITE_16BIT_SUPPORTED 432893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 433893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 434b50c217251b086440efcdb273c22f86a06c80cbaChris Craik /* This inverts the alpha channel in RRGGBBAA */ 435893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_bytep sp, dp; 436893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 i; 437893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 row_width = row_info->width; 438893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 439893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0, sp = dp = row; i < row_width; i++) 440893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 441a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Does nothing 442893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(dp++) = *(sp++); 443893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(dp++) = *(sp++); 444893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(dp++) = *(sp++); 445893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(dp++) = *(sp++); 446893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(dp++) = *(sp++); 447893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(dp++) = *(sp++); 448893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 449893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project sp+=6; dp = sp; 450893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(dp++) = (png_byte)(255 - *(sp++)); 4519b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett *dp = (png_byte)(255 - *(sp++)); 452893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 453893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 4549b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#endif /* WRITE_16BIT */ 455893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 456b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 457893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) 458893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 459893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project if (row_info->bit_depth == 8) 460893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 461b50c217251b086440efcdb273c22f86a06c80cbaChris Craik /* This inverts the alpha channel in GA */ 462893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_bytep sp, dp; 463893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 i; 464893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 row_width = row_info->width; 465893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 466893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0, sp = dp = row; i < row_width; i++) 467893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 468893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(dp++) = *(sp++); 469893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(dp++) = (png_byte)(255 - *(sp++)); 470893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 471893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 472b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 473b50c217251b086440efcdb273c22f86a06c80cbaChris Craik#ifdef PNG_WRITE_16BIT_SUPPORTED 474893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project else 475893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 476b50c217251b086440efcdb273c22f86a06c80cbaChris Craik /* This inverts the alpha channel in GGAA */ 477893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_bytep sp, dp; 478893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 i; 479893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project png_uint_32 row_width = row_info->width; 480893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 481893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project for (i = 0, sp = dp = row; i < row_width; i++) 482893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project { 483a0bb96c34e65378853ee518bac502842d26c2d1aPatrick Scott /* Does nothing 484893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(dp++) = *(sp++); 485893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(dp++) = *(sp++); 486893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project */ 487893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project sp+=2; dp = sp; 488893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project *(dp++) = (png_byte)(255 - *(sp++)); 4899b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett *dp = (png_byte)(255 - *(sp++)); 490893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 491893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 4929b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#endif /* WRITE_16BIT */ 493893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 494893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project } 495893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 496893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project#endif 497893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 498b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari/* Transform the data according to the user's wishes. The order of 499b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari * transformations is significant. 500b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari */ 501893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Projectvoid /* PRIVATE */ 502b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripuraripng_do_write_transformations(png_structrp png_ptr, png_row_infop row_info) 503893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project{ 504b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari png_debug(1, "in png_do_write_transformations"); 5055f6bd84e375226bf228fc8ac90318957ec9e1e7fPatrick Scott 506b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari if (png_ptr == NULL) 507b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari return; 508893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 509b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED 5109b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett if ((png_ptr->transformations & PNG_USER_TRANSFORM) != 0) 511b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari if (png_ptr->write_user_transform_fn != NULL) 512b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari (*(png_ptr->write_user_transform_fn)) /* User write transform 513b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari function */ 514b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari (png_ptr, /* png_ptr */ 515b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari row_info, /* row_info: */ 516b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari /* png_uint_32 width; width of row */ 517b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari /* png_size_t rowbytes; number of bytes in row */ 518b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari /* png_byte color_type; color type of pixels */ 519b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari /* png_byte bit_depth; bit depth of samples */ 520b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari /* png_byte channels; number of channels (1-4) */ 521b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari /* png_byte pixel_depth; bits per pixel (depth*channels) */ 522b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari png_ptr->row_buf + 1); /* start of pixel data for row */ 523b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#endif 524b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 525b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#ifdef PNG_WRITE_FILLER_SUPPORTED 5269b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett if ((png_ptr->transformations & PNG_FILLER) != 0) 527b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari png_do_strip_channel(row_info, png_ptr->row_buf + 1, 5287a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis !(png_ptr->flags & PNG_FLAG_FILLER_AFTER)); 529b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#endif 530b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 531b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#ifdef PNG_WRITE_PACKSWAP_SUPPORTED 5329b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett if ((png_ptr->transformations & PNG_PACKSWAP) != 0) 533b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari png_do_packswap(row_info, png_ptr->row_buf + 1); 534b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#endif 535893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 536b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#ifdef PNG_WRITE_PACK_SUPPORTED 5379b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett if ((png_ptr->transformations & PNG_PACK) != 0) 538b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari png_do_pack(row_info, png_ptr->row_buf + 1, 539b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari (png_uint_32)png_ptr->bit_depth); 540b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#endif 541b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 542b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#ifdef PNG_WRITE_SWAP_SUPPORTED 5439b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett# ifdef PNG_16BIT_SUPPORTED 5449b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett if ((png_ptr->transformations & PNG_SWAP_BYTES) != 0) 545b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari png_do_swap(row_info, png_ptr->row_buf + 1); 5469b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett# endif 547b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#endif 548b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari 549b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#ifdef PNG_WRITE_SHIFT_SUPPORTED 5509b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett if ((png_ptr->transformations & PNG_SHIFT) != 0) 551b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari png_do_shift(row_info, png_ptr->row_buf + 1, 5527a055fdaacbcb54d3606638017fb3381f05d96acAlex Naidis &(png_ptr->shift)); 553b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#endif 554893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 555b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED 5569b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett if ((png_ptr->transformations & PNG_SWAP_ALPHA) != 0) 557b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari png_do_write_swap_alpha(row_info, png_ptr->row_buf + 1); 558b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#endif 559b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 560b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED 5619b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett if ((png_ptr->transformations & PNG_INVERT_ALPHA) != 0) 562b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari png_do_write_invert_alpha(row_info, png_ptr->row_buf + 1); 563b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#endif 564b50c217251b086440efcdb273c22f86a06c80cbaChris Craik 565b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#ifdef PNG_WRITE_BGR_SUPPORTED 5669b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett if ((png_ptr->transformations & PNG_BGR) != 0) 567b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari png_do_bgr(row_info, png_ptr->row_buf + 1); 568b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#endif 569893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project 570b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#ifdef PNG_WRITE_INVERT_SUPPORTED 5719b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett if ((png_ptr->transformations & PNG_INVERT_MONO) != 0) 572b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari png_do_invert(row_info, png_ptr->row_buf + 1); 573b478e66e7c2621eef5f465e4629ce642db00716bSireesh Tripurari#endif 574893912bfc2683463dc3e2c445336752d012563d3The Android Open Source Project} 5759b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#endif /* WRITE_TRANSFORMS */ 5769b1fe63dcc7ba076b9730b7bfa031cc0dbc25561Matt Sarett#endif /* WRITE */ 577