dbf-halloween2015

annotate libs/libpng/pngtrans.c @ 1:c3f5c32cb210

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