13965825b97a5809454f5810f7e603cbd02daa036scroggo 23965825b97a5809454f5810f7e603cbd02daa036scroggo/* pngwtran.c - transforms the data in a row for PNG writers 33965825b97a5809454f5810f7e603cbd02daa036scroggo * 43965825b97a5809454f5810f7e603cbd02daa036scroggo * Last changed in libpng 1.6.18 [July 23, 2015] 53965825b97a5809454f5810f7e603cbd02daa036scroggo * Copyright (c) 1998-2002,2004,2006-2015 Glenn Randers-Pehrson 63965825b97a5809454f5810f7e603cbd02daa036scroggo * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) 73965825b97a5809454f5810f7e603cbd02daa036scroggo * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) 83965825b97a5809454f5810f7e603cbd02daa036scroggo * 93965825b97a5809454f5810f7e603cbd02daa036scroggo * This code is released under the libpng license. 103965825b97a5809454f5810f7e603cbd02daa036scroggo * For conditions of distribution and use, see the disclaimer 113965825b97a5809454f5810f7e603cbd02daa036scroggo * and license in png.h 123965825b97a5809454f5810f7e603cbd02daa036scroggo */ 133965825b97a5809454f5810f7e603cbd02daa036scroggo 143965825b97a5809454f5810f7e603cbd02daa036scroggo#include "pngpriv.h" 153965825b97a5809454f5810f7e603cbd02daa036scroggo 163965825b97a5809454f5810f7e603cbd02daa036scroggo#ifdef PNG_WRITE_SUPPORTED 173965825b97a5809454f5810f7e603cbd02daa036scroggo#ifdef PNG_WRITE_TRANSFORMS_SUPPORTED 183965825b97a5809454f5810f7e603cbd02daa036scroggo 193965825b97a5809454f5810f7e603cbd02daa036scroggo#ifdef PNG_WRITE_PACK_SUPPORTED 203965825b97a5809454f5810f7e603cbd02daa036scroggo/* Pack pixels into bytes. Pass the true bit depth in bit_depth. The 213965825b97a5809454f5810f7e603cbd02daa036scroggo * row_info bit depth should be 8 (one pixel per byte). The channels 223965825b97a5809454f5810f7e603cbd02daa036scroggo * should be 1 (this only happens on grayscale and paletted images). 233965825b97a5809454f5810f7e603cbd02daa036scroggo */ 243965825b97a5809454f5810f7e603cbd02daa036scroggostatic void 253965825b97a5809454f5810f7e603cbd02daa036scroggopng_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth) 263965825b97a5809454f5810f7e603cbd02daa036scroggo{ 273965825b97a5809454f5810f7e603cbd02daa036scroggo png_debug(1, "in png_do_pack"); 283965825b97a5809454f5810f7e603cbd02daa036scroggo 293965825b97a5809454f5810f7e603cbd02daa036scroggo if (row_info->bit_depth == 8 && 303965825b97a5809454f5810f7e603cbd02daa036scroggo row_info->channels == 1) 313965825b97a5809454f5810f7e603cbd02daa036scroggo { 323965825b97a5809454f5810f7e603cbd02daa036scroggo switch ((int)bit_depth) 333965825b97a5809454f5810f7e603cbd02daa036scroggo { 343965825b97a5809454f5810f7e603cbd02daa036scroggo case 1: 353965825b97a5809454f5810f7e603cbd02daa036scroggo { 363965825b97a5809454f5810f7e603cbd02daa036scroggo png_bytep sp, dp; 373965825b97a5809454f5810f7e603cbd02daa036scroggo int mask, v; 383965825b97a5809454f5810f7e603cbd02daa036scroggo png_uint_32 i; 393965825b97a5809454f5810f7e603cbd02daa036scroggo png_uint_32 row_width = row_info->width; 403965825b97a5809454f5810f7e603cbd02daa036scroggo 413965825b97a5809454f5810f7e603cbd02daa036scroggo sp = row; 423965825b97a5809454f5810f7e603cbd02daa036scroggo dp = row; 433965825b97a5809454f5810f7e603cbd02daa036scroggo mask = 0x80; 443965825b97a5809454f5810f7e603cbd02daa036scroggo v = 0; 453965825b97a5809454f5810f7e603cbd02daa036scroggo 463965825b97a5809454f5810f7e603cbd02daa036scroggo for (i = 0; i < row_width; i++) 473965825b97a5809454f5810f7e603cbd02daa036scroggo { 483965825b97a5809454f5810f7e603cbd02daa036scroggo if (*sp != 0) 493965825b97a5809454f5810f7e603cbd02daa036scroggo v |= mask; 503965825b97a5809454f5810f7e603cbd02daa036scroggo 513965825b97a5809454f5810f7e603cbd02daa036scroggo sp++; 523965825b97a5809454f5810f7e603cbd02daa036scroggo 533965825b97a5809454f5810f7e603cbd02daa036scroggo if (mask > 1) 543965825b97a5809454f5810f7e603cbd02daa036scroggo mask >>= 1; 553965825b97a5809454f5810f7e603cbd02daa036scroggo 563965825b97a5809454f5810f7e603cbd02daa036scroggo else 573965825b97a5809454f5810f7e603cbd02daa036scroggo { 583965825b97a5809454f5810f7e603cbd02daa036scroggo mask = 0x80; 593965825b97a5809454f5810f7e603cbd02daa036scroggo *dp = (png_byte)v; 603965825b97a5809454f5810f7e603cbd02daa036scroggo dp++; 613965825b97a5809454f5810f7e603cbd02daa036scroggo v = 0; 623965825b97a5809454f5810f7e603cbd02daa036scroggo } 633965825b97a5809454f5810f7e603cbd02daa036scroggo } 643965825b97a5809454f5810f7e603cbd02daa036scroggo 653965825b97a5809454f5810f7e603cbd02daa036scroggo if (mask != 0x80) 663965825b97a5809454f5810f7e603cbd02daa036scroggo *dp = (png_byte)v; 673965825b97a5809454f5810f7e603cbd02daa036scroggo 683965825b97a5809454f5810f7e603cbd02daa036scroggo break; 693965825b97a5809454f5810f7e603cbd02daa036scroggo } 703965825b97a5809454f5810f7e603cbd02daa036scroggo 713965825b97a5809454f5810f7e603cbd02daa036scroggo case 2: 723965825b97a5809454f5810f7e603cbd02daa036scroggo { 733965825b97a5809454f5810f7e603cbd02daa036scroggo png_bytep sp, dp; 743965825b97a5809454f5810f7e603cbd02daa036scroggo unsigned int shift; 753965825b97a5809454f5810f7e603cbd02daa036scroggo int v; 763965825b97a5809454f5810f7e603cbd02daa036scroggo png_uint_32 i; 773965825b97a5809454f5810f7e603cbd02daa036scroggo png_uint_32 row_width = row_info->width; 783965825b97a5809454f5810f7e603cbd02daa036scroggo 793965825b97a5809454f5810f7e603cbd02daa036scroggo sp = row; 803965825b97a5809454f5810f7e603cbd02daa036scroggo dp = row; 813965825b97a5809454f5810f7e603cbd02daa036scroggo shift = 6; 823965825b97a5809454f5810f7e603cbd02daa036scroggo v = 0; 833965825b97a5809454f5810f7e603cbd02daa036scroggo 843965825b97a5809454f5810f7e603cbd02daa036scroggo for (i = 0; i < row_width; i++) 853965825b97a5809454f5810f7e603cbd02daa036scroggo { 863965825b97a5809454f5810f7e603cbd02daa036scroggo png_byte value; 873965825b97a5809454f5810f7e603cbd02daa036scroggo 883965825b97a5809454f5810f7e603cbd02daa036scroggo value = (png_byte)(*sp & 0x03); 893965825b97a5809454f5810f7e603cbd02daa036scroggo v |= (value << shift); 903965825b97a5809454f5810f7e603cbd02daa036scroggo 913965825b97a5809454f5810f7e603cbd02daa036scroggo if (shift == 0) 923965825b97a5809454f5810f7e603cbd02daa036scroggo { 933965825b97a5809454f5810f7e603cbd02daa036scroggo shift = 6; 943965825b97a5809454f5810f7e603cbd02daa036scroggo *dp = (png_byte)v; 953965825b97a5809454f5810f7e603cbd02daa036scroggo dp++; 963965825b97a5809454f5810f7e603cbd02daa036scroggo v = 0; 973965825b97a5809454f5810f7e603cbd02daa036scroggo } 983965825b97a5809454f5810f7e603cbd02daa036scroggo 993965825b97a5809454f5810f7e603cbd02daa036scroggo else 1003965825b97a5809454f5810f7e603cbd02daa036scroggo shift -= 2; 1013965825b97a5809454f5810f7e603cbd02daa036scroggo 1023965825b97a5809454f5810f7e603cbd02daa036scroggo sp++; 1033965825b97a5809454f5810f7e603cbd02daa036scroggo } 1043965825b97a5809454f5810f7e603cbd02daa036scroggo 1053965825b97a5809454f5810f7e603cbd02daa036scroggo if (shift != 6) 1063965825b97a5809454f5810f7e603cbd02daa036scroggo *dp = (png_byte)v; 1073965825b97a5809454f5810f7e603cbd02daa036scroggo 1083965825b97a5809454f5810f7e603cbd02daa036scroggo break; 1093965825b97a5809454f5810f7e603cbd02daa036scroggo } 1103965825b97a5809454f5810f7e603cbd02daa036scroggo 1113965825b97a5809454f5810f7e603cbd02daa036scroggo case 4: 1123965825b97a5809454f5810f7e603cbd02daa036scroggo { 1133965825b97a5809454f5810f7e603cbd02daa036scroggo png_bytep sp, dp; 1143965825b97a5809454f5810f7e603cbd02daa036scroggo unsigned int shift; 1153965825b97a5809454f5810f7e603cbd02daa036scroggo int v; 1163965825b97a5809454f5810f7e603cbd02daa036scroggo png_uint_32 i; 1173965825b97a5809454f5810f7e603cbd02daa036scroggo png_uint_32 row_width = row_info->width; 1183965825b97a5809454f5810f7e603cbd02daa036scroggo 1193965825b97a5809454f5810f7e603cbd02daa036scroggo sp = row; 1203965825b97a5809454f5810f7e603cbd02daa036scroggo dp = row; 1213965825b97a5809454f5810f7e603cbd02daa036scroggo shift = 4; 1223965825b97a5809454f5810f7e603cbd02daa036scroggo v = 0; 1233965825b97a5809454f5810f7e603cbd02daa036scroggo 1243965825b97a5809454f5810f7e603cbd02daa036scroggo for (i = 0; i < row_width; i++) 1253965825b97a5809454f5810f7e603cbd02daa036scroggo { 1263965825b97a5809454f5810f7e603cbd02daa036scroggo png_byte value; 1273965825b97a5809454f5810f7e603cbd02daa036scroggo 1283965825b97a5809454f5810f7e603cbd02daa036scroggo value = (png_byte)(*sp & 0x0f); 1293965825b97a5809454f5810f7e603cbd02daa036scroggo v |= (value << shift); 1303965825b97a5809454f5810f7e603cbd02daa036scroggo 1313965825b97a5809454f5810f7e603cbd02daa036scroggo if (shift == 0) 1323965825b97a5809454f5810f7e603cbd02daa036scroggo { 1333965825b97a5809454f5810f7e603cbd02daa036scroggo shift = 4; 1343965825b97a5809454f5810f7e603cbd02daa036scroggo *dp = (png_byte)v; 1353965825b97a5809454f5810f7e603cbd02daa036scroggo dp++; 1363965825b97a5809454f5810f7e603cbd02daa036scroggo v = 0; 1373965825b97a5809454f5810f7e603cbd02daa036scroggo } 1383965825b97a5809454f5810f7e603cbd02daa036scroggo 1393965825b97a5809454f5810f7e603cbd02daa036scroggo else 1403965825b97a5809454f5810f7e603cbd02daa036scroggo shift -= 4; 1413965825b97a5809454f5810f7e603cbd02daa036scroggo 1423965825b97a5809454f5810f7e603cbd02daa036scroggo sp++; 1433965825b97a5809454f5810f7e603cbd02daa036scroggo } 1443965825b97a5809454f5810f7e603cbd02daa036scroggo 1453965825b97a5809454f5810f7e603cbd02daa036scroggo if (shift != 4) 1463965825b97a5809454f5810f7e603cbd02daa036scroggo *dp = (png_byte)v; 1473965825b97a5809454f5810f7e603cbd02daa036scroggo 1483965825b97a5809454f5810f7e603cbd02daa036scroggo break; 1493965825b97a5809454f5810f7e603cbd02daa036scroggo } 1503965825b97a5809454f5810f7e603cbd02daa036scroggo 1513965825b97a5809454f5810f7e603cbd02daa036scroggo default: 1523965825b97a5809454f5810f7e603cbd02daa036scroggo break; 1533965825b97a5809454f5810f7e603cbd02daa036scroggo } 1543965825b97a5809454f5810f7e603cbd02daa036scroggo 1553965825b97a5809454f5810f7e603cbd02daa036scroggo row_info->bit_depth = (png_byte)bit_depth; 1563965825b97a5809454f5810f7e603cbd02daa036scroggo row_info->pixel_depth = (png_byte)(bit_depth * row_info->channels); 1573965825b97a5809454f5810f7e603cbd02daa036scroggo row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, 1583965825b97a5809454f5810f7e603cbd02daa036scroggo row_info->width); 1593965825b97a5809454f5810f7e603cbd02daa036scroggo } 1603965825b97a5809454f5810f7e603cbd02daa036scroggo} 1613965825b97a5809454f5810f7e603cbd02daa036scroggo#endif 1623965825b97a5809454f5810f7e603cbd02daa036scroggo 1633965825b97a5809454f5810f7e603cbd02daa036scroggo#ifdef PNG_WRITE_SHIFT_SUPPORTED 1643965825b97a5809454f5810f7e603cbd02daa036scroggo/* Shift pixel values to take advantage of whole range. Pass the 1653965825b97a5809454f5810f7e603cbd02daa036scroggo * true number of bits in bit_depth. The row should be packed 1663965825b97a5809454f5810f7e603cbd02daa036scroggo * according to row_info->bit_depth. Thus, if you had a row of 1673965825b97a5809454f5810f7e603cbd02daa036scroggo * bit depth 4, but the pixels only had values from 0 to 7, you 1683965825b97a5809454f5810f7e603cbd02daa036scroggo * would pass 3 as bit_depth, and this routine would translate the 1693965825b97a5809454f5810f7e603cbd02daa036scroggo * data to 0 to 15. 1703965825b97a5809454f5810f7e603cbd02daa036scroggo */ 1713965825b97a5809454f5810f7e603cbd02daa036scroggostatic void 1723965825b97a5809454f5810f7e603cbd02daa036scroggopng_do_shift(png_row_infop row_info, png_bytep row, 1733965825b97a5809454f5810f7e603cbd02daa036scroggo png_const_color_8p bit_depth) 1743965825b97a5809454f5810f7e603cbd02daa036scroggo{ 1753965825b97a5809454f5810f7e603cbd02daa036scroggo png_debug(1, "in png_do_shift"); 1763965825b97a5809454f5810f7e603cbd02daa036scroggo 1773965825b97a5809454f5810f7e603cbd02daa036scroggo if (row_info->color_type != PNG_COLOR_TYPE_PALETTE) 1783965825b97a5809454f5810f7e603cbd02daa036scroggo { 1793965825b97a5809454f5810f7e603cbd02daa036scroggo int shift_start[4], shift_dec[4]; 1803965825b97a5809454f5810f7e603cbd02daa036scroggo int channels = 0; 1813965825b97a5809454f5810f7e603cbd02daa036scroggo 1823965825b97a5809454f5810f7e603cbd02daa036scroggo if ((row_info->color_type & PNG_COLOR_MASK_COLOR) != 0) 1833965825b97a5809454f5810f7e603cbd02daa036scroggo { 1843965825b97a5809454f5810f7e603cbd02daa036scroggo shift_start[channels] = row_info->bit_depth - bit_depth->red; 1853965825b97a5809454f5810f7e603cbd02daa036scroggo shift_dec[channels] = bit_depth->red; 1863965825b97a5809454f5810f7e603cbd02daa036scroggo channels++; 1873965825b97a5809454f5810f7e603cbd02daa036scroggo 1883965825b97a5809454f5810f7e603cbd02daa036scroggo shift_start[channels] = row_info->bit_depth - bit_depth->green; 1893965825b97a5809454f5810f7e603cbd02daa036scroggo shift_dec[channels] = bit_depth->green; 1903965825b97a5809454f5810f7e603cbd02daa036scroggo channels++; 1913965825b97a5809454f5810f7e603cbd02daa036scroggo 1923965825b97a5809454f5810f7e603cbd02daa036scroggo shift_start[channels] = row_info->bit_depth - bit_depth->blue; 1933965825b97a5809454f5810f7e603cbd02daa036scroggo shift_dec[channels] = bit_depth->blue; 1943965825b97a5809454f5810f7e603cbd02daa036scroggo channels++; 1953965825b97a5809454f5810f7e603cbd02daa036scroggo } 1963965825b97a5809454f5810f7e603cbd02daa036scroggo 1973965825b97a5809454f5810f7e603cbd02daa036scroggo else 1983965825b97a5809454f5810f7e603cbd02daa036scroggo { 1993965825b97a5809454f5810f7e603cbd02daa036scroggo shift_start[channels] = row_info->bit_depth - bit_depth->gray; 2003965825b97a5809454f5810f7e603cbd02daa036scroggo shift_dec[channels] = bit_depth->gray; 2013965825b97a5809454f5810f7e603cbd02daa036scroggo channels++; 2023965825b97a5809454f5810f7e603cbd02daa036scroggo } 2033965825b97a5809454f5810f7e603cbd02daa036scroggo 2043965825b97a5809454f5810f7e603cbd02daa036scroggo if ((row_info->color_type & PNG_COLOR_MASK_ALPHA) != 0) 2053965825b97a5809454f5810f7e603cbd02daa036scroggo { 2063965825b97a5809454f5810f7e603cbd02daa036scroggo shift_start[channels] = row_info->bit_depth - bit_depth->alpha; 2073965825b97a5809454f5810f7e603cbd02daa036scroggo shift_dec[channels] = bit_depth->alpha; 2083965825b97a5809454f5810f7e603cbd02daa036scroggo channels++; 2093965825b97a5809454f5810f7e603cbd02daa036scroggo } 2103965825b97a5809454f5810f7e603cbd02daa036scroggo 2113965825b97a5809454f5810f7e603cbd02daa036scroggo /* With low row depths, could only be grayscale, so one channel */ 2123965825b97a5809454f5810f7e603cbd02daa036scroggo if (row_info->bit_depth < 8) 2133965825b97a5809454f5810f7e603cbd02daa036scroggo { 2143965825b97a5809454f5810f7e603cbd02daa036scroggo png_bytep bp = row; 2153965825b97a5809454f5810f7e603cbd02daa036scroggo png_size_t i; 2163965825b97a5809454f5810f7e603cbd02daa036scroggo unsigned int mask; 2173965825b97a5809454f5810f7e603cbd02daa036scroggo png_size_t row_bytes = row_info->rowbytes; 2183965825b97a5809454f5810f7e603cbd02daa036scroggo 2193965825b97a5809454f5810f7e603cbd02daa036scroggo if (bit_depth->gray == 1 && row_info->bit_depth == 2) 2203965825b97a5809454f5810f7e603cbd02daa036scroggo mask = 0x55; 2213965825b97a5809454f5810f7e603cbd02daa036scroggo 2223965825b97a5809454f5810f7e603cbd02daa036scroggo else if (row_info->bit_depth == 4 && bit_depth->gray == 3) 2233965825b97a5809454f5810f7e603cbd02daa036scroggo mask = 0x11; 2243965825b97a5809454f5810f7e603cbd02daa036scroggo 2253965825b97a5809454f5810f7e603cbd02daa036scroggo else 2263965825b97a5809454f5810f7e603cbd02daa036scroggo mask = 0xff; 2273965825b97a5809454f5810f7e603cbd02daa036scroggo 2283965825b97a5809454f5810f7e603cbd02daa036scroggo for (i = 0; i < row_bytes; i++, bp++) 2293965825b97a5809454f5810f7e603cbd02daa036scroggo { 2303965825b97a5809454f5810f7e603cbd02daa036scroggo int j; 2313965825b97a5809454f5810f7e603cbd02daa036scroggo unsigned int v, out; 2323965825b97a5809454f5810f7e603cbd02daa036scroggo 2333965825b97a5809454f5810f7e603cbd02daa036scroggo v = *bp; 2343965825b97a5809454f5810f7e603cbd02daa036scroggo out = 0; 2353965825b97a5809454f5810f7e603cbd02daa036scroggo 2363965825b97a5809454f5810f7e603cbd02daa036scroggo for (j = shift_start[0]; j > -shift_dec[0]; j -= shift_dec[0]) 2373965825b97a5809454f5810f7e603cbd02daa036scroggo { 2383965825b97a5809454f5810f7e603cbd02daa036scroggo if (j > 0) 2393965825b97a5809454f5810f7e603cbd02daa036scroggo out |= v << j; 2403965825b97a5809454f5810f7e603cbd02daa036scroggo 2413965825b97a5809454f5810f7e603cbd02daa036scroggo else 2423965825b97a5809454f5810f7e603cbd02daa036scroggo out |= (v >> (-j)) & mask; 2433965825b97a5809454f5810f7e603cbd02daa036scroggo } 2443965825b97a5809454f5810f7e603cbd02daa036scroggo 2453965825b97a5809454f5810f7e603cbd02daa036scroggo *bp = (png_byte)(out & 0xff); 2463965825b97a5809454f5810f7e603cbd02daa036scroggo } 2473965825b97a5809454f5810f7e603cbd02daa036scroggo } 2483965825b97a5809454f5810f7e603cbd02daa036scroggo 2493965825b97a5809454f5810f7e603cbd02daa036scroggo else if (row_info->bit_depth == 8) 2503965825b97a5809454f5810f7e603cbd02daa036scroggo { 2513965825b97a5809454f5810f7e603cbd02daa036scroggo png_bytep bp = row; 2523965825b97a5809454f5810f7e603cbd02daa036scroggo png_uint_32 i; 2533965825b97a5809454f5810f7e603cbd02daa036scroggo png_uint_32 istop = channels * row_info->width; 2543965825b97a5809454f5810f7e603cbd02daa036scroggo 2553965825b97a5809454f5810f7e603cbd02daa036scroggo for (i = 0; i < istop; i++, bp++) 2563965825b97a5809454f5810f7e603cbd02daa036scroggo { 2573965825b97a5809454f5810f7e603cbd02daa036scroggo 2583965825b97a5809454f5810f7e603cbd02daa036scroggo const unsigned int c = i%channels; 2593965825b97a5809454f5810f7e603cbd02daa036scroggo int j; 2603965825b97a5809454f5810f7e603cbd02daa036scroggo unsigned int v, out; 2613965825b97a5809454f5810f7e603cbd02daa036scroggo 2623965825b97a5809454f5810f7e603cbd02daa036scroggo v = *bp; 2633965825b97a5809454f5810f7e603cbd02daa036scroggo out = 0; 2643965825b97a5809454f5810f7e603cbd02daa036scroggo 2653965825b97a5809454f5810f7e603cbd02daa036scroggo for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c]) 2663965825b97a5809454f5810f7e603cbd02daa036scroggo { 2673965825b97a5809454f5810f7e603cbd02daa036scroggo if (j > 0) 2683965825b97a5809454f5810f7e603cbd02daa036scroggo out |= v << j; 2693965825b97a5809454f5810f7e603cbd02daa036scroggo 2703965825b97a5809454f5810f7e603cbd02daa036scroggo else 2713965825b97a5809454f5810f7e603cbd02daa036scroggo out |= v >> (-j); 2723965825b97a5809454f5810f7e603cbd02daa036scroggo } 2733965825b97a5809454f5810f7e603cbd02daa036scroggo 2743965825b97a5809454f5810f7e603cbd02daa036scroggo *bp = (png_byte)(out & 0xff); 2753965825b97a5809454f5810f7e603cbd02daa036scroggo } 2763965825b97a5809454f5810f7e603cbd02daa036scroggo } 2773965825b97a5809454f5810f7e603cbd02daa036scroggo 2783965825b97a5809454f5810f7e603cbd02daa036scroggo else 2793965825b97a5809454f5810f7e603cbd02daa036scroggo { 2803965825b97a5809454f5810f7e603cbd02daa036scroggo png_bytep bp; 2813965825b97a5809454f5810f7e603cbd02daa036scroggo png_uint_32 i; 2823965825b97a5809454f5810f7e603cbd02daa036scroggo png_uint_32 istop = channels * row_info->width; 2833965825b97a5809454f5810f7e603cbd02daa036scroggo 2843965825b97a5809454f5810f7e603cbd02daa036scroggo for (bp = row, i = 0; i < istop; i++) 2853965825b97a5809454f5810f7e603cbd02daa036scroggo { 2863965825b97a5809454f5810f7e603cbd02daa036scroggo const unsigned int c = i%channels; 2873965825b97a5809454f5810f7e603cbd02daa036scroggo int j; 2883965825b97a5809454f5810f7e603cbd02daa036scroggo unsigned int value, v; 2893965825b97a5809454f5810f7e603cbd02daa036scroggo 2903965825b97a5809454f5810f7e603cbd02daa036scroggo v = png_get_uint_16(bp); 2913965825b97a5809454f5810f7e603cbd02daa036scroggo value = 0; 2923965825b97a5809454f5810f7e603cbd02daa036scroggo 2933965825b97a5809454f5810f7e603cbd02daa036scroggo for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c]) 2943965825b97a5809454f5810f7e603cbd02daa036scroggo { 2953965825b97a5809454f5810f7e603cbd02daa036scroggo if (j > 0) 2963965825b97a5809454f5810f7e603cbd02daa036scroggo value |= v << j; 2973965825b97a5809454f5810f7e603cbd02daa036scroggo 2983965825b97a5809454f5810f7e603cbd02daa036scroggo else 2993965825b97a5809454f5810f7e603cbd02daa036scroggo value |= v >> (-j); 3003965825b97a5809454f5810f7e603cbd02daa036scroggo } 3013965825b97a5809454f5810f7e603cbd02daa036scroggo *bp++ = (png_byte)((value >> 8) & 0xff); 3023965825b97a5809454f5810f7e603cbd02daa036scroggo *bp++ = (png_byte)(value & 0xff); 3033965825b97a5809454f5810f7e603cbd02daa036scroggo } 3043965825b97a5809454f5810f7e603cbd02daa036scroggo } 3053965825b97a5809454f5810f7e603cbd02daa036scroggo } 3063965825b97a5809454f5810f7e603cbd02daa036scroggo} 3073965825b97a5809454f5810f7e603cbd02daa036scroggo#endif 3083965825b97a5809454f5810f7e603cbd02daa036scroggo 3093965825b97a5809454f5810f7e603cbd02daa036scroggo#ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED 3103965825b97a5809454f5810f7e603cbd02daa036scroggostatic void 3113965825b97a5809454f5810f7e603cbd02daa036scroggopng_do_write_swap_alpha(png_row_infop row_info, png_bytep row) 3123965825b97a5809454f5810f7e603cbd02daa036scroggo{ 3133965825b97a5809454f5810f7e603cbd02daa036scroggo png_debug(1, "in png_do_write_swap_alpha"); 3143965825b97a5809454f5810f7e603cbd02daa036scroggo 3153965825b97a5809454f5810f7e603cbd02daa036scroggo { 3163965825b97a5809454f5810f7e603cbd02daa036scroggo if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) 3173965825b97a5809454f5810f7e603cbd02daa036scroggo { 3183965825b97a5809454f5810f7e603cbd02daa036scroggo if (row_info->bit_depth == 8) 3193965825b97a5809454f5810f7e603cbd02daa036scroggo { 3203965825b97a5809454f5810f7e603cbd02daa036scroggo /* This converts from ARGB to RGBA */ 3213965825b97a5809454f5810f7e603cbd02daa036scroggo png_bytep sp, dp; 3223965825b97a5809454f5810f7e603cbd02daa036scroggo png_uint_32 i; 3233965825b97a5809454f5810f7e603cbd02daa036scroggo png_uint_32 row_width = row_info->width; 3243965825b97a5809454f5810f7e603cbd02daa036scroggo 3253965825b97a5809454f5810f7e603cbd02daa036scroggo for (i = 0, sp = dp = row; i < row_width; i++) 3263965825b97a5809454f5810f7e603cbd02daa036scroggo { 3273965825b97a5809454f5810f7e603cbd02daa036scroggo png_byte save = *(sp++); 3283965825b97a5809454f5810f7e603cbd02daa036scroggo *(dp++) = *(sp++); 3293965825b97a5809454f5810f7e603cbd02daa036scroggo *(dp++) = *(sp++); 3303965825b97a5809454f5810f7e603cbd02daa036scroggo *(dp++) = *(sp++); 3313965825b97a5809454f5810f7e603cbd02daa036scroggo *(dp++) = save; 3323965825b97a5809454f5810f7e603cbd02daa036scroggo } 3333965825b97a5809454f5810f7e603cbd02daa036scroggo } 3343965825b97a5809454f5810f7e603cbd02daa036scroggo 3353965825b97a5809454f5810f7e603cbd02daa036scroggo#ifdef PNG_WRITE_16BIT_SUPPORTED 3363965825b97a5809454f5810f7e603cbd02daa036scroggo else 3373965825b97a5809454f5810f7e603cbd02daa036scroggo { 3383965825b97a5809454f5810f7e603cbd02daa036scroggo /* This converts from AARRGGBB to RRGGBBAA */ 3393965825b97a5809454f5810f7e603cbd02daa036scroggo png_bytep sp, dp; 3403965825b97a5809454f5810f7e603cbd02daa036scroggo png_uint_32 i; 3413965825b97a5809454f5810f7e603cbd02daa036scroggo png_uint_32 row_width = row_info->width; 3423965825b97a5809454f5810f7e603cbd02daa036scroggo 3433965825b97a5809454f5810f7e603cbd02daa036scroggo for (i = 0, sp = dp = row; i < row_width; i++) 3443965825b97a5809454f5810f7e603cbd02daa036scroggo { 3453965825b97a5809454f5810f7e603cbd02daa036scroggo png_byte save[2]; 3463965825b97a5809454f5810f7e603cbd02daa036scroggo save[0] = *(sp++); 3473965825b97a5809454f5810f7e603cbd02daa036scroggo save[1] = *(sp++); 3483965825b97a5809454f5810f7e603cbd02daa036scroggo *(dp++) = *(sp++); 3493965825b97a5809454f5810f7e603cbd02daa036scroggo *(dp++) = *(sp++); 3503965825b97a5809454f5810f7e603cbd02daa036scroggo *(dp++) = *(sp++); 3513965825b97a5809454f5810f7e603cbd02daa036scroggo *(dp++) = *(sp++); 3523965825b97a5809454f5810f7e603cbd02daa036scroggo *(dp++) = *(sp++); 3533965825b97a5809454f5810f7e603cbd02daa036scroggo *(dp++) = *(sp++); 3543965825b97a5809454f5810f7e603cbd02daa036scroggo *(dp++) = save[0]; 3553965825b97a5809454f5810f7e603cbd02daa036scroggo *(dp++) = save[1]; 3563965825b97a5809454f5810f7e603cbd02daa036scroggo } 3573965825b97a5809454f5810f7e603cbd02daa036scroggo } 3583965825b97a5809454f5810f7e603cbd02daa036scroggo#endif /* WRITE_16BIT */ 3593965825b97a5809454f5810f7e603cbd02daa036scroggo } 3603965825b97a5809454f5810f7e603cbd02daa036scroggo 3613965825b97a5809454f5810f7e603cbd02daa036scroggo else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) 3623965825b97a5809454f5810f7e603cbd02daa036scroggo { 3633965825b97a5809454f5810f7e603cbd02daa036scroggo if (row_info->bit_depth == 8) 3643965825b97a5809454f5810f7e603cbd02daa036scroggo { 3653965825b97a5809454f5810f7e603cbd02daa036scroggo /* This converts from AG to GA */ 3663965825b97a5809454f5810f7e603cbd02daa036scroggo png_bytep sp, dp; 3673965825b97a5809454f5810f7e603cbd02daa036scroggo png_uint_32 i; 3683965825b97a5809454f5810f7e603cbd02daa036scroggo png_uint_32 row_width = row_info->width; 3693965825b97a5809454f5810f7e603cbd02daa036scroggo 3703965825b97a5809454f5810f7e603cbd02daa036scroggo for (i = 0, sp = dp = row; i < row_width; i++) 3713965825b97a5809454f5810f7e603cbd02daa036scroggo { 3723965825b97a5809454f5810f7e603cbd02daa036scroggo png_byte save = *(sp++); 3733965825b97a5809454f5810f7e603cbd02daa036scroggo *(dp++) = *(sp++); 3743965825b97a5809454f5810f7e603cbd02daa036scroggo *(dp++) = save; 3753965825b97a5809454f5810f7e603cbd02daa036scroggo } 3763965825b97a5809454f5810f7e603cbd02daa036scroggo } 3773965825b97a5809454f5810f7e603cbd02daa036scroggo 3783965825b97a5809454f5810f7e603cbd02daa036scroggo#ifdef PNG_WRITE_16BIT_SUPPORTED 3793965825b97a5809454f5810f7e603cbd02daa036scroggo else 3803965825b97a5809454f5810f7e603cbd02daa036scroggo { 3813965825b97a5809454f5810f7e603cbd02daa036scroggo /* This converts from AAGG to GGAA */ 3823965825b97a5809454f5810f7e603cbd02daa036scroggo png_bytep sp, dp; 3833965825b97a5809454f5810f7e603cbd02daa036scroggo png_uint_32 i; 3843965825b97a5809454f5810f7e603cbd02daa036scroggo png_uint_32 row_width = row_info->width; 3853965825b97a5809454f5810f7e603cbd02daa036scroggo 3863965825b97a5809454f5810f7e603cbd02daa036scroggo for (i = 0, sp = dp = row; i < row_width; i++) 3873965825b97a5809454f5810f7e603cbd02daa036scroggo { 3883965825b97a5809454f5810f7e603cbd02daa036scroggo png_byte save[2]; 3893965825b97a5809454f5810f7e603cbd02daa036scroggo save[0] = *(sp++); 3903965825b97a5809454f5810f7e603cbd02daa036scroggo save[1] = *(sp++); 3913965825b97a5809454f5810f7e603cbd02daa036scroggo *(dp++) = *(sp++); 3923965825b97a5809454f5810f7e603cbd02daa036scroggo *(dp++) = *(sp++); 3933965825b97a5809454f5810f7e603cbd02daa036scroggo *(dp++) = save[0]; 3943965825b97a5809454f5810f7e603cbd02daa036scroggo *(dp++) = save[1]; 3953965825b97a5809454f5810f7e603cbd02daa036scroggo } 3963965825b97a5809454f5810f7e603cbd02daa036scroggo } 3973965825b97a5809454f5810f7e603cbd02daa036scroggo#endif /* WRITE_16BIT */ 3983965825b97a5809454f5810f7e603cbd02daa036scroggo } 3993965825b97a5809454f5810f7e603cbd02daa036scroggo } 4003965825b97a5809454f5810f7e603cbd02daa036scroggo} 4013965825b97a5809454f5810f7e603cbd02daa036scroggo#endif 4023965825b97a5809454f5810f7e603cbd02daa036scroggo 4033965825b97a5809454f5810f7e603cbd02daa036scroggo#ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED 4043965825b97a5809454f5810f7e603cbd02daa036scroggostatic void 4053965825b97a5809454f5810f7e603cbd02daa036scroggopng_do_write_invert_alpha(png_row_infop row_info, png_bytep row) 4063965825b97a5809454f5810f7e603cbd02daa036scroggo{ 4073965825b97a5809454f5810f7e603cbd02daa036scroggo png_debug(1, "in png_do_write_invert_alpha"); 4083965825b97a5809454f5810f7e603cbd02daa036scroggo 4093965825b97a5809454f5810f7e603cbd02daa036scroggo { 4103965825b97a5809454f5810f7e603cbd02daa036scroggo if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) 4113965825b97a5809454f5810f7e603cbd02daa036scroggo { 4123965825b97a5809454f5810f7e603cbd02daa036scroggo if (row_info->bit_depth == 8) 4133965825b97a5809454f5810f7e603cbd02daa036scroggo { 4143965825b97a5809454f5810f7e603cbd02daa036scroggo /* This inverts the alpha channel in RGBA */ 4153965825b97a5809454f5810f7e603cbd02daa036scroggo png_bytep sp, dp; 4163965825b97a5809454f5810f7e603cbd02daa036scroggo png_uint_32 i; 4173965825b97a5809454f5810f7e603cbd02daa036scroggo png_uint_32 row_width = row_info->width; 4183965825b97a5809454f5810f7e603cbd02daa036scroggo 4193965825b97a5809454f5810f7e603cbd02daa036scroggo for (i = 0, sp = dp = row; i < row_width; i++) 4203965825b97a5809454f5810f7e603cbd02daa036scroggo { 4213965825b97a5809454f5810f7e603cbd02daa036scroggo /* Does nothing 4223965825b97a5809454f5810f7e603cbd02daa036scroggo *(dp++) = *(sp++); 4233965825b97a5809454f5810f7e603cbd02daa036scroggo *(dp++) = *(sp++); 4243965825b97a5809454f5810f7e603cbd02daa036scroggo *(dp++) = *(sp++); 4253965825b97a5809454f5810f7e603cbd02daa036scroggo */ 4263965825b97a5809454f5810f7e603cbd02daa036scroggo sp+=3; dp = sp; 4273965825b97a5809454f5810f7e603cbd02daa036scroggo *dp = (png_byte)(255 - *(sp++)); 4283965825b97a5809454f5810f7e603cbd02daa036scroggo } 4293965825b97a5809454f5810f7e603cbd02daa036scroggo } 4303965825b97a5809454f5810f7e603cbd02daa036scroggo 4313965825b97a5809454f5810f7e603cbd02daa036scroggo#ifdef PNG_WRITE_16BIT_SUPPORTED 4323965825b97a5809454f5810f7e603cbd02daa036scroggo else 4333965825b97a5809454f5810f7e603cbd02daa036scroggo { 4343965825b97a5809454f5810f7e603cbd02daa036scroggo /* This inverts the alpha channel in RRGGBBAA */ 4353965825b97a5809454f5810f7e603cbd02daa036scroggo png_bytep sp, dp; 4363965825b97a5809454f5810f7e603cbd02daa036scroggo png_uint_32 i; 4373965825b97a5809454f5810f7e603cbd02daa036scroggo png_uint_32 row_width = row_info->width; 4383965825b97a5809454f5810f7e603cbd02daa036scroggo 4393965825b97a5809454f5810f7e603cbd02daa036scroggo for (i = 0, sp = dp = row; i < row_width; i++) 4403965825b97a5809454f5810f7e603cbd02daa036scroggo { 4413965825b97a5809454f5810f7e603cbd02daa036scroggo /* Does nothing 4423965825b97a5809454f5810f7e603cbd02daa036scroggo *(dp++) = *(sp++); 4433965825b97a5809454f5810f7e603cbd02daa036scroggo *(dp++) = *(sp++); 4443965825b97a5809454f5810f7e603cbd02daa036scroggo *(dp++) = *(sp++); 4453965825b97a5809454f5810f7e603cbd02daa036scroggo *(dp++) = *(sp++); 4463965825b97a5809454f5810f7e603cbd02daa036scroggo *(dp++) = *(sp++); 4473965825b97a5809454f5810f7e603cbd02daa036scroggo *(dp++) = *(sp++); 4483965825b97a5809454f5810f7e603cbd02daa036scroggo */ 4493965825b97a5809454f5810f7e603cbd02daa036scroggo sp+=6; dp = sp; 4503965825b97a5809454f5810f7e603cbd02daa036scroggo *(dp++) = (png_byte)(255 - *(sp++)); 4513965825b97a5809454f5810f7e603cbd02daa036scroggo *dp = (png_byte)(255 - *(sp++)); 4523965825b97a5809454f5810f7e603cbd02daa036scroggo } 4533965825b97a5809454f5810f7e603cbd02daa036scroggo } 4543965825b97a5809454f5810f7e603cbd02daa036scroggo#endif /* WRITE_16BIT */ 4553965825b97a5809454f5810f7e603cbd02daa036scroggo } 4563965825b97a5809454f5810f7e603cbd02daa036scroggo 4573965825b97a5809454f5810f7e603cbd02daa036scroggo else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) 4583965825b97a5809454f5810f7e603cbd02daa036scroggo { 4593965825b97a5809454f5810f7e603cbd02daa036scroggo if (row_info->bit_depth == 8) 4603965825b97a5809454f5810f7e603cbd02daa036scroggo { 4613965825b97a5809454f5810f7e603cbd02daa036scroggo /* This inverts the alpha channel in GA */ 4623965825b97a5809454f5810f7e603cbd02daa036scroggo png_bytep sp, dp; 4633965825b97a5809454f5810f7e603cbd02daa036scroggo png_uint_32 i; 4643965825b97a5809454f5810f7e603cbd02daa036scroggo png_uint_32 row_width = row_info->width; 4653965825b97a5809454f5810f7e603cbd02daa036scroggo 4663965825b97a5809454f5810f7e603cbd02daa036scroggo for (i = 0, sp = dp = row; i < row_width; i++) 4673965825b97a5809454f5810f7e603cbd02daa036scroggo { 4683965825b97a5809454f5810f7e603cbd02daa036scroggo *(dp++) = *(sp++); 4693965825b97a5809454f5810f7e603cbd02daa036scroggo *(dp++) = (png_byte)(255 - *(sp++)); 4703965825b97a5809454f5810f7e603cbd02daa036scroggo } 4713965825b97a5809454f5810f7e603cbd02daa036scroggo } 4723965825b97a5809454f5810f7e603cbd02daa036scroggo 4733965825b97a5809454f5810f7e603cbd02daa036scroggo#ifdef PNG_WRITE_16BIT_SUPPORTED 4743965825b97a5809454f5810f7e603cbd02daa036scroggo else 4753965825b97a5809454f5810f7e603cbd02daa036scroggo { 4763965825b97a5809454f5810f7e603cbd02daa036scroggo /* This inverts the alpha channel in GGAA */ 4773965825b97a5809454f5810f7e603cbd02daa036scroggo png_bytep sp, dp; 4783965825b97a5809454f5810f7e603cbd02daa036scroggo png_uint_32 i; 4793965825b97a5809454f5810f7e603cbd02daa036scroggo png_uint_32 row_width = row_info->width; 4803965825b97a5809454f5810f7e603cbd02daa036scroggo 4813965825b97a5809454f5810f7e603cbd02daa036scroggo for (i = 0, sp = dp = row; i < row_width; i++) 4823965825b97a5809454f5810f7e603cbd02daa036scroggo { 4833965825b97a5809454f5810f7e603cbd02daa036scroggo /* Does nothing 4843965825b97a5809454f5810f7e603cbd02daa036scroggo *(dp++) = *(sp++); 4853965825b97a5809454f5810f7e603cbd02daa036scroggo *(dp++) = *(sp++); 4863965825b97a5809454f5810f7e603cbd02daa036scroggo */ 4873965825b97a5809454f5810f7e603cbd02daa036scroggo sp+=2; dp = sp; 4883965825b97a5809454f5810f7e603cbd02daa036scroggo *(dp++) = (png_byte)(255 - *(sp++)); 4893965825b97a5809454f5810f7e603cbd02daa036scroggo *dp = (png_byte)(255 - *(sp++)); 4903965825b97a5809454f5810f7e603cbd02daa036scroggo } 4913965825b97a5809454f5810f7e603cbd02daa036scroggo } 4923965825b97a5809454f5810f7e603cbd02daa036scroggo#endif /* WRITE_16BIT */ 4933965825b97a5809454f5810f7e603cbd02daa036scroggo } 4943965825b97a5809454f5810f7e603cbd02daa036scroggo } 4953965825b97a5809454f5810f7e603cbd02daa036scroggo} 4963965825b97a5809454f5810f7e603cbd02daa036scroggo#endif 4973965825b97a5809454f5810f7e603cbd02daa036scroggo 4983965825b97a5809454f5810f7e603cbd02daa036scroggo/* Transform the data according to the user's wishes. The order of 4993965825b97a5809454f5810f7e603cbd02daa036scroggo * transformations is significant. 5003965825b97a5809454f5810f7e603cbd02daa036scroggo */ 5013965825b97a5809454f5810f7e603cbd02daa036scroggovoid /* PRIVATE */ 5023965825b97a5809454f5810f7e603cbd02daa036scroggopng_do_write_transformations(png_structrp png_ptr, png_row_infop row_info) 5033965825b97a5809454f5810f7e603cbd02daa036scroggo{ 5043965825b97a5809454f5810f7e603cbd02daa036scroggo png_debug(1, "in png_do_write_transformations"); 5053965825b97a5809454f5810f7e603cbd02daa036scroggo 5063965825b97a5809454f5810f7e603cbd02daa036scroggo if (png_ptr == NULL) 5073965825b97a5809454f5810f7e603cbd02daa036scroggo return; 5083965825b97a5809454f5810f7e603cbd02daa036scroggo 5093965825b97a5809454f5810f7e603cbd02daa036scroggo#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED 5103965825b97a5809454f5810f7e603cbd02daa036scroggo if ((png_ptr->transformations & PNG_USER_TRANSFORM) != 0) 5113965825b97a5809454f5810f7e603cbd02daa036scroggo if (png_ptr->write_user_transform_fn != NULL) 5123965825b97a5809454f5810f7e603cbd02daa036scroggo (*(png_ptr->write_user_transform_fn)) /* User write transform 5133965825b97a5809454f5810f7e603cbd02daa036scroggo function */ 5143965825b97a5809454f5810f7e603cbd02daa036scroggo (png_ptr, /* png_ptr */ 5153965825b97a5809454f5810f7e603cbd02daa036scroggo row_info, /* row_info: */ 5163965825b97a5809454f5810f7e603cbd02daa036scroggo /* png_uint_32 width; width of row */ 5173965825b97a5809454f5810f7e603cbd02daa036scroggo /* png_size_t rowbytes; number of bytes in row */ 5183965825b97a5809454f5810f7e603cbd02daa036scroggo /* png_byte color_type; color type of pixels */ 5193965825b97a5809454f5810f7e603cbd02daa036scroggo /* png_byte bit_depth; bit depth of samples */ 5203965825b97a5809454f5810f7e603cbd02daa036scroggo /* png_byte channels; number of channels (1-4) */ 5213965825b97a5809454f5810f7e603cbd02daa036scroggo /* png_byte pixel_depth; bits per pixel (depth*channels) */ 5223965825b97a5809454f5810f7e603cbd02daa036scroggo png_ptr->row_buf + 1); /* start of pixel data for row */ 5233965825b97a5809454f5810f7e603cbd02daa036scroggo#endif 5243965825b97a5809454f5810f7e603cbd02daa036scroggo 5253965825b97a5809454f5810f7e603cbd02daa036scroggo#ifdef PNG_WRITE_FILLER_SUPPORTED 5263965825b97a5809454f5810f7e603cbd02daa036scroggo if ((png_ptr->transformations & PNG_FILLER) != 0) 5273965825b97a5809454f5810f7e603cbd02daa036scroggo png_do_strip_channel(row_info, png_ptr->row_buf + 1, 5283965825b97a5809454f5810f7e603cbd02daa036scroggo !(png_ptr->flags & PNG_FLAG_FILLER_AFTER)); 5293965825b97a5809454f5810f7e603cbd02daa036scroggo#endif 5303965825b97a5809454f5810f7e603cbd02daa036scroggo 5313965825b97a5809454f5810f7e603cbd02daa036scroggo#ifdef PNG_WRITE_PACKSWAP_SUPPORTED 5323965825b97a5809454f5810f7e603cbd02daa036scroggo if ((png_ptr->transformations & PNG_PACKSWAP) != 0) 5333965825b97a5809454f5810f7e603cbd02daa036scroggo png_do_packswap(row_info, png_ptr->row_buf + 1); 5343965825b97a5809454f5810f7e603cbd02daa036scroggo#endif 5353965825b97a5809454f5810f7e603cbd02daa036scroggo 5363965825b97a5809454f5810f7e603cbd02daa036scroggo#ifdef PNG_WRITE_PACK_SUPPORTED 5373965825b97a5809454f5810f7e603cbd02daa036scroggo if ((png_ptr->transformations & PNG_PACK) != 0) 5383965825b97a5809454f5810f7e603cbd02daa036scroggo png_do_pack(row_info, png_ptr->row_buf + 1, 5393965825b97a5809454f5810f7e603cbd02daa036scroggo (png_uint_32)png_ptr->bit_depth); 5403965825b97a5809454f5810f7e603cbd02daa036scroggo#endif 5413965825b97a5809454f5810f7e603cbd02daa036scroggo 5423965825b97a5809454f5810f7e603cbd02daa036scroggo#ifdef PNG_WRITE_SWAP_SUPPORTED 5433965825b97a5809454f5810f7e603cbd02daa036scroggo# ifdef PNG_16BIT_SUPPORTED 5443965825b97a5809454f5810f7e603cbd02daa036scroggo if ((png_ptr->transformations & PNG_SWAP_BYTES) != 0) 5453965825b97a5809454f5810f7e603cbd02daa036scroggo png_do_swap(row_info, png_ptr->row_buf + 1); 5463965825b97a5809454f5810f7e603cbd02daa036scroggo# endif 5473965825b97a5809454f5810f7e603cbd02daa036scroggo#endif 5483965825b97a5809454f5810f7e603cbd02daa036scroggo 5493965825b97a5809454f5810f7e603cbd02daa036scroggo#ifdef PNG_WRITE_SHIFT_SUPPORTED 5503965825b97a5809454f5810f7e603cbd02daa036scroggo if ((png_ptr->transformations & PNG_SHIFT) != 0) 5513965825b97a5809454f5810f7e603cbd02daa036scroggo png_do_shift(row_info, png_ptr->row_buf + 1, 5523965825b97a5809454f5810f7e603cbd02daa036scroggo &(png_ptr->shift)); 5533965825b97a5809454f5810f7e603cbd02daa036scroggo#endif 5543965825b97a5809454f5810f7e603cbd02daa036scroggo 5553965825b97a5809454f5810f7e603cbd02daa036scroggo#ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED 5563965825b97a5809454f5810f7e603cbd02daa036scroggo if ((png_ptr->transformations & PNG_SWAP_ALPHA) != 0) 5573965825b97a5809454f5810f7e603cbd02daa036scroggo png_do_write_swap_alpha(row_info, png_ptr->row_buf + 1); 5583965825b97a5809454f5810f7e603cbd02daa036scroggo#endif 5593965825b97a5809454f5810f7e603cbd02daa036scroggo 5603965825b97a5809454f5810f7e603cbd02daa036scroggo#ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED 5613965825b97a5809454f5810f7e603cbd02daa036scroggo if ((png_ptr->transformations & PNG_INVERT_ALPHA) != 0) 5623965825b97a5809454f5810f7e603cbd02daa036scroggo png_do_write_invert_alpha(row_info, png_ptr->row_buf + 1); 5633965825b97a5809454f5810f7e603cbd02daa036scroggo#endif 5643965825b97a5809454f5810f7e603cbd02daa036scroggo 5653965825b97a5809454f5810f7e603cbd02daa036scroggo#ifdef PNG_WRITE_BGR_SUPPORTED 5663965825b97a5809454f5810f7e603cbd02daa036scroggo if ((png_ptr->transformations & PNG_BGR) != 0) 5673965825b97a5809454f5810f7e603cbd02daa036scroggo png_do_bgr(row_info, png_ptr->row_buf + 1); 5683965825b97a5809454f5810f7e603cbd02daa036scroggo#endif 5693965825b97a5809454f5810f7e603cbd02daa036scroggo 5703965825b97a5809454f5810f7e603cbd02daa036scroggo#ifdef PNG_WRITE_INVERT_SUPPORTED 5713965825b97a5809454f5810f7e603cbd02daa036scroggo if ((png_ptr->transformations & PNG_INVERT_MONO) != 0) 5723965825b97a5809454f5810f7e603cbd02daa036scroggo png_do_invert(row_info, png_ptr->row_buf + 1); 5733965825b97a5809454f5810f7e603cbd02daa036scroggo#endif 5743965825b97a5809454f5810f7e603cbd02daa036scroggo} 5753965825b97a5809454f5810f7e603cbd02daa036scroggo#endif /* WRITE_TRANSFORMS */ 5763965825b97a5809454f5810f7e603cbd02daa036scroggo#endif /* WRITE */ 577