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