3dphotoshoot

annotate libs/libpng/pngtrans.c @ 14:06dc8b9b4f89

added libimago, libjpeg and libpng
author John Tsiombikas <nuclear@member.fsf.org>
date Sun, 07 Jun 2015 17:25:49 +0300
parents
children
rev   line source
nuclear@14 1
nuclear@14 2 /* pngtrans.c - transforms the data in a row (used by both readers and writers)
nuclear@14 3 *
nuclear@14 4 * Last changed in libpng 1.2.30 [August 15, 2008]
nuclear@14 5 * For conditions of distribution and use, see copyright notice in png.h
nuclear@14 6 * Copyright (c) 1998-2008 Glenn Randers-Pehrson
nuclear@14 7 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
nuclear@14 8 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
nuclear@14 9 */
nuclear@14 10
nuclear@14 11 #define PNG_INTERNAL
nuclear@14 12 #include "png.h"
nuclear@14 13 #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
nuclear@14 14
nuclear@14 15 #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
nuclear@14 16 /* turn on BGR-to-RGB mapping */
nuclear@14 17 void PNGAPI
nuclear@14 18 png_set_bgr(png_structp png_ptr)
nuclear@14 19 {
nuclear@14 20 png_debug(1, "in png_set_bgr\n");
nuclear@14 21 if (png_ptr == NULL) return;
nuclear@14 22 png_ptr->transformations |= PNG_BGR;
nuclear@14 23 }
nuclear@14 24 #endif
nuclear@14 25
nuclear@14 26 #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
nuclear@14 27 /* turn on 16 bit byte swapping */
nuclear@14 28 void PNGAPI
nuclear@14 29 png_set_swap(png_structp png_ptr)
nuclear@14 30 {
nuclear@14 31 png_debug(1, "in png_set_swap\n");
nuclear@14 32 if (png_ptr == NULL) return;
nuclear@14 33 if (png_ptr->bit_depth == 16)
nuclear@14 34 png_ptr->transformations |= PNG_SWAP_BYTES;
nuclear@14 35 }
nuclear@14 36 #endif
nuclear@14 37
nuclear@14 38 #if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED)
nuclear@14 39 /* turn on pixel packing */
nuclear@14 40 void PNGAPI
nuclear@14 41 png_set_packing(png_structp png_ptr)
nuclear@14 42 {
nuclear@14 43 png_debug(1, "in png_set_packing\n");
nuclear@14 44 if (png_ptr == NULL) return;
nuclear@14 45 if (png_ptr->bit_depth < 8)
nuclear@14 46 {
nuclear@14 47 png_ptr->transformations |= PNG_PACK;
nuclear@14 48 png_ptr->usr_bit_depth = 8;
nuclear@14 49 }
nuclear@14 50 }
nuclear@14 51 #endif
nuclear@14 52
nuclear@14 53 #if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
nuclear@14 54 /* turn on packed pixel swapping */
nuclear@14 55 void PNGAPI
nuclear@14 56 png_set_packswap(png_structp png_ptr)
nuclear@14 57 {
nuclear@14 58 png_debug(1, "in png_set_packswap\n");
nuclear@14 59 if (png_ptr == NULL) return;
nuclear@14 60 if (png_ptr->bit_depth < 8)
nuclear@14 61 png_ptr->transformations |= PNG_PACKSWAP;
nuclear@14 62 }
nuclear@14 63 #endif
nuclear@14 64
nuclear@14 65 #if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED)
nuclear@14 66 void PNGAPI
nuclear@14 67 png_set_shift(png_structp png_ptr, png_color_8p true_bits)
nuclear@14 68 {
nuclear@14 69 png_debug(1, "in png_set_shift\n");
nuclear@14 70 if (png_ptr == NULL) return;
nuclear@14 71 png_ptr->transformations |= PNG_SHIFT;
nuclear@14 72 png_ptr->shift = *true_bits;
nuclear@14 73 }
nuclear@14 74 #endif
nuclear@14 75
nuclear@14 76 #if defined(PNG_READ_INTERLACING_SUPPORTED) || \
nuclear@14 77 defined(PNG_WRITE_INTERLACING_SUPPORTED)
nuclear@14 78 int PNGAPI
nuclear@14 79 png_set_interlace_handling(png_structp png_ptr)
nuclear@14 80 {
nuclear@14 81 png_debug(1, "in png_set_interlace handling\n");
nuclear@14 82 if (png_ptr && png_ptr->interlaced)
nuclear@14 83 {
nuclear@14 84 png_ptr->transformations |= PNG_INTERLACE;
nuclear@14 85 return (7);
nuclear@14 86 }
nuclear@14 87
nuclear@14 88 return (1);
nuclear@14 89 }
nuclear@14 90 #endif
nuclear@14 91
nuclear@14 92 #if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)
nuclear@14 93 /* Add a filler byte on read, or remove a filler or alpha byte on write.
nuclear@14 94 * The filler type has changed in v0.95 to allow future 2-byte fillers
nuclear@14 95 * for 48-bit input data, as well as to avoid problems with some compilers
nuclear@14 96 * that don't like bytes as parameters.
nuclear@14 97 */
nuclear@14 98 void PNGAPI
nuclear@14 99 png_set_filler(png_structp png_ptr, png_uint_32 filler, int filler_loc)
nuclear@14 100 {
nuclear@14 101 png_debug(1, "in png_set_filler\n");
nuclear@14 102 if (png_ptr == NULL) return;
nuclear@14 103 png_ptr->transformations |= PNG_FILLER;
nuclear@14 104 png_ptr->filler = (png_byte)filler;
nuclear@14 105 if (filler_loc == PNG_FILLER_AFTER)
nuclear@14 106 png_ptr->flags |= PNG_FLAG_FILLER_AFTER;
nuclear@14 107 else
nuclear@14 108 png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER;
nuclear@14 109
nuclear@14 110 /* This should probably go in the "do_read_filler" routine.
nuclear@14 111 * I attempted to do that in libpng-1.0.1a but that caused problems
nuclear@14 112 * so I restored it in libpng-1.0.2a
nuclear@14 113 */
nuclear@14 114
nuclear@14 115 if (png_ptr->color_type == PNG_COLOR_TYPE_RGB)
nuclear@14 116 {
nuclear@14 117 png_ptr->usr_channels = 4;
nuclear@14 118 }
nuclear@14 119
nuclear@14 120 /* Also I added this in libpng-1.0.2a (what happens when we expand
nuclear@14 121 * a less-than-8-bit grayscale to GA? */
nuclear@14 122
nuclear@14 123 if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY && png_ptr->bit_depth >= 8)
nuclear@14 124 {
nuclear@14 125 png_ptr->usr_channels = 2;
nuclear@14 126 }
nuclear@14 127 }
nuclear@14 128
nuclear@14 129 #if !defined(PNG_1_0_X)
nuclear@14 130 /* Added to libpng-1.2.7 */
nuclear@14 131 void PNGAPI
nuclear@14 132 png_set_add_alpha(png_structp png_ptr, png_uint_32 filler, int filler_loc)
nuclear@14 133 {
nuclear@14 134 png_debug(1, "in png_set_add_alpha\n");
nuclear@14 135 if (png_ptr == NULL) return;
nuclear@14 136 png_set_filler(png_ptr, filler, filler_loc);
nuclear@14 137 png_ptr->transformations |= PNG_ADD_ALPHA;
nuclear@14 138 }
nuclear@14 139 #endif
nuclear@14 140
nuclear@14 141 #endif
nuclear@14 142
nuclear@14 143 #if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \
nuclear@14 144 defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
nuclear@14 145 void PNGAPI
nuclear@14 146 png_set_swap_alpha(png_structp png_ptr)
nuclear@14 147 {
nuclear@14 148 png_debug(1, "in png_set_swap_alpha\n");
nuclear@14 149 if (png_ptr == NULL) return;
nuclear@14 150 png_ptr->transformations |= PNG_SWAP_ALPHA;
nuclear@14 151 }
nuclear@14 152 #endif
nuclear@14 153
nuclear@14 154 #if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \
nuclear@14 155 defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
nuclear@14 156 void PNGAPI
nuclear@14 157 png_set_invert_alpha(png_structp png_ptr)
nuclear@14 158 {
nuclear@14 159 png_debug(1, "in png_set_invert_alpha\n");
nuclear@14 160 if (png_ptr == NULL) return;
nuclear@14 161 png_ptr->transformations |= PNG_INVERT_ALPHA;
nuclear@14 162 }
nuclear@14 163 #endif
nuclear@14 164
nuclear@14 165 #if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED)
nuclear@14 166 void PNGAPI
nuclear@14 167 png_set_invert_mono(png_structp png_ptr)
nuclear@14 168 {
nuclear@14 169 png_debug(1, "in png_set_invert_mono\n");
nuclear@14 170 if (png_ptr == NULL) return;
nuclear@14 171 png_ptr->transformations |= PNG_INVERT_MONO;
nuclear@14 172 }
nuclear@14 173
nuclear@14 174 /* invert monochrome grayscale data */
nuclear@14 175 void /* PRIVATE */
nuclear@14 176 png_do_invert(png_row_infop row_info, png_bytep row)
nuclear@14 177 {
nuclear@14 178 png_debug(1, "in png_do_invert\n");
nuclear@14 179 /* This test removed from libpng version 1.0.13 and 1.2.0:
nuclear@14 180 * if (row_info->bit_depth == 1 &&
nuclear@14 181 */
nuclear@14 182 #if defined(PNG_USELESS_TESTS_SUPPORTED)
nuclear@14 183 if (row == NULL || row_info == NULL)
nuclear@14 184 return;
nuclear@14 185 #endif
nuclear@14 186 if (row_info->color_type == PNG_COLOR_TYPE_GRAY)
nuclear@14 187 {
nuclear@14 188 png_bytep rp = row;
nuclear@14 189 png_uint_32 i;
nuclear@14 190 png_uint_32 istop = row_info->rowbytes;
nuclear@14 191
nuclear@14 192 for (i = 0; i < istop; i++)
nuclear@14 193 {
nuclear@14 194 *rp = (png_byte)(~(*rp));
nuclear@14 195 rp++;
nuclear@14 196 }
nuclear@14 197 }
nuclear@14 198 else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
nuclear@14 199 row_info->bit_depth == 8)
nuclear@14 200 {
nuclear@14 201 png_bytep rp = row;
nuclear@14 202 png_uint_32 i;
nuclear@14 203 png_uint_32 istop = row_info->rowbytes;
nuclear@14 204
nuclear@14 205 for (i = 0; i < istop; i+=2)
nuclear@14 206 {
nuclear@14 207 *rp = (png_byte)(~(*rp));
nuclear@14 208 rp+=2;
nuclear@14 209 }
nuclear@14 210 }
nuclear@14 211 else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
nuclear@14 212 row_info->bit_depth == 16)
nuclear@14 213 {
nuclear@14 214 png_bytep rp = row;
nuclear@14 215 png_uint_32 i;
nuclear@14 216 png_uint_32 istop = row_info->rowbytes;
nuclear@14 217
nuclear@14 218 for (i = 0; i < istop; i+=4)
nuclear@14 219 {
nuclear@14 220 *rp = (png_byte)(~(*rp));
nuclear@14 221 *(rp+1) = (png_byte)(~(*(rp+1)));
nuclear@14 222 rp+=4;
nuclear@14 223 }
nuclear@14 224 }
nuclear@14 225 }
nuclear@14 226 #endif
nuclear@14 227
nuclear@14 228 #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
nuclear@14 229 /* swaps byte order on 16 bit depth images */
nuclear@14 230 void /* PRIVATE */
nuclear@14 231 png_do_swap(png_row_infop row_info, png_bytep row)
nuclear@14 232 {
nuclear@14 233 png_debug(1, "in png_do_swap\n");
nuclear@14 234 if (
nuclear@14 235 #if defined(PNG_USELESS_TESTS_SUPPORTED)
nuclear@14 236 row != NULL && row_info != NULL &&
nuclear@14 237 #endif
nuclear@14 238 row_info->bit_depth == 16)
nuclear@14 239 {
nuclear@14 240 png_bytep rp = row;
nuclear@14 241 png_uint_32 i;
nuclear@14 242 png_uint_32 istop= row_info->width * row_info->channels;
nuclear@14 243
nuclear@14 244 for (i = 0; i < istop; i++, rp += 2)
nuclear@14 245 {
nuclear@14 246 png_byte t = *rp;
nuclear@14 247 *rp = *(rp + 1);
nuclear@14 248 *(rp + 1) = t;
nuclear@14 249 }
nuclear@14 250 }
nuclear@14 251 }
nuclear@14 252 #endif
nuclear@14 253
nuclear@14 254 #if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
nuclear@14 255 static PNG_CONST png_byte onebppswaptable[256] = {
nuclear@14 256 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,
nuclear@14 257 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
nuclear@14 258 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8,
nuclear@14 259 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
nuclear@14 260 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4,
nuclear@14 261 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
nuclear@14 262 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC,
nuclear@14 263 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
nuclear@14 264 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2,
nuclear@14 265 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
nuclear@14 266 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA,
nuclear@14 267 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
nuclear@14 268 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6,
nuclear@14 269 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
nuclear@14 270 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE,
nuclear@14 271 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
nuclear@14 272 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1,
nuclear@14 273 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
nuclear@14 274 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9,
nuclear@14 275 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
nuclear@14 276 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5,
nuclear@14 277 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
nuclear@14 278 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED,
nuclear@14 279 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
nuclear@14 280 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3,
nuclear@14 281 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
nuclear@14 282 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB,
nuclear@14 283 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
nuclear@14 284 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7,
nuclear@14 285 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
nuclear@14 286 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF,
nuclear@14 287 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
nuclear@14 288 };
nuclear@14 289
nuclear@14 290 static PNG_CONST png_byte twobppswaptable[256] = {
nuclear@14 291 0x00, 0x40, 0x80, 0xC0, 0x10, 0x50, 0x90, 0xD0,
nuclear@14 292 0x20, 0x60, 0xA0, 0xE0, 0x30, 0x70, 0xB0, 0xF0,
nuclear@14 293 0x04, 0x44, 0x84, 0xC4, 0x14, 0x54, 0x94, 0xD4,
nuclear@14 294 0x24, 0x64, 0xA4, 0xE4, 0x34, 0x74, 0xB4, 0xF4,
nuclear@14 295 0x08, 0x48, 0x88, 0xC8, 0x18, 0x58, 0x98, 0xD8,
nuclear@14 296 0x28, 0x68, 0xA8, 0xE8, 0x38, 0x78, 0xB8, 0xF8,
nuclear@14 297 0x0C, 0x4C, 0x8C, 0xCC, 0x1C, 0x5C, 0x9C, 0xDC,
nuclear@14 298 0x2C, 0x6C, 0xAC, 0xEC, 0x3C, 0x7C, 0xBC, 0xFC,
nuclear@14 299 0x01, 0x41, 0x81, 0xC1, 0x11, 0x51, 0x91, 0xD1,
nuclear@14 300 0x21, 0x61, 0xA1, 0xE1, 0x31, 0x71, 0xB1, 0xF1,
nuclear@14 301 0x05, 0x45, 0x85, 0xC5, 0x15, 0x55, 0x95, 0xD5,
nuclear@14 302 0x25, 0x65, 0xA5, 0xE5, 0x35, 0x75, 0xB5, 0xF5,
nuclear@14 303 0x09, 0x49, 0x89, 0xC9, 0x19, 0x59, 0x99, 0xD9,
nuclear@14 304 0x29, 0x69, 0xA9, 0xE9, 0x39, 0x79, 0xB9, 0xF9,
nuclear@14 305 0x0D, 0x4D, 0x8D, 0xCD, 0x1D, 0x5D, 0x9D, 0xDD,
nuclear@14 306 0x2D, 0x6D, 0xAD, 0xED, 0x3D, 0x7D, 0xBD, 0xFD,
nuclear@14 307 0x02, 0x42, 0x82, 0xC2, 0x12, 0x52, 0x92, 0xD2,
nuclear@14 308 0x22, 0x62, 0xA2, 0xE2, 0x32, 0x72, 0xB2, 0xF2,
nuclear@14 309 0x06, 0x46, 0x86, 0xC6, 0x16, 0x56, 0x96, 0xD6,
nuclear@14 310 0x26, 0x66, 0xA6, 0xE6, 0x36, 0x76, 0xB6, 0xF6,
nuclear@14 311 0x0A, 0x4A, 0x8A, 0xCA, 0x1A, 0x5A, 0x9A, 0xDA,
nuclear@14 312 0x2A, 0x6A, 0xAA, 0xEA, 0x3A, 0x7A, 0xBA, 0xFA,
nuclear@14 313 0x0E, 0x4E, 0x8E, 0xCE, 0x1E, 0x5E, 0x9E, 0xDE,
nuclear@14 314 0x2E, 0x6E, 0xAE, 0xEE, 0x3E, 0x7E, 0xBE, 0xFE,
nuclear@14 315 0x03, 0x43, 0x83, 0xC3, 0x13, 0x53, 0x93, 0xD3,
nuclear@14 316 0x23, 0x63, 0xA3, 0xE3, 0x33, 0x73, 0xB3, 0xF3,
nuclear@14 317 0x07, 0x47, 0x87, 0xC7, 0x17, 0x57, 0x97, 0xD7,
nuclear@14 318 0x27, 0x67, 0xA7, 0xE7, 0x37, 0x77, 0xB7, 0xF7,
nuclear@14 319 0x0B, 0x4B, 0x8B, 0xCB, 0x1B, 0x5B, 0x9B, 0xDB,
nuclear@14 320 0x2B, 0x6B, 0xAB, 0xEB, 0x3B, 0x7B, 0xBB, 0xFB,
nuclear@14 321 0x0F, 0x4F, 0x8F, 0xCF, 0x1F, 0x5F, 0x9F, 0xDF,
nuclear@14 322 0x2F, 0x6F, 0xAF, 0xEF, 0x3F, 0x7F, 0xBF, 0xFF
nuclear@14 323 };
nuclear@14 324
nuclear@14 325 static PNG_CONST png_byte fourbppswaptable[256] = {
nuclear@14 326 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70,
nuclear@14 327 0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0,
nuclear@14 328 0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71,
nuclear@14 329 0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1,
nuclear@14 330 0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72,
nuclear@14 331 0x82, 0x92, 0xA2, 0xB2, 0xC2, 0xD2, 0xE2, 0xF2,
nuclear@14 332 0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73,
nuclear@14 333 0x83, 0x93, 0xA3, 0xB3, 0xC3, 0xD3, 0xE3, 0xF3,
nuclear@14 334 0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74,
nuclear@14 335 0x84, 0x94, 0xA4, 0xB4, 0xC4, 0xD4, 0xE4, 0xF4,
nuclear@14 336 0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75,
nuclear@14 337 0x85, 0x95, 0xA5, 0xB5, 0xC5, 0xD5, 0xE5, 0xF5,
nuclear@14 338 0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76,
nuclear@14 339 0x86, 0x96, 0xA6, 0xB6, 0xC6, 0xD6, 0xE6, 0xF6,
nuclear@14 340 0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77,
nuclear@14 341 0x87, 0x97, 0xA7, 0xB7, 0xC7, 0xD7, 0xE7, 0xF7,
nuclear@14 342 0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78,
nuclear@14 343 0x88, 0x98, 0xA8, 0xB8, 0xC8, 0xD8, 0xE8, 0xF8,
nuclear@14 344 0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79,
nuclear@14 345 0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, 0xE9, 0xF9,
nuclear@14 346 0x0A, 0x1A, 0x2A, 0x3A, 0x4A, 0x5A, 0x6A, 0x7A,
nuclear@14 347 0x8A, 0x9A, 0xAA, 0xBA, 0xCA, 0xDA, 0xEA, 0xFA,
nuclear@14 348 0x0B, 0x1B, 0x2B, 0x3B, 0x4B, 0x5B, 0x6B, 0x7B,
nuclear@14 349 0x8B, 0x9B, 0xAB, 0xBB, 0xCB, 0xDB, 0xEB, 0xFB,
nuclear@14 350 0x0C, 0x1C, 0x2C, 0x3C, 0x4C, 0x5C, 0x6C, 0x7C,
nuclear@14 351 0x8C, 0x9C, 0xAC, 0xBC, 0xCC, 0xDC, 0xEC, 0xFC,
nuclear@14 352 0x0D, 0x1D, 0x2D, 0x3D, 0x4D, 0x5D, 0x6D, 0x7D,
nuclear@14 353 0x8D, 0x9D, 0xAD, 0xBD, 0xCD, 0xDD, 0xED, 0xFD,
nuclear@14 354 0x0E, 0x1E, 0x2E, 0x3E, 0x4E, 0x5E, 0x6E, 0x7E,
nuclear@14 355 0x8E, 0x9E, 0xAE, 0xBE, 0xCE, 0xDE, 0xEE, 0xFE,
nuclear@14 356 0x0F, 0x1F, 0x2F, 0x3F, 0x4F, 0x5F, 0x6F, 0x7F,
nuclear@14 357 0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF
nuclear@14 358 };
nuclear@14 359
nuclear@14 360 /* swaps pixel packing order within bytes */
nuclear@14 361 void /* PRIVATE */
nuclear@14 362 png_do_packswap(png_row_infop row_info, png_bytep row)
nuclear@14 363 {
nuclear@14 364 png_debug(1, "in png_do_packswap\n");
nuclear@14 365 if (
nuclear@14 366 #if defined(PNG_USELESS_TESTS_SUPPORTED)
nuclear@14 367 row != NULL && row_info != NULL &&
nuclear@14 368 #endif
nuclear@14 369 row_info->bit_depth < 8)
nuclear@14 370 {
nuclear@14 371 png_bytep rp, end, table;
nuclear@14 372
nuclear@14 373 end = row + row_info->rowbytes;
nuclear@14 374
nuclear@14 375 if (row_info->bit_depth == 1)
nuclear@14 376 table = (png_bytep)onebppswaptable;
nuclear@14 377 else if (row_info->bit_depth == 2)
nuclear@14 378 table = (png_bytep)twobppswaptable;
nuclear@14 379 else if (row_info->bit_depth == 4)
nuclear@14 380 table = (png_bytep)fourbppswaptable;
nuclear@14 381 else
nuclear@14 382 return;
nuclear@14 383
nuclear@14 384 for (rp = row; rp < end; rp++)
nuclear@14 385 *rp = table[*rp];
nuclear@14 386 }
nuclear@14 387 }
nuclear@14 388 #endif /* PNG_READ_PACKSWAP_SUPPORTED or PNG_WRITE_PACKSWAP_SUPPORTED */
nuclear@14 389
nuclear@14 390 #if defined(PNG_WRITE_FILLER_SUPPORTED) || \
nuclear@14 391 defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
nuclear@14 392 /* remove filler or alpha byte(s) */
nuclear@14 393 void /* PRIVATE */
nuclear@14 394 png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags)
nuclear@14 395 {
nuclear@14 396 png_debug(1, "in png_do_strip_filler\n");
nuclear@14 397 #if defined(PNG_USELESS_TESTS_SUPPORTED)
nuclear@14 398 if (row != NULL && row_info != NULL)
nuclear@14 399 #endif
nuclear@14 400 {
nuclear@14 401 png_bytep sp=row;
nuclear@14 402 png_bytep dp=row;
nuclear@14 403 png_uint_32 row_width=row_info->width;
nuclear@14 404 png_uint_32 i;
nuclear@14 405
nuclear@14 406 if ((row_info->color_type == PNG_COLOR_TYPE_RGB ||
nuclear@14 407 (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA &&
nuclear@14 408 (flags & PNG_FLAG_STRIP_ALPHA))) &&
nuclear@14 409 row_info->channels == 4)
nuclear@14 410 {
nuclear@14 411 if (row_info->bit_depth == 8)
nuclear@14 412 {
nuclear@14 413 /* This converts from RGBX or RGBA to RGB */
nuclear@14 414 if (flags & PNG_FLAG_FILLER_AFTER)
nuclear@14 415 {
nuclear@14 416 dp+=3; sp+=4;
nuclear@14 417 for (i = 1; i < row_width; i++)
nuclear@14 418 {
nuclear@14 419 *dp++ = *sp++;
nuclear@14 420 *dp++ = *sp++;
nuclear@14 421 *dp++ = *sp++;
nuclear@14 422 sp++;
nuclear@14 423 }
nuclear@14 424 }
nuclear@14 425 /* This converts from XRGB or ARGB to RGB */
nuclear@14 426 else
nuclear@14 427 {
nuclear@14 428 for (i = 0; i < row_width; i++)
nuclear@14 429 {
nuclear@14 430 sp++;
nuclear@14 431 *dp++ = *sp++;
nuclear@14 432 *dp++ = *sp++;
nuclear@14 433 *dp++ = *sp++;
nuclear@14 434 }
nuclear@14 435 }
nuclear@14 436 row_info->pixel_depth = 24;
nuclear@14 437 row_info->rowbytes = row_width * 3;
nuclear@14 438 }
nuclear@14 439 else /* if (row_info->bit_depth == 16) */
nuclear@14 440 {
nuclear@14 441 if (flags & PNG_FLAG_FILLER_AFTER)
nuclear@14 442 {
nuclear@14 443 /* This converts from RRGGBBXX or RRGGBBAA to RRGGBB */
nuclear@14 444 sp += 8; dp += 6;
nuclear@14 445 for (i = 1; i < row_width; i++)
nuclear@14 446 {
nuclear@14 447 /* This could be (although png_memcpy is probably slower):
nuclear@14 448 png_memcpy(dp, sp, 6);
nuclear@14 449 sp += 8;
nuclear@14 450 dp += 6;
nuclear@14 451 */
nuclear@14 452
nuclear@14 453 *dp++ = *sp++;
nuclear@14 454 *dp++ = *sp++;
nuclear@14 455 *dp++ = *sp++;
nuclear@14 456 *dp++ = *sp++;
nuclear@14 457 *dp++ = *sp++;
nuclear@14 458 *dp++ = *sp++;
nuclear@14 459 sp += 2;
nuclear@14 460 }
nuclear@14 461 }
nuclear@14 462 else
nuclear@14 463 {
nuclear@14 464 /* This converts from XXRRGGBB or AARRGGBB to RRGGBB */
nuclear@14 465 for (i = 0; i < row_width; i++)
nuclear@14 466 {
nuclear@14 467 /* This could be (although png_memcpy is probably slower):
nuclear@14 468 png_memcpy(dp, sp, 6);
nuclear@14 469 sp += 8;
nuclear@14 470 dp += 6;
nuclear@14 471 */
nuclear@14 472
nuclear@14 473 sp+=2;
nuclear@14 474 *dp++ = *sp++;
nuclear@14 475 *dp++ = *sp++;
nuclear@14 476 *dp++ = *sp++;
nuclear@14 477 *dp++ = *sp++;
nuclear@14 478 *dp++ = *sp++;
nuclear@14 479 *dp++ = *sp++;
nuclear@14 480 }
nuclear@14 481 }
nuclear@14 482 row_info->pixel_depth = 48;
nuclear@14 483 row_info->rowbytes = row_width * 6;
nuclear@14 484 }
nuclear@14 485 row_info->channels = 3;
nuclear@14 486 }
nuclear@14 487 else if ((row_info->color_type == PNG_COLOR_TYPE_GRAY ||
nuclear@14 488 (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
nuclear@14 489 (flags & PNG_FLAG_STRIP_ALPHA))) &&
nuclear@14 490 row_info->channels == 2)
nuclear@14 491 {
nuclear@14 492 if (row_info->bit_depth == 8)
nuclear@14 493 {
nuclear@14 494 /* This converts from GX or GA to G */
nuclear@14 495 if (flags & PNG_FLAG_FILLER_AFTER)
nuclear@14 496 {
nuclear@14 497 for (i = 0; i < row_width; i++)
nuclear@14 498 {
nuclear@14 499 *dp++ = *sp++;
nuclear@14 500 sp++;
nuclear@14 501 }
nuclear@14 502 }
nuclear@14 503 /* This converts from XG or AG to G */
nuclear@14 504 else
nuclear@14 505 {
nuclear@14 506 for (i = 0; i < row_width; i++)
nuclear@14 507 {
nuclear@14 508 sp++;
nuclear@14 509 *dp++ = *sp++;
nuclear@14 510 }
nuclear@14 511 }
nuclear@14 512 row_info->pixel_depth = 8;
nuclear@14 513 row_info->rowbytes = row_width;
nuclear@14 514 }
nuclear@14 515 else /* if (row_info->bit_depth == 16) */
nuclear@14 516 {
nuclear@14 517 if (flags & PNG_FLAG_FILLER_AFTER)
nuclear@14 518 {
nuclear@14 519 /* This converts from GGXX or GGAA to GG */
nuclear@14 520 sp += 4; dp += 2;
nuclear@14 521 for (i = 1; i < row_width; i++)
nuclear@14 522 {
nuclear@14 523 *dp++ = *sp++;
nuclear@14 524 *dp++ = *sp++;
nuclear@14 525 sp += 2;
nuclear@14 526 }
nuclear@14 527 }
nuclear@14 528 else
nuclear@14 529 {
nuclear@14 530 /* This converts from XXGG or AAGG to GG */
nuclear@14 531 for (i = 0; i < row_width; i++)
nuclear@14 532 {
nuclear@14 533 sp += 2;
nuclear@14 534 *dp++ = *sp++;
nuclear@14 535 *dp++ = *sp++;
nuclear@14 536 }
nuclear@14 537 }
nuclear@14 538 row_info->pixel_depth = 16;
nuclear@14 539 row_info->rowbytes = row_width * 2;
nuclear@14 540 }
nuclear@14 541 row_info->channels = 1;
nuclear@14 542 }
nuclear@14 543 if (flags & PNG_FLAG_STRIP_ALPHA)
nuclear@14 544 row_info->color_type &= ~PNG_COLOR_MASK_ALPHA;
nuclear@14 545 }
nuclear@14 546 }
nuclear@14 547 #endif
nuclear@14 548
nuclear@14 549 #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
nuclear@14 550 /* swaps red and blue bytes within a pixel */
nuclear@14 551 void /* PRIVATE */
nuclear@14 552 png_do_bgr(png_row_infop row_info, png_bytep row)
nuclear@14 553 {
nuclear@14 554 png_debug(1, "in png_do_bgr\n");
nuclear@14 555 if (
nuclear@14 556 #if defined(PNG_USELESS_TESTS_SUPPORTED)
nuclear@14 557 row != NULL && row_info != NULL &&
nuclear@14 558 #endif
nuclear@14 559 (row_info->color_type & PNG_COLOR_MASK_COLOR))
nuclear@14 560 {
nuclear@14 561 png_uint_32 row_width = row_info->width;
nuclear@14 562 if (row_info->bit_depth == 8)
nuclear@14 563 {
nuclear@14 564 if (row_info->color_type == PNG_COLOR_TYPE_RGB)
nuclear@14 565 {
nuclear@14 566 png_bytep rp;
nuclear@14 567 png_uint_32 i;
nuclear@14 568
nuclear@14 569 for (i = 0, rp = row; i < row_width; i++, rp += 3)
nuclear@14 570 {
nuclear@14 571 png_byte save = *rp;
nuclear@14 572 *rp = *(rp + 2);
nuclear@14 573 *(rp + 2) = save;
nuclear@14 574 }
nuclear@14 575 }
nuclear@14 576 else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
nuclear@14 577 {
nuclear@14 578 png_bytep rp;
nuclear@14 579 png_uint_32 i;
nuclear@14 580
nuclear@14 581 for (i = 0, rp = row; i < row_width; i++, rp += 4)
nuclear@14 582 {
nuclear@14 583 png_byte save = *rp;
nuclear@14 584 *rp = *(rp + 2);
nuclear@14 585 *(rp + 2) = save;
nuclear@14 586 }
nuclear@14 587 }
nuclear@14 588 }
nuclear@14 589 else if (row_info->bit_depth == 16)
nuclear@14 590 {
nuclear@14 591 if (row_info->color_type == PNG_COLOR_TYPE_RGB)
nuclear@14 592 {
nuclear@14 593 png_bytep rp;
nuclear@14 594 png_uint_32 i;
nuclear@14 595
nuclear@14 596 for (i = 0, rp = row; i < row_width; i++, rp += 6)
nuclear@14 597 {
nuclear@14 598 png_byte save = *rp;
nuclear@14 599 *rp = *(rp + 4);
nuclear@14 600 *(rp + 4) = save;
nuclear@14 601 save = *(rp + 1);
nuclear@14 602 *(rp + 1) = *(rp + 5);
nuclear@14 603 *(rp + 5) = save;
nuclear@14 604 }
nuclear@14 605 }
nuclear@14 606 else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
nuclear@14 607 {
nuclear@14 608 png_bytep rp;
nuclear@14 609 png_uint_32 i;
nuclear@14 610
nuclear@14 611 for (i = 0, rp = row; i < row_width; i++, rp += 8)
nuclear@14 612 {
nuclear@14 613 png_byte save = *rp;
nuclear@14 614 *rp = *(rp + 4);
nuclear@14 615 *(rp + 4) = save;
nuclear@14 616 save = *(rp + 1);
nuclear@14 617 *(rp + 1) = *(rp + 5);
nuclear@14 618 *(rp + 5) = save;
nuclear@14 619 }
nuclear@14 620 }
nuclear@14 621 }
nuclear@14 622 }
nuclear@14 623 }
nuclear@14 624 #endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */
nuclear@14 625
nuclear@14 626 #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
nuclear@14 627 defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \
nuclear@14 628 defined(PNG_LEGACY_SUPPORTED)
nuclear@14 629 void PNGAPI
nuclear@14 630 png_set_user_transform_info(png_structp png_ptr, png_voidp
nuclear@14 631 user_transform_ptr, int user_transform_depth, int user_transform_channels)
nuclear@14 632 {
nuclear@14 633 png_debug(1, "in png_set_user_transform_info\n");
nuclear@14 634 if (png_ptr == NULL) return;
nuclear@14 635 #if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
nuclear@14 636 png_ptr->user_transform_ptr = user_transform_ptr;
nuclear@14 637 png_ptr->user_transform_depth = (png_byte)user_transform_depth;
nuclear@14 638 png_ptr->user_transform_channels = (png_byte)user_transform_channels;
nuclear@14 639 #else
nuclear@14 640 if (user_transform_ptr || user_transform_depth || user_transform_channels)
nuclear@14 641 png_warning(png_ptr,
nuclear@14 642 "This version of libpng does not support user transform info");
nuclear@14 643 #endif
nuclear@14 644 }
nuclear@14 645 #endif
nuclear@14 646
nuclear@14 647 /* This function returns a pointer to the user_transform_ptr associated with
nuclear@14 648 * the user transform functions. The application should free any memory
nuclear@14 649 * associated with this pointer before png_write_destroy and png_read_destroy
nuclear@14 650 * are called.
nuclear@14 651 */
nuclear@14 652 png_voidp PNGAPI
nuclear@14 653 png_get_user_transform_ptr(png_structp png_ptr)
nuclear@14 654 {
nuclear@14 655 if (png_ptr == NULL) return (NULL);
nuclear@14 656 #if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
nuclear@14 657 return ((png_voidp)png_ptr->user_transform_ptr);
nuclear@14 658 #else
nuclear@14 659 return (NULL);
nuclear@14 660 #endif
nuclear@14 661 }
nuclear@14 662 #endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */