1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* pngtrans.c - transforms the data in a row (used by both readers and writers) 2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * 3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Last changed in libpng 1.6.2 [April 25, 2013] 4e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * Copyright (c) 1998-2013 Glenn Randers-Pehrson 5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) 6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) 7e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * 8e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * This code is released under the libpng license. 9e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * For conditions of distribution and use, see the disclaimer 10e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * and license in png.h 11e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 12e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 13e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "pngpriv.h" 14e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 15e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) 16e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 17e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) 18e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* Turn on BGR-to-RGB mapping */ 19e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid PNGAPI 20e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_set_bgr(png_structrp png_ptr) 21e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 22e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_debug(1, "in png_set_bgr"); 23e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 24e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (png_ptr == NULL) 25e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 26e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 27e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_ptr->transformations |= PNG_BGR; 28e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 29e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 30e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 31e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) 32e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* Turn on 16 bit byte swapping */ 33e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid PNGAPI 34e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_set_swap(png_structrp png_ptr) 35e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 36e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_debug(1, "in png_set_swap"); 37e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 38e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (png_ptr == NULL) 39e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 40e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 41e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (png_ptr->bit_depth == 16) 42e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_ptr->transformations |= PNG_SWAP_BYTES; 43e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 44e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 45e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 46e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED) 47e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* Turn on pixel packing */ 48e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid PNGAPI 49e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_set_packing(png_structrp png_ptr) 50e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 51e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_debug(1, "in png_set_packing"); 52e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 53e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (png_ptr == NULL) 54e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 55e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 56e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (png_ptr->bit_depth < 8) 57e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 58e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_ptr->transformations |= PNG_PACK; 59e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_ptr->usr_bit_depth = 8; 60e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 61e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 62e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 63e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 64e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED) 65e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* Turn on packed pixel swapping */ 66e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid PNGAPI 67e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_set_packswap(png_structrp png_ptr) 68e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 69e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_debug(1, "in png_set_packswap"); 70e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 71e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (png_ptr == NULL) 72e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 73e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 74e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (png_ptr->bit_depth < 8) 75e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_ptr->transformations |= PNG_PACKSWAP; 76e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 77e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 78e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 79e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) 80e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid PNGAPI 81e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_set_shift(png_structrp png_ptr, png_const_color_8p true_bits) 82e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 83e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_debug(1, "in png_set_shift"); 84e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 85e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (png_ptr == NULL) 86e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 87e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 88e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_ptr->transformations |= PNG_SHIFT; 89e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_ptr->shift = *true_bits; 90e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 91e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 92e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 93e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if defined(PNG_READ_INTERLACING_SUPPORTED) || \ 94e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov defined(PNG_WRITE_INTERLACING_SUPPORTED) 95e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovint PNGAPI 96e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_set_interlace_handling(png_structrp png_ptr) 97e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 98e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_debug(1, "in png_set_interlace handling"); 99e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 100e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (png_ptr && png_ptr->interlaced) 101e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 102e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_ptr->transformations |= PNG_INTERLACE; 103e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return (7); 104e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 105e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 106e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return (1); 107e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 108e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 109e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 110e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) 111e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* Add a filler byte on read, or remove a filler or alpha byte on write. 112e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * The filler type has changed in v0.95 to allow future 2-byte fillers 113e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * for 48-bit input data, as well as to avoid problems with some compilers 114e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * that don't like bytes as parameters. 115e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 116e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid PNGAPI 117e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_set_filler(png_structrp png_ptr, png_uint_32 filler, int filler_loc) 118e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 119e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_debug(1, "in png_set_filler"); 120e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 121e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (png_ptr == NULL) 122e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 123e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 124e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* In libpng 1.6 it is possible to determine whether this is a read or write 125e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * operation and therefore to do more checking here for a valid call. 126e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 127e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (png_ptr->mode & PNG_IS_READ_STRUCT) 128e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 129e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov# ifdef PNG_READ_FILLER_SUPPORTED 130e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* On read png_set_filler is always valid, regardless of the base PNG 131e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * format, because other transformations can give a format where the 132e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * filler code can execute (basically an 8 or 16-bit component RGB or G 133e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * format.) 134e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * 135e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * NOTE: usr_channels is not used by the read code! (This has led to 136e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * confusion in the past.) The filler is only used in the read code. 137e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 138e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_ptr->filler = (png_uint_16)filler; 139e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov# else 140e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_app_error(png_ptr, "png_set_filler not supported on read"); 141e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov PNG_UNUSED(filler) /* not used in the write case */ 142e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 143e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov# endif 144e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 145e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 146e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov else /* write */ 147e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 148e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov# ifdef PNG_WRITE_FILLER_SUPPORTED 149e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* On write the usr_channels parameter must be set correctly at the 150e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * start to record the number of channels in the app-supplied data. 151e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 152e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov switch (png_ptr->color_type) 153e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 154e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case PNG_COLOR_TYPE_RGB: 155e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_ptr->usr_channels = 4; 156e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 157e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 158e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case PNG_COLOR_TYPE_GRAY: 159e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (png_ptr->bit_depth >= 8) 160e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 161e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_ptr->usr_channels = 2; 162e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 163e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 164e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 165e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov else 166e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 167e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* There simply isn't any code in libpng to strip out bits 168e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * from bytes when the components are less than a byte in 169e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * size! 170e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 171e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_app_error(png_ptr, 172e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov "png_set_filler is invalid for low bit depth gray output"); 173e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 174e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 175e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 176e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov default: 177e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_app_error(png_ptr, 178e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov "png_set_filler: inappropriate color type"); 179e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 180e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 181e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov# else 182e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_app_error(png_ptr, "png_set_filler not supported on write"); 183e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 184e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov# endif 185e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 186e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 187e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Here on success - libpng supports the operation, set the transformation 188e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * and the flag to say where the filler channel is. 189e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 190e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_ptr->transformations |= PNG_FILLER; 191e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 192e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (filler_loc == PNG_FILLER_AFTER) 193e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_ptr->flags |= PNG_FLAG_FILLER_AFTER; 194e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 195e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov else 196e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER; 197e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 198e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 199e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* Added to libpng-1.2.7 */ 200e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid PNGAPI 201e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_set_add_alpha(png_structrp png_ptr, png_uint_32 filler, int filler_loc) 202e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 203e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_debug(1, "in png_set_add_alpha"); 204e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 205e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (png_ptr == NULL) 206e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 207e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 208e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_set_filler(png_ptr, filler, filler_loc); 209e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* The above may fail to do anything. */ 210e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (png_ptr->transformations & PNG_FILLER) 211e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_ptr->transformations |= PNG_ADD_ALPHA; 212e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 213e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 214e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 215e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 216e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \ 217e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) 218e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid PNGAPI 219e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_set_swap_alpha(png_structrp png_ptr) 220e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 221e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_debug(1, "in png_set_swap_alpha"); 222e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 223e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (png_ptr == NULL) 224e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 225e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 226e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_ptr->transformations |= PNG_SWAP_ALPHA; 227e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 228e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 229e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 230e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \ 231e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) 232e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid PNGAPI 233e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_set_invert_alpha(png_structrp png_ptr) 234e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 235e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_debug(1, "in png_set_invert_alpha"); 236e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 237e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (png_ptr == NULL) 238e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 239e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 240e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_ptr->transformations |= PNG_INVERT_ALPHA; 241e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 242e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 243e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 244e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) 245e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid PNGAPI 246e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_set_invert_mono(png_structrp png_ptr) 247e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 248e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_debug(1, "in png_set_invert_mono"); 249e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 250e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (png_ptr == NULL) 251e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 252e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 253e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_ptr->transformations |= PNG_INVERT_MONO; 254e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 255e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 256e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* Invert monochrome grayscale data */ 257e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid /* PRIVATE */ 258e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_do_invert(png_row_infop row_info, png_bytep row) 259e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 260e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_debug(1, "in png_do_invert"); 261e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 262e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* This test removed from libpng version 1.0.13 and 1.2.0: 263e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * if (row_info->bit_depth == 1 && 264e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 265e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (row_info->color_type == PNG_COLOR_TYPE_GRAY) 266e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 267e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_bytep rp = row; 268e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_size_t i; 269e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_size_t istop = row_info->rowbytes; 270e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 271e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (i = 0; i < istop; i++) 272e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 273e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *rp = (png_byte)(~(*rp)); 274e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov rp++; 275e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 276e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 277e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 278e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && 279e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov row_info->bit_depth == 8) 280e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 281e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_bytep rp = row; 282e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_size_t i; 283e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_size_t istop = row_info->rowbytes; 284e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 285e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (i = 0; i < istop; i += 2) 286e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 287e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *rp = (png_byte)(~(*rp)); 288e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov rp += 2; 289e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 290e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 291e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 292e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef PNG_16BIT_SUPPORTED 293e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && 294e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov row_info->bit_depth == 16) 295e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 296e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_bytep rp = row; 297e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_size_t i; 298e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_size_t istop = row_info->rowbytes; 299e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 300e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (i = 0; i < istop; i += 4) 301e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 302e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *rp = (png_byte)(~(*rp)); 303e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *(rp + 1) = (png_byte)(~(*(rp + 1))); 304e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov rp += 4; 305e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 306e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 307e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 308e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 309e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 310e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 311e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef PNG_16BIT_SUPPORTED 312e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) 313e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* Swaps byte order on 16 bit depth images */ 314e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid /* PRIVATE */ 315e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_do_swap(png_row_infop row_info, png_bytep row) 316e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 317e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_debug(1, "in png_do_swap"); 318e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 319e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (row_info->bit_depth == 16) 320e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 321e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_bytep rp = row; 322e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_uint_32 i; 323e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_uint_32 istop= row_info->width * row_info->channels; 324e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 325e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (i = 0; i < istop; i++, rp += 2) 326e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 327e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_byte t = *rp; 328e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *rp = *(rp + 1); 329e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *(rp + 1) = t; 330e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 331e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 332e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 333e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 334e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 335e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 336e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED) 337e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic PNG_CONST png_byte onebppswaptable[256] = { 338e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 339e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0, 340e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, 341e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8, 342e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, 343e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4, 344e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, 345e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC, 346e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, 347e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2, 348e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, 349e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA, 350e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, 351e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6, 352e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, 353e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE, 354e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, 355e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1, 356e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, 357e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9, 358e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, 359e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5, 360e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, 361e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD, 362e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, 363e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3, 364e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, 365e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB, 366e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, 367e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7, 368e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 369e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF 370e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}; 371e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 372e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic PNG_CONST png_byte twobppswaptable[256] = { 373e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x00, 0x40, 0x80, 0xC0, 0x10, 0x50, 0x90, 0xD0, 374e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x20, 0x60, 0xA0, 0xE0, 0x30, 0x70, 0xB0, 0xF0, 375e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x04, 0x44, 0x84, 0xC4, 0x14, 0x54, 0x94, 0xD4, 376e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x24, 0x64, 0xA4, 0xE4, 0x34, 0x74, 0xB4, 0xF4, 377e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x08, 0x48, 0x88, 0xC8, 0x18, 0x58, 0x98, 0xD8, 378e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x28, 0x68, 0xA8, 0xE8, 0x38, 0x78, 0xB8, 0xF8, 379e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x0C, 0x4C, 0x8C, 0xCC, 0x1C, 0x5C, 0x9C, 0xDC, 380e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x2C, 0x6C, 0xAC, 0xEC, 0x3C, 0x7C, 0xBC, 0xFC, 381e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x01, 0x41, 0x81, 0xC1, 0x11, 0x51, 0x91, 0xD1, 382e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x21, 0x61, 0xA1, 0xE1, 0x31, 0x71, 0xB1, 0xF1, 383e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x05, 0x45, 0x85, 0xC5, 0x15, 0x55, 0x95, 0xD5, 384e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x25, 0x65, 0xA5, 0xE5, 0x35, 0x75, 0xB5, 0xF5, 385e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x09, 0x49, 0x89, 0xC9, 0x19, 0x59, 0x99, 0xD9, 386e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x29, 0x69, 0xA9, 0xE9, 0x39, 0x79, 0xB9, 0xF9, 387e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x0D, 0x4D, 0x8D, 0xCD, 0x1D, 0x5D, 0x9D, 0xDD, 388e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x2D, 0x6D, 0xAD, 0xED, 0x3D, 0x7D, 0xBD, 0xFD, 389e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x02, 0x42, 0x82, 0xC2, 0x12, 0x52, 0x92, 0xD2, 390e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x22, 0x62, 0xA2, 0xE2, 0x32, 0x72, 0xB2, 0xF2, 391e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x06, 0x46, 0x86, 0xC6, 0x16, 0x56, 0x96, 0xD6, 392e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x26, 0x66, 0xA6, 0xE6, 0x36, 0x76, 0xB6, 0xF6, 393e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x0A, 0x4A, 0x8A, 0xCA, 0x1A, 0x5A, 0x9A, 0xDA, 394e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x2A, 0x6A, 0xAA, 0xEA, 0x3A, 0x7A, 0xBA, 0xFA, 395e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x0E, 0x4E, 0x8E, 0xCE, 0x1E, 0x5E, 0x9E, 0xDE, 396e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x2E, 0x6E, 0xAE, 0xEE, 0x3E, 0x7E, 0xBE, 0xFE, 397e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x03, 0x43, 0x83, 0xC3, 0x13, 0x53, 0x93, 0xD3, 398e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x23, 0x63, 0xA3, 0xE3, 0x33, 0x73, 0xB3, 0xF3, 399e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x07, 0x47, 0x87, 0xC7, 0x17, 0x57, 0x97, 0xD7, 400e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x27, 0x67, 0xA7, 0xE7, 0x37, 0x77, 0xB7, 0xF7, 401e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x0B, 0x4B, 0x8B, 0xCB, 0x1B, 0x5B, 0x9B, 0xDB, 402e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x2B, 0x6B, 0xAB, 0xEB, 0x3B, 0x7B, 0xBB, 0xFB, 403e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x0F, 0x4F, 0x8F, 0xCF, 0x1F, 0x5F, 0x9F, 0xDF, 404e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x2F, 0x6F, 0xAF, 0xEF, 0x3F, 0x7F, 0xBF, 0xFF 405e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}; 406e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 407e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstatic PNG_CONST png_byte fourbppswaptable[256] = { 408e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 409e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0, 410e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71, 411e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1, 412e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72, 413e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x82, 0x92, 0xA2, 0xB2, 0xC2, 0xD2, 0xE2, 0xF2, 414e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73, 415e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x83, 0x93, 0xA3, 0xB3, 0xC3, 0xD3, 0xE3, 0xF3, 416e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74, 417e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x84, 0x94, 0xA4, 0xB4, 0xC4, 0xD4, 0xE4, 0xF4, 418e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75, 419e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x85, 0x95, 0xA5, 0xB5, 0xC5, 0xD5, 0xE5, 0xF5, 420e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76, 421e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x86, 0x96, 0xA6, 0xB6, 0xC6, 0xD6, 0xE6, 0xF6, 422e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77, 423e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x87, 0x97, 0xA7, 0xB7, 0xC7, 0xD7, 0xE7, 0xF7, 424e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78, 425e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x88, 0x98, 0xA8, 0xB8, 0xC8, 0xD8, 0xE8, 0xF8, 426e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79, 427e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, 0xE9, 0xF9, 428e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x0A, 0x1A, 0x2A, 0x3A, 0x4A, 0x5A, 0x6A, 0x7A, 429e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x8A, 0x9A, 0xAA, 0xBA, 0xCA, 0xDA, 0xEA, 0xFA, 430e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x0B, 0x1B, 0x2B, 0x3B, 0x4B, 0x5B, 0x6B, 0x7B, 431e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x8B, 0x9B, 0xAB, 0xBB, 0xCB, 0xDB, 0xEB, 0xFB, 432e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x0C, 0x1C, 0x2C, 0x3C, 0x4C, 0x5C, 0x6C, 0x7C, 433e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x8C, 0x9C, 0xAC, 0xBC, 0xCC, 0xDC, 0xEC, 0xFC, 434e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x0D, 0x1D, 0x2D, 0x3D, 0x4D, 0x5D, 0x6D, 0x7D, 435e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x8D, 0x9D, 0xAD, 0xBD, 0xCD, 0xDD, 0xED, 0xFD, 436e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x0E, 0x1E, 0x2E, 0x3E, 0x4E, 0x5E, 0x6E, 0x7E, 437e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x8E, 0x9E, 0xAE, 0xBE, 0xCE, 0xDE, 0xEE, 0xFE, 438e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x0F, 0x1F, 0x2F, 0x3F, 0x4F, 0x5F, 0x6F, 0x7F, 439e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF 440e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}; 441e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 442e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* Swaps pixel packing order within bytes */ 443e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid /* PRIVATE */ 444e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_do_packswap(png_row_infop row_info, png_bytep row) 445e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 446e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_debug(1, "in png_do_packswap"); 447e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 448e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (row_info->bit_depth < 8) 449e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 450e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_bytep rp; 451e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_const_bytep end, table; 452e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 453e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov end = row + row_info->rowbytes; 454e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 455e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (row_info->bit_depth == 1) 456e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov table = onebppswaptable; 457e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 458e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov else if (row_info->bit_depth == 2) 459e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov table = twobppswaptable; 460e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 461e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov else if (row_info->bit_depth == 4) 462e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov table = fourbppswaptable; 463e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 464e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov else 465e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 466e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 467e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (rp = row; rp < end; rp++) 468e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *rp = table[*rp]; 469e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 470e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 471e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif /* PNG_READ_PACKSWAP_SUPPORTED or PNG_WRITE_PACKSWAP_SUPPORTED */ 472e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 473e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if defined(PNG_WRITE_FILLER_SUPPORTED) || \ 474e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov defined(PNG_READ_STRIP_ALPHA_SUPPORTED) 475e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* Remove a channel - this used to be 'png_do_strip_filler' but it used a 476e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * somewhat weird combination of flags to determine what to do. All the calls 477e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * to png_do_strip_filler are changed in 1.5.2 to call this instead with the 478e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * correct arguments. 479e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * 480e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * The routine isn't general - the channel must be the channel at the start or 481e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * end (not in the middle) of each pixel. 482e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 483e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid /* PRIVATE */ 484e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_do_strip_channel(png_row_infop row_info, png_bytep row, int at_start) 485e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 486e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_bytep sp = row; /* source pointer */ 487e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_bytep dp = row; /* destination pointer */ 488e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_bytep ep = row + row_info->rowbytes; /* One beyond end of row */ 489e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 490e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* At the start sp will point to the first byte to copy and dp to where 491e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * it is copied to. ep always points just beyond the end of the row, so 492e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * the loop simply copies (channels-1) channels until sp reaches ep. 493e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * 494e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * at_start: 0 -- convert AG, XG, ARGB, XRGB, AAGG, XXGG, etc. 495e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * nonzero -- convert GA, GX, RGBA, RGBX, GGAA, RRGGBBXX, etc. 496e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 497e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 498e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* GA, GX, XG cases */ 499e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (row_info->channels == 2) 500e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 501e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (row_info->bit_depth == 8) 502e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 503e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (at_start) /* Skip initial filler */ 504e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ++sp; 505e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov else /* Skip initial channel and, for sp, the filler */ 506e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov sp += 2, ++dp; 507e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 508e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* For a 1 pixel wide image there is nothing to do */ 509e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov while (sp < ep) 510e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *dp++ = *sp, sp += 2; 511e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 512e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov row_info->pixel_depth = 8; 513e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 514e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 515e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov else if (row_info->bit_depth == 16) 516e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 517e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (at_start) /* Skip initial filler */ 518e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov sp += 2; 519e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov else /* Skip initial channel and, for sp, the filler */ 520e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov sp += 4, dp += 2; 521e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 522e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov while (sp < ep) 523e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *dp++ = *sp++, *dp++ = *sp, sp += 3; 524e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 525e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov row_info->pixel_depth = 16; 526e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 527e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 528e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov else 529e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; /* bad bit depth */ 530e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 531e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov row_info->channels = 1; 532e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 533e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Finally fix the color type if it records an alpha channel */ 534e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) 535e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov row_info->color_type = PNG_COLOR_TYPE_GRAY; 536e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 537e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 538e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* RGBA, RGBX, XRGB cases */ 539e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov else if (row_info->channels == 4) 540e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 541e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (row_info->bit_depth == 8) 542e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 543e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (at_start) /* Skip initial filler */ 544e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ++sp; 545e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov else /* Skip initial channels and, for sp, the filler */ 546e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov sp += 4, dp += 3; 547e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 548e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Note that the loop adds 3 to dp and 4 to sp each time. */ 549e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov while (sp < ep) 550e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *dp++ = *sp++, *dp++ = *sp++, *dp++ = *sp, sp += 2; 551e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 552e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov row_info->pixel_depth = 24; 553e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 554e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 555e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov else if (row_info->bit_depth == 16) 556e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 557e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (at_start) /* Skip initial filler */ 558e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov sp += 2; 559e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov else /* Skip initial channels and, for sp, the filler */ 560e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov sp += 8, dp += 6; 561e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 562e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov while (sp < ep) 563e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 564e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Copy 6 bytes, skip 2 */ 565e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *dp++ = *sp++, *dp++ = *sp++; 566e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *dp++ = *sp++, *dp++ = *sp++; 567e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *dp++ = *sp++, *dp++ = *sp, sp += 3; 568e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 569e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 570e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov row_info->pixel_depth = 48; 571e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 572e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 573e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov else 574e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; /* bad bit depth */ 575e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 576e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov row_info->channels = 3; 577e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 578e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Finally fix the color type if it records an alpha channel */ 579e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) 580e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov row_info->color_type = PNG_COLOR_TYPE_RGB; 581e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 582e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 583e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov else 584e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; /* The filler channel has gone already */ 585e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 586e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Fix the rowbytes value. */ 587e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov row_info->rowbytes = dp-row; 588e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 589e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 590e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 591e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) 592e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* Swaps red and blue bytes within a pixel */ 593e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid /* PRIVATE */ 594e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_do_bgr(png_row_infop row_info, png_bytep row) 595e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 596e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_debug(1, "in png_do_bgr"); 597e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 598e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ((row_info->color_type & PNG_COLOR_MASK_COLOR)) 599e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 600e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_uint_32 row_width = row_info->width; 601e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (row_info->bit_depth == 8) 602e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 603e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (row_info->color_type == PNG_COLOR_TYPE_RGB) 604e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 605e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_bytep rp; 606e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_uint_32 i; 607e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 608e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (i = 0, rp = row; i < row_width; i++, rp += 3) 609e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 610e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_byte save = *rp; 611e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *rp = *(rp + 2); 612e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *(rp + 2) = save; 613e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 614e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 615e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 616e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) 617e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 618e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_bytep rp; 619e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_uint_32 i; 620e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 621e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (i = 0, rp = row; i < row_width; i++, rp += 4) 622e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 623e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_byte save = *rp; 624e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *rp = *(rp + 2); 625e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *(rp + 2) = save; 626e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 627e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 628e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 629e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 630e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef PNG_16BIT_SUPPORTED 631e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov else if (row_info->bit_depth == 16) 632e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 633e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (row_info->color_type == PNG_COLOR_TYPE_RGB) 634e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 635e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_bytep rp; 636e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_uint_32 i; 637e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 638e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (i = 0, rp = row; i < row_width; i++, rp += 6) 639e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 640e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_byte save = *rp; 641e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *rp = *(rp + 4); 642e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *(rp + 4) = save; 643e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov save = *(rp + 1); 644e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *(rp + 1) = *(rp + 5); 645e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *(rp + 5) = save; 646e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 647e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 648e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 649e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) 650e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 651e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_bytep rp; 652e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_uint_32 i; 653e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 654e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (i = 0, rp = row; i < row_width; i++, rp += 8) 655e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 656e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_byte save = *rp; 657e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *rp = *(rp + 4); 658e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *(rp + 4) = save; 659e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov save = *(rp + 1); 660e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *(rp + 1) = *(rp + 5); 661e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov *(rp + 5) = save; 662e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 663e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 664e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 665e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 666e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 667e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 668e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */ 669e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 670e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if defined(PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED) || \ 671e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov defined(PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED) 672e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* Added at libpng-1.5.10 */ 673e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid /* PRIVATE */ 674e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_do_check_palette_indexes(png_structrp png_ptr, png_row_infop row_info) 675e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 676e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (png_ptr->num_palette < (1 << row_info->bit_depth) && 677e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_ptr->num_palette > 0) /* num_palette can be 0 in MNG files */ 678e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 679e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* Calculations moved outside switch in an attempt to stop different 680e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * compiler warnings. 'padding' is in *bits* within the last byte, it is 681e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * an 'int' because pixel_depth becomes an 'int' in the expression below, 682e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * and this calculation is used because it avoids warnings that other 683e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * forms produced on either GCC or MSVC. 684e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 685e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int padding = (-row_info->pixel_depth * row_info->width) & 7; 686e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_bytep rp = png_ptr->row_buf + row_info->rowbytes; 687e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 688e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov switch (row_info->bit_depth) 689e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 690e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case 1: 691e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 692e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* in this case, all bytes must be 0 so we don't need 693e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * to unpack the pixels except for the rightmost one. 694e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 695e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (; rp > png_ptr->row_buf; rp--) 696e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 697e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (*rp >> padding != 0) 698e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_ptr->num_palette_max = 1; 699e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov padding = 0; 700e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 701e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 702e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 703e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 704e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 705e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case 2: 706e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 707e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (; rp > png_ptr->row_buf; rp--) 708e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 709e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int i = ((*rp >> padding) & 0x03); 710e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 711e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (i > png_ptr->num_palette_max) 712e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_ptr->num_palette_max = i; 713e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 714e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov i = (((*rp >> padding) >> 2) & 0x03); 715e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 716e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (i > png_ptr->num_palette_max) 717e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_ptr->num_palette_max = i; 718e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 719e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov i = (((*rp >> padding) >> 4) & 0x03); 720e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 721e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (i > png_ptr->num_palette_max) 722e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_ptr->num_palette_max = i; 723e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 724e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov i = (((*rp >> padding) >> 6) & 0x03); 725e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 726e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (i > png_ptr->num_palette_max) 727e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_ptr->num_palette_max = i; 728e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 729e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov padding = 0; 730e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 731e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 732e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 733e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 734e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 735e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case 4: 736e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 737e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (; rp > png_ptr->row_buf; rp--) 738e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 739e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int i = ((*rp >> padding) & 0x0f); 740e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 741e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (i > png_ptr->num_palette_max) 742e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_ptr->num_palette_max = i; 743e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 744e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov i = (((*rp >> padding) >> 4) & 0x0f); 745e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 746e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (i > png_ptr->num_palette_max) 747e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_ptr->num_palette_max = i; 748e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 749e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov padding = 0; 750e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 751e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 752e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 753e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 754e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 755e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case 8: 756e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 757e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (; rp > png_ptr->row_buf; rp--) 758e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 759e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (*rp > png_ptr->num_palette_max) 760e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_ptr->num_palette_max = (int) *rp; 761e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 762e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 763e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 764e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 765e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 766e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov default: 767e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 768e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 769e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 770e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 771e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif /* PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED */ 772e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 773e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ 774e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) 775e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED 776e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid PNGAPI 777e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_set_user_transform_info(png_structrp png_ptr, png_voidp 778e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov user_transform_ptr, int user_transform_depth, int user_transform_channels) 779e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 780e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_debug(1, "in png_set_user_transform_info"); 781e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 782e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (png_ptr == NULL) 783e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 784e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 785e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED 786e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0 && 787e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (png_ptr->flags & PNG_FLAG_ROW_INIT) != 0) 788e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 789e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_app_error(png_ptr, 790e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov "info change after png_start_read_image or png_read_update_info"); 791e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return; 792e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 793e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 794e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 795e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_ptr->user_transform_ptr = user_transform_ptr; 796e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_ptr->user_transform_depth = (png_byte)user_transform_depth; 797e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov png_ptr->user_transform_channels = (png_byte)user_transform_channels; 798e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 799e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 800e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 801e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* This function returns a pointer to the user_transform_ptr associated with 802e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * the user transform functions. The application should free any memory 803e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * associated with this pointer before png_write_destroy and png_read_destroy 804e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * are called. 805e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 806e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED 807e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_voidp PNGAPI 808e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_get_user_transform_ptr(png_const_structrp png_ptr) 809e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 810e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (png_ptr == NULL) 811e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return (NULL); 812e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 813e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return png_ptr->user_transform_ptr; 814e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 815e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 816e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 817e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef PNG_USER_TRANSFORM_INFO_SUPPORTED 818e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_uint_32 PNGAPI 819e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_get_current_row_number(png_const_structrp png_ptr) 820e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 821e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* See the comments in png.h - this is the sub-image row when reading and 822e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov * interlaced image. 823e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov */ 824e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (png_ptr != NULL) 825e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return png_ptr->row_number; 826e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 827e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return PNG_UINT_32_MAX; /* help the app not to fail silently */ 828e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 829e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 830e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_byte PNGAPI 831e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpng_get_current_pass_number(png_const_structrp png_ptr) 832e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 833e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (png_ptr != NULL) 834e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return png_ptr->pass; 835e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return 8; /* invalid */ 836e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 837e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif /* PNG_USER_TRANSFORM_INFO_SUPPORTED */ 838e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif /* PNG_READ_USER_TRANSFORM_SUPPORTED || 839e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov PNG_WRITE_USER_TRANSFORM_SUPPORTED */ 840e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ 841