istereo2

annotate libs/libpng/pngtrans.c @ 35:643f4ab609a4

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