2
2
/* pngtrans.c - transforms the data in a row (used by both readers and writers)
4
* Last changed in libpng 1.2.30 [August 15, 2008]
5
* For conditions of distribution and use, see copyright notice in png.h
6
* Copyright (c) 1998-2008 Glenn Randers-Pehrson
4
* Last changed in libpng 1.2.41 [December 3, 2009]
5
* Copyright (c) 1998-2009 Glenn Randers-Pehrson
7
6
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
8
7
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
9
* This code is released under the libpng license.
10
* For conditions of distribution and use, see the disclaimer
11
* and license in png.h
11
14
#define PNG_INTERNAL
15
#define PNG_NO_PEDANTIC_WARNINGS
13
17
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
15
19
#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
16
/* turn on BGR-to-RGB mapping */
20
/* Turn on BGR-to-RGB mapping */
18
22
png_set_bgr(png_structp png_ptr)
20
24
png_debug(1, "in png_set_bgr");
21
if (png_ptr == NULL) return;
22
28
png_ptr->transformations |= PNG_BGR;
26
32
#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
27
/* turn on 16 bit byte swapping */
33
/* Turn on 16 bit byte swapping */
29
35
png_set_swap(png_structp png_ptr)
31
37
png_debug(1, "in png_set_swap");
32
if (png_ptr == NULL) return;
33
41
if (png_ptr->bit_depth == 16)
34
42
png_ptr->transformations |= PNG_SWAP_BYTES;
38
46
#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED)
39
/* turn on pixel packing */
47
/* Turn on pixel packing */
41
49
png_set_packing(png_structp png_ptr)
43
51
png_debug(1, "in png_set_packing");
44
if (png_ptr == NULL) return;
45
55
if (png_ptr->bit_depth < 8)
47
57
png_ptr->transformations |= PNG_PACK;
53
63
#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
54
/* turn on packed pixel swapping */
64
/* Turn on packed pixel swapping */
56
66
png_set_packswap(png_structp png_ptr)
58
68
png_debug(1, "in png_set_packswap");
59
if (png_ptr == NULL) return;
60
72
if (png_ptr->bit_depth < 8)
61
73
png_ptr->transformations |= PNG_PACKSWAP;
67
79
png_set_shift(png_structp png_ptr, png_color_8p true_bits)
69
81
png_debug(1, "in png_set_shift");
70
if (png_ptr == NULL) return;
71
85
png_ptr->transformations |= PNG_SHIFT;
72
86
png_ptr->shift = *true_bits;
99
114
png_set_filler(png_structp png_ptr, png_uint_32 filler, int filler_loc)
101
116
png_debug(1, "in png_set_filler");
102
if (png_ptr == NULL) return;
103
120
png_ptr->transformations |= PNG_FILLER;
121
#ifdef PNG_LEGACY_SUPPORTED
104
122
png_ptr->filler = (png_byte)filler;
124
png_ptr->filler = (png_uint_16)filler;
105
126
if (filler_loc == PNG_FILLER_AFTER)
106
127
png_ptr->flags |= PNG_FLAG_FILLER_AFTER;
129
#if !defined(PNG_1_0_X)
130
151
/* Added to libpng-1.2.7 */
132
153
png_set_add_alpha(png_structp png_ptr, png_uint_32 filler, int filler_loc)
134
155
png_debug(1, "in png_set_add_alpha");
135
if (png_ptr == NULL) return;
136
159
png_set_filler(png_ptr, filler, filler_loc);
137
160
png_ptr->transformations |= PNG_ADD_ALPHA;
167
194
png_set_invert_mono(png_structp png_ptr)
169
196
png_debug(1, "in png_set_invert_mono");
170
if (png_ptr == NULL) return;
171
200
png_ptr->transformations |= PNG_INVERT_MONO;
174
/* invert monochrome grayscale data */
203
/* Invert monochrome grayscale data */
175
204
void /* PRIVATE */
176
205
png_do_invert(png_row_infop row_info, png_bytep row)
178
207
png_debug(1, "in png_do_invert");
179
209
/* This test removed from libpng version 1.0.13 and 1.2.0:
180
210
* if (row_info->bit_depth == 1 &&
182
#if defined(PNG_USELESS_TESTS_SUPPORTED)
212
#ifdef PNG_USELESS_TESTS_SUPPORTED
183
213
if (row == NULL || row_info == NULL)
228
258
#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
229
/* swaps byte order on 16 bit depth images */
259
/* Swaps byte order on 16 bit depth images */
230
260
void /* PRIVATE */
231
261
png_do_swap(png_row_infop row_info, png_bytep row)
233
263
png_debug(1, "in png_do_swap");
235
#if defined(PNG_USELESS_TESTS_SUPPORTED)
266
#ifdef PNG_USELESS_TESTS_SUPPORTED
236
267
row != NULL && row_info != NULL &&
238
269
row_info->bit_depth == 16)
357
388
0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF
360
/* swaps pixel packing order within bytes */
391
/* Swaps pixel packing order within bytes */
361
392
void /* PRIVATE */
362
393
png_do_packswap(png_row_infop row_info, png_bytep row)
364
395
png_debug(1, "in png_do_packswap");
366
#if defined(PNG_USELESS_TESTS_SUPPORTED)
398
#ifdef PNG_USELESS_TESTS_SUPPORTED
367
399
row != NULL && row_info != NULL &&
369
401
row_info->bit_depth < 8)
390
422
#if defined(PNG_WRITE_FILLER_SUPPORTED) || \
391
423
defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
392
/* remove filler or alpha byte(s) */
424
/* Remove filler or alpha byte(s) */
393
425
void /* PRIVATE */
394
426
png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags)
396
428
png_debug(1, "in png_do_strip_filler");
397
#if defined(PNG_USELESS_TESTS_SUPPORTED)
430
#ifdef PNG_USELESS_TESTS_SUPPORTED
398
431
if (row != NULL && row_info != NULL)
406
439
if ((row_info->color_type == PNG_COLOR_TYPE_RGB ||
407
(row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA &&
408
(flags & PNG_FLAG_STRIP_ALPHA))) &&
409
row_info->channels == 4)
440
(row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA &&
441
(flags & PNG_FLAG_STRIP_ALPHA))) &&
442
row_info->channels == 4)
411
444
if (row_info->bit_depth == 8)
549
582
#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
550
/* swaps red and blue bytes within a pixel */
583
/* Swaps red and blue bytes within a pixel */
551
584
void /* PRIVATE */
552
585
png_do_bgr(png_row_infop row_info, png_bytep row)
554
587
png_debug(1, "in png_do_bgr");
556
#if defined(PNG_USELESS_TESTS_SUPPORTED)
590
#ifdef PNG_USELESS_TESTS_SUPPORTED
557
591
row != NULL && row_info != NULL &&
559
593
(row_info->color_type & PNG_COLOR_MASK_COLOR))
624
658
#endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */
626
660
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
627
defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \
628
defined(PNG_LEGACY_SUPPORTED)
661
defined(PNG_LEGACY_SUPPORTED) || \
662
defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
630
664
png_set_user_transform_info(png_structp png_ptr, png_voidp
631
665
user_transform_ptr, int user_transform_depth, int user_transform_channels)
633
667
png_debug(1, "in png_set_user_transform_info");
634
if (png_ptr == NULL) return;
635
#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
671
#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED
636
672
png_ptr->user_transform_ptr = user_transform_ptr;
637
673
png_ptr->user_transform_depth = (png_byte)user_transform_depth;
638
674
png_ptr->user_transform_channels = (png_byte)user_transform_channels;
653
689
png_get_user_transform_ptr(png_structp png_ptr)
655
if (png_ptr == NULL) return (NULL);
656
#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
693
#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED
657
694
return ((png_voidp)png_ptr->user_transform_ptr);