istereo

annotate libs/libpng/pngtrans.c @ 33:33e9eedad390

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