pngtrans.c 5.3 KB
Newer Older
G
Guy Schalnat 已提交
1 2 3 4

/* pngtrans.c - transforms the data in a row
   routines used by both readers and writers

A
Andreas Dilger 已提交
5
   libpng 1.0 beta 4 - version 0.90
G
Guy Schalnat 已提交
6
   For conditions of distribution and use, see copyright notice in png.h
G
Guy Schalnat 已提交
7
   Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
A
Andreas Dilger 已提交
8
   January 10, 1997
G
Guy Schalnat 已提交
9 10 11 12 13
   */

#define PNG_INTERNAL
#include "png.h"

G
Guy Schalnat 已提交
14
#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
G
Guy Schalnat 已提交
15 16
/* turn on bgr to rgb mapping */
void
G
Guy Schalnat 已提交
17
png_set_bgr(png_structp png_ptr)
G
Guy Schalnat 已提交
18 19 20
{
   png_ptr->transformations |= PNG_BGR;
}
G
Guy Schalnat 已提交
21
#endif
G
Guy Schalnat 已提交
22

G
Guy Schalnat 已提交
23
#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
G
Guy Schalnat 已提交
24 25
/* turn on 16 bit byte swapping */
void
G
Guy Schalnat 已提交
26
png_set_swap(png_structp png_ptr)
G
Guy Schalnat 已提交
27 28 29 30
{
   if (png_ptr->bit_depth == 16)
      png_ptr->transformations |= PNG_SWAP_BYTES;
}
G
Guy Schalnat 已提交
31
#endif
G
Guy Schalnat 已提交
32

G
Guy Schalnat 已提交
33
#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED)
G
Guy Schalnat 已提交
34 35
/* turn on pixel packing */
void
G
Guy Schalnat 已提交
36
png_set_packing(png_structp png_ptr)
G
Guy Schalnat 已提交
37 38 39 40 41 42 43
{
   if (png_ptr->bit_depth < 8)
   {
      png_ptr->transformations |= PNG_PACK;
      png_ptr->usr_bit_depth = 8;
   }
}
G
Guy Schalnat 已提交
44
#endif
G
Guy Schalnat 已提交
45

G
Guy Schalnat 已提交
46
#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED)
G
Guy Schalnat 已提交
47
void
G
Guy Schalnat 已提交
48
png_set_shift(png_structp png_ptr, png_color_8p true_bits)
G
Guy Schalnat 已提交
49 50 51 52
{
   png_ptr->transformations |= PNG_SHIFT;
   png_ptr->shift = *true_bits;
}
G
Guy Schalnat 已提交
53
#endif
G
Guy Schalnat 已提交
54

G
Guy Schalnat 已提交
55
#if defined(PNG_READ_INTERLACING_SUPPORTED) || defined(PNG_WRITE_INTERLACING_SUPPORTED)
G
Guy Schalnat 已提交
56
int
G
Guy Schalnat 已提交
57
png_set_interlace_handling(png_structp png_ptr)
G
Guy Schalnat 已提交
58 59 60 61 62 63 64 65 66
{
   if (png_ptr->interlaced)
   {
      png_ptr->transformations |= PNG_INTERLACE;
      return 7;
   }

   return 1;
}
G
Guy Schalnat 已提交
67
#endif
G
Guy Schalnat 已提交
68

G
Guy Schalnat 已提交
69
#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)
G
Guy Schalnat 已提交
70
void
A
Andreas Dilger 已提交
71
png_set_filler(png_structp png_ptr, png_byte filler, int filler_loc)
G
Guy Schalnat 已提交
72
{
G
Guy Schalnat 已提交
73
   png_ptr->transformations |= PNG_FILLER;
A
Andreas Dilger 已提交
74
   png_ptr->filler = filler;
G
Guy Schalnat 已提交
75 76 77 78 79
   if (filler_loc == PNG_FILLER_AFTER)
      png_ptr->flags |= PNG_FLAG_FILLER_AFTER;
   else
      png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER;

G
Guy Schalnat 已提交
80 81 82 83 84
   if (png_ptr->color_type == PNG_COLOR_TYPE_RGB &&
      png_ptr->bit_depth == 8)
      png_ptr->usr_channels = 4;
}

A
Andreas Dilger 已提交
85 86 87 88
/* Old functions kept around for compatability purposes.  They will be
 * removed at some time in the future, so don't use them.  You should
 * use png_set_filler() above instead.  We set filler bytes to 0xff in
 * case they are mistakenly used as PNG alpha (0xff is fully opaque). */
G
Guy Schalnat 已提交
89
void
G
Guy Schalnat 已提交
90
png_set_rgbx(png_structp png_ptr)
G
Guy Schalnat 已提交
91
{
A
Andreas Dilger 已提交
92
   png_set_filler(png_ptr, (png_byte)0xff, PNG_FILLER_AFTER);
G
Guy Schalnat 已提交
93 94
}

G
Guy Schalnat 已提交
95
void
G
Guy Schalnat 已提交
96
png_set_xrgb(png_structp png_ptr)
G
Guy Schalnat 已提交
97
{
A
Andreas Dilger 已提交
98
   png_set_filler(png_ptr, (png_byte)0xff, PNG_FILLER_BEFORE);
G
Guy Schalnat 已提交
99
}
G
Guy Schalnat 已提交
100
#endif
G
Guy Schalnat 已提交
101

G
Guy Schalnat 已提交
102
#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED)
G
Guy Schalnat 已提交
103
void
G
Guy Schalnat 已提交
104
png_set_invert_mono(png_structp png_ptr)
G
Guy Schalnat 已提交
105 106 107 108 109 110
{
   png_ptr->transformations |= PNG_INVERT_MONO;
}

/* invert monocrome grayscale data */
void
G
Guy Schalnat 已提交
111
png_do_invert(png_row_infop row_info, png_bytep row)
G
Guy Schalnat 已提交
112 113 114 115
{
   if (row && row_info && row_info->bit_depth == 1 &&
      row_info->color_type == PNG_COLOR_TYPE_GRAY)
   {
G
Guy Schalnat 已提交
116
      png_bytep rp;
G
Guy Schalnat 已提交
117 118 119 120 121 122
      png_uint_32 i;

      for (i = 0, rp = row;
         i < row_info->rowbytes;
         i++, rp++)
      {
G
Guy Schalnat 已提交
123
         *rp = (png_byte)(~(*rp));
G
Guy Schalnat 已提交
124 125 126
      }
   }
}
G
Guy Schalnat 已提交
127
#endif
G
Guy Schalnat 已提交
128

G
Guy Schalnat 已提交
129
#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
G
Guy Schalnat 已提交
130 131
/* swaps byte order on 16 bit depth images */
void
G
Guy Schalnat 已提交
132
png_do_swap(png_row_infop row_info, png_bytep row)
G
Guy Schalnat 已提交
133 134 135
{
   if (row && row_info && row_info->bit_depth == 16)
   {
G
Guy Schalnat 已提交
136
      png_bytep rp;
G
Guy Schalnat 已提交
137
      png_byte t;
G
Guy Schalnat 已提交
138 139 140 141 142 143 144 145 146 147 148 149
      png_uint_32 i;

      for (i = 0, rp = row;
         i < row_info->width * row_info->channels;
         i++, rp += 2)
      {
         t = *rp;
         *rp = *(rp + 1);
         *(rp + 1) = t;
      }
   }
}
G
Guy Schalnat 已提交
150
#endif
G
Guy Schalnat 已提交
151

G
Guy Schalnat 已提交
152
#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
G
Guy Schalnat 已提交
153 154
/* swaps red and blue */
void
G
Guy Schalnat 已提交
155
png_do_bgr(png_row_infop row_info, png_bytep row)
G
Guy Schalnat 已提交
156 157 158 159 160
{
   if (row && row_info && (row_info->color_type & 2))
   {
      if (row_info->color_type == 2 && row_info->bit_depth == 8)
      {
G
Guy Schalnat 已提交
161
         png_bytep rp;
G
Guy Schalnat 已提交
162
         png_byte t;
G
Guy Schalnat 已提交
163 164 165 166 167 168 169 170 171 172 173 174 175
         png_uint_32 i;

         for (i = 0, rp = row;
            i < row_info->width;
            i++, rp += 3)
         {
            t = *rp;
            *rp = *(rp + 2);
            *(rp + 2) = t;
         }
      }
      else if (row_info->color_type == 6 && row_info->bit_depth == 8)
      {
G
Guy Schalnat 已提交
176
         png_bytep rp;
G
Guy Schalnat 已提交
177
         png_byte t;
G
Guy Schalnat 已提交
178 179 180 181 182 183 184 185 186 187 188 189 190
         png_uint_32 i;

         for (i = 0, rp = row;
            i < row_info->width;
            i++, rp += 4)
         {
            t = *rp;
            *rp = *(rp + 2);
            *(rp + 2) = t;
         }
      }
      else if (row_info->color_type == 2 && row_info->bit_depth == 16)
      {
G
Guy Schalnat 已提交
191
         png_bytep rp;
G
Guy Schalnat 已提交
192
         png_byte t[2];
G
Guy Schalnat 已提交
193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208
         png_uint_32 i;

         for (i = 0, rp = row;
            i < row_info->width;
            i++, rp += 6)
         {
            t[0] = *rp;
            t[1] = *(rp + 1);
            *rp = *(rp + 4);
            *(rp + 1) = *(rp + 5);
            *(rp + 4) = t[0];
            *(rp + 5) = t[1];
         }
      }
      else if (row_info->color_type == 6 && row_info->bit_depth == 16)
      {
G
Guy Schalnat 已提交
209
         png_bytep rp;
G
Guy Schalnat 已提交
210
         png_byte t[2];
G
Guy Schalnat 已提交
211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226
         png_uint_32 i;

         for (i = 0, rp = row;
            i < row_info->width;
            i++, rp += 8)
         {
            t[0] = *rp;
            t[1] = *(rp + 1);
            *rp = *(rp + 4);
            *(rp + 1) = *(rp + 5);
            *(rp + 4) = t[0];
            *(rp + 5) = t[1];
         }
      }
   }
}
G
Guy Schalnat 已提交
227
#endif
G
Guy Schalnat 已提交
228