176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* pngtrans.c - transforms the data in a row (used by both readers and writers) 376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Last changed in libpng 1.2.41 [December 3, 2009] 576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Copyright (c) 1998-2009 Glenn Randers-Pehrson 676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) 776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) 876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This code is released under the libpng license. 1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * For conditions of distribution and use, see the disclaimer 1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * and license in png.h 1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PNG_INTERNAL 1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define PNG_NO_PEDANTIC_WARNINGS 1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "png.h" 1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) 1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) 2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Turn on BGR-to-RGB mapping */ 2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid PNGAPI 2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_set_bgr(png_structp png_ptr) 2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_debug(1, "in png_set_bgr"); 2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (png_ptr == NULL) 2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return; 2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_ptr->transformations |= PNG_BGR; 2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) 3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Turn on 16 bit byte swapping */ 3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid PNGAPI 3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_set_swap(png_structp png_ptr) 3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_debug(1, "in png_set_swap"); 3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (png_ptr == NULL) 4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return; 4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (png_ptr->bit_depth == 16) 4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_ptr->transformations |= PNG_SWAP_BYTES; 4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED) 4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Turn on pixel packing */ 4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid PNGAPI 4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_set_packing(png_structp png_ptr) 5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_debug(1, "in png_set_packing"); 5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (png_ptr == NULL) 5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return; 5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (png_ptr->bit_depth < 8) 5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_ptr->transformations |= PNG_PACK; 5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_ptr->usr_bit_depth = 8; 5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED) 6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Turn on packed pixel swapping */ 6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid PNGAPI 6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_set_packswap(png_structp png_ptr) 6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_debug(1, "in png_set_packswap"); 6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (png_ptr == NULL) 7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return; 7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (png_ptr->bit_depth < 8) 7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_ptr->transformations |= PNG_PACKSWAP; 7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) 7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid PNGAPI 7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_set_shift(png_structp png_ptr, png_color_8p true_bits) 8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_debug(1, "in png_set_shift"); 8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (png_ptr == NULL) 8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return; 8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_ptr->transformations |= PNG_SHIFT; 8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_ptr->shift = *true_bits; 8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if defined(PNG_READ_INTERLACING_SUPPORTED) || \ 9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman defined(PNG_WRITE_INTERLACING_SUPPORTED) 9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint PNGAPI 9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_set_interlace_handling(png_structp png_ptr) 9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_debug(1, "in png_set_interlace handling"); 9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (png_ptr && png_ptr->interlaced) 9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_ptr->transformations |= PNG_INTERLACE; 10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return (7); 10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return (1); 10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) 10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Add a filler byte on read, or remove a filler or alpha byte on write. 10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * The filler type has changed in v0.95 to allow future 2-byte fillers 11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * for 48-bit input data, as well as to avoid problems with some compilers 11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * that don't like bytes as parameters. 11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid PNGAPI 11476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_set_filler(png_structp png_ptr, png_uint_32 filler, int filler_loc) 11576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_debug(1, "in png_set_filler"); 11776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (png_ptr == NULL) 11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return; 12076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_ptr->transformations |= PNG_FILLER; 12176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifdef PNG_LEGACY_SUPPORTED 12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_ptr->filler = (png_byte)filler; 12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#else 12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_ptr->filler = (png_uint_16)filler; 12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 12676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (filler_loc == PNG_FILLER_AFTER) 12776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_ptr->flags |= PNG_FLAG_FILLER_AFTER; 12876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else 12976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER; 13076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* This should probably go in the "do_read_filler" routine. 13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * I attempted to do that in libpng-1.0.1a but that caused problems 13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * so I restored it in libpng-1.0.2a 13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (png_ptr->color_type == PNG_COLOR_TYPE_RGB) 13776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_ptr->usr_channels = 4; 13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 14076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 14176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Also I added this in libpng-1.0.2a (what happens when we expand 14276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * a less-than-8-bit grayscale to GA? */ 14376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 14476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY && png_ptr->bit_depth >= 8) 14576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 14676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_ptr->usr_channels = 2; 14776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 14876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 14976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 15076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef PNG_1_0_X 15176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Added to libpng-1.2.7 */ 15276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid PNGAPI 15376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_set_add_alpha(png_structp png_ptr, png_uint_32 filler, int filler_loc) 15476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 15576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_debug(1, "in png_set_add_alpha"); 15676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 15776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (png_ptr == NULL) 15876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return; 15976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_set_filler(png_ptr, filler, filler_loc); 16076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_ptr->transformations |= PNG_ADD_ALPHA; 16176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 16276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 16376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 16476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 16576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 16676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \ 16776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) 16876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid PNGAPI 16976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_set_swap_alpha(png_structp png_ptr) 17076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 17176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_debug(1, "in png_set_swap_alpha"); 17276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 17376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (png_ptr == NULL) 17476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return; 17576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_ptr->transformations |= PNG_SWAP_ALPHA; 17676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 17776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 17876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 17976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \ 18076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) 18176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid PNGAPI 18276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_set_invert_alpha(png_structp png_ptr) 18376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 18476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_debug(1, "in png_set_invert_alpha"); 18576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 18676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (png_ptr == NULL) 18776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return; 18876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_ptr->transformations |= PNG_INVERT_ALPHA; 18976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 19076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 19176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 19276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) 19376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid PNGAPI 19476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_set_invert_mono(png_structp png_ptr) 19576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 19676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_debug(1, "in png_set_invert_mono"); 19776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 19876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (png_ptr == NULL) 19976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return; 20076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_ptr->transformations |= PNG_INVERT_MONO; 20176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 20276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 20376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Invert monochrome grayscale data */ 20476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid /* PRIVATE */ 20576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_do_invert(png_row_infop row_info, png_bytep row) 20676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 20776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_debug(1, "in png_do_invert"); 20876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 20976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* This test removed from libpng version 1.0.13 and 1.2.0: 21076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * if (row_info->bit_depth == 1 && 21176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 21276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifdef PNG_USELESS_TESTS_SUPPORTED 21376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (row == NULL || row_info == NULL) 21476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return; 21576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 21676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (row_info->color_type == PNG_COLOR_TYPE_GRAY) 21776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 21876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_bytep rp = row; 21976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_uint_32 i; 22076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_uint_32 istop = row_info->rowbytes; 22176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 22276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (i = 0; i < istop; i++) 22376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 22476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *rp = (png_byte)(~(*rp)); 22576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman rp++; 22676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 22776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 22876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && 22976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman row_info->bit_depth == 8) 23076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 23176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_bytep rp = row; 23276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_uint_32 i; 23376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_uint_32 istop = row_info->rowbytes; 23476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 23576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (i = 0; i < istop; i+=2) 23676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 23776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *rp = (png_byte)(~(*rp)); 23876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman rp+=2; 23976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 24076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 24176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && 24276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman row_info->bit_depth == 16) 24376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 24476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_bytep rp = row; 24576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_uint_32 i; 24676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_uint_32 istop = row_info->rowbytes; 24776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 24876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (i = 0; i < istop; i+=4) 24976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 25076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *rp = (png_byte)(~(*rp)); 25176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *(rp+1) = (png_byte)(~(*(rp+1))); 25276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman rp+=4; 25376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 25476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 25576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 25676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 25776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 25876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) 25976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Swaps byte order on 16 bit depth images */ 26076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid /* PRIVATE */ 26176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_do_swap(png_row_infop row_info, png_bytep row) 26276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 26376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_debug(1, "in png_do_swap"); 26476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 26576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ( 26676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifdef PNG_USELESS_TESTS_SUPPORTED 26776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman row != NULL && row_info != NULL && 26876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 26976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman row_info->bit_depth == 16) 27076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 27176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_bytep rp = row; 27276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_uint_32 i; 27376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_uint_32 istop= row_info->width * row_info->channels; 27476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 27576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (i = 0; i < istop; i++, rp += 2) 27676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 27776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_byte t = *rp; 27876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *rp = *(rp + 1); 27976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *(rp + 1) = t; 28076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 28176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 28276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 28376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 28476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 28576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED) 28676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic PNG_CONST png_byte onebppswaptable[256] = { 28776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 28876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0, 28976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, 29076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8, 29176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, 29276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4, 29376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, 29476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC, 29576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, 29676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2, 29776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, 29876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA, 29976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, 30076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6, 30176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, 30276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE, 30376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, 30476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1, 30576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, 30676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9, 30776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, 30876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5, 30976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, 31076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD, 31176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, 31276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3, 31376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, 31476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB, 31576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, 31676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7, 31776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 31876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF 31976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}; 32076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 32176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic PNG_CONST png_byte twobppswaptable[256] = { 32276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x00, 0x40, 0x80, 0xC0, 0x10, 0x50, 0x90, 0xD0, 32376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x20, 0x60, 0xA0, 0xE0, 0x30, 0x70, 0xB0, 0xF0, 32476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x04, 0x44, 0x84, 0xC4, 0x14, 0x54, 0x94, 0xD4, 32576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x24, 0x64, 0xA4, 0xE4, 0x34, 0x74, 0xB4, 0xF4, 32676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x08, 0x48, 0x88, 0xC8, 0x18, 0x58, 0x98, 0xD8, 32776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x28, 0x68, 0xA8, 0xE8, 0x38, 0x78, 0xB8, 0xF8, 32876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x0C, 0x4C, 0x8C, 0xCC, 0x1C, 0x5C, 0x9C, 0xDC, 32976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x2C, 0x6C, 0xAC, 0xEC, 0x3C, 0x7C, 0xBC, 0xFC, 33076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x01, 0x41, 0x81, 0xC1, 0x11, 0x51, 0x91, 0xD1, 33176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x21, 0x61, 0xA1, 0xE1, 0x31, 0x71, 0xB1, 0xF1, 33276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x05, 0x45, 0x85, 0xC5, 0x15, 0x55, 0x95, 0xD5, 33376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x25, 0x65, 0xA5, 0xE5, 0x35, 0x75, 0xB5, 0xF5, 33476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x09, 0x49, 0x89, 0xC9, 0x19, 0x59, 0x99, 0xD9, 33576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x29, 0x69, 0xA9, 0xE9, 0x39, 0x79, 0xB9, 0xF9, 33676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x0D, 0x4D, 0x8D, 0xCD, 0x1D, 0x5D, 0x9D, 0xDD, 33776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x2D, 0x6D, 0xAD, 0xED, 0x3D, 0x7D, 0xBD, 0xFD, 33876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x02, 0x42, 0x82, 0xC2, 0x12, 0x52, 0x92, 0xD2, 33976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x22, 0x62, 0xA2, 0xE2, 0x32, 0x72, 0xB2, 0xF2, 34076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x06, 0x46, 0x86, 0xC6, 0x16, 0x56, 0x96, 0xD6, 34176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x26, 0x66, 0xA6, 0xE6, 0x36, 0x76, 0xB6, 0xF6, 34276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x0A, 0x4A, 0x8A, 0xCA, 0x1A, 0x5A, 0x9A, 0xDA, 34376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x2A, 0x6A, 0xAA, 0xEA, 0x3A, 0x7A, 0xBA, 0xFA, 34476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x0E, 0x4E, 0x8E, 0xCE, 0x1E, 0x5E, 0x9E, 0xDE, 34576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x2E, 0x6E, 0xAE, 0xEE, 0x3E, 0x7E, 0xBE, 0xFE, 34676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x03, 0x43, 0x83, 0xC3, 0x13, 0x53, 0x93, 0xD3, 34776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x23, 0x63, 0xA3, 0xE3, 0x33, 0x73, 0xB3, 0xF3, 34876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x07, 0x47, 0x87, 0xC7, 0x17, 0x57, 0x97, 0xD7, 34976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x27, 0x67, 0xA7, 0xE7, 0x37, 0x77, 0xB7, 0xF7, 35076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x0B, 0x4B, 0x8B, 0xCB, 0x1B, 0x5B, 0x9B, 0xDB, 35176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x2B, 0x6B, 0xAB, 0xEB, 0x3B, 0x7B, 0xBB, 0xFB, 35276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x0F, 0x4F, 0x8F, 0xCF, 0x1F, 0x5F, 0x9F, 0xDF, 35376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x2F, 0x6F, 0xAF, 0xEF, 0x3F, 0x7F, 0xBF, 0xFF 35476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}; 35576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 35676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic PNG_CONST png_byte fourbppswaptable[256] = { 35776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 35876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0, 35976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71, 36076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1, 36176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72, 36276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x82, 0x92, 0xA2, 0xB2, 0xC2, 0xD2, 0xE2, 0xF2, 36376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73, 36476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x83, 0x93, 0xA3, 0xB3, 0xC3, 0xD3, 0xE3, 0xF3, 36576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74, 36676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x84, 0x94, 0xA4, 0xB4, 0xC4, 0xD4, 0xE4, 0xF4, 36776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75, 36876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x85, 0x95, 0xA5, 0xB5, 0xC5, 0xD5, 0xE5, 0xF5, 36976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76, 37076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x86, 0x96, 0xA6, 0xB6, 0xC6, 0xD6, 0xE6, 0xF6, 37176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77, 37276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x87, 0x97, 0xA7, 0xB7, 0xC7, 0xD7, 0xE7, 0xF7, 37376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78, 37476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x88, 0x98, 0xA8, 0xB8, 0xC8, 0xD8, 0xE8, 0xF8, 37576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79, 37676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, 0xE9, 0xF9, 37776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x0A, 0x1A, 0x2A, 0x3A, 0x4A, 0x5A, 0x6A, 0x7A, 37876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x8A, 0x9A, 0xAA, 0xBA, 0xCA, 0xDA, 0xEA, 0xFA, 37976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x0B, 0x1B, 0x2B, 0x3B, 0x4B, 0x5B, 0x6B, 0x7B, 38076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x8B, 0x9B, 0xAB, 0xBB, 0xCB, 0xDB, 0xEB, 0xFB, 38176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x0C, 0x1C, 0x2C, 0x3C, 0x4C, 0x5C, 0x6C, 0x7C, 38276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x8C, 0x9C, 0xAC, 0xBC, 0xCC, 0xDC, 0xEC, 0xFC, 38376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x0D, 0x1D, 0x2D, 0x3D, 0x4D, 0x5D, 0x6D, 0x7D, 38476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x8D, 0x9D, 0xAD, 0xBD, 0xCD, 0xDD, 0xED, 0xFD, 38576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x0E, 0x1E, 0x2E, 0x3E, 0x4E, 0x5E, 0x6E, 0x7E, 38676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x8E, 0x9E, 0xAE, 0xBE, 0xCE, 0xDE, 0xEE, 0xFE, 38776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x0F, 0x1F, 0x2F, 0x3F, 0x4F, 0x5F, 0x6F, 0x7F, 38876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF 38976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}; 39076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 39176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Swaps pixel packing order within bytes */ 39276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid /* PRIVATE */ 39376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_do_packswap(png_row_infop row_info, png_bytep row) 39476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 39576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_debug(1, "in png_do_packswap"); 39676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 39776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ( 39876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifdef PNG_USELESS_TESTS_SUPPORTED 39976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman row != NULL && row_info != NULL && 40076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 40176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman row_info->bit_depth < 8) 40276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 40376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_bytep rp, end, table; 40476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 40576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman end = row + row_info->rowbytes; 40676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 40776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (row_info->bit_depth == 1) 40876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman table = (png_bytep)onebppswaptable; 40976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else if (row_info->bit_depth == 2) 41076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman table = (png_bytep)twobppswaptable; 41176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else if (row_info->bit_depth == 4) 41276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman table = (png_bytep)fourbppswaptable; 41376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else 41476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return; 41576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 41676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (rp = row; rp < end; rp++) 41776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *rp = table[*rp]; 41876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 41976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 42076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif /* PNG_READ_PACKSWAP_SUPPORTED or PNG_WRITE_PACKSWAP_SUPPORTED */ 42176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 42276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if defined(PNG_WRITE_FILLER_SUPPORTED) || \ 42376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman defined(PNG_READ_STRIP_ALPHA_SUPPORTED) 42476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Remove filler or alpha byte(s) */ 42576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid /* PRIVATE */ 42676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags) 42776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 42876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_debug(1, "in png_do_strip_filler"); 42976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 43076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifdef PNG_USELESS_TESTS_SUPPORTED 43176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (row != NULL && row_info != NULL) 43276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 43376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 43476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_bytep sp=row; 43576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_bytep dp=row; 43676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_uint_32 row_width=row_info->width; 43776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_uint_32 i; 43876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 43976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ((row_info->color_type == PNG_COLOR_TYPE_RGB || 44076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA && 44176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman (flags & PNG_FLAG_STRIP_ALPHA))) && 44276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman row_info->channels == 4) 44376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 44476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (row_info->bit_depth == 8) 44576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 44676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* This converts from RGBX or RGBA to RGB */ 44776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (flags & PNG_FLAG_FILLER_AFTER) 44876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 44976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dp+=3; sp+=4; 45076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (i = 1; i < row_width; i++) 45176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 45276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *dp++ = *sp++; 45376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *dp++ = *sp++; 45476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *dp++ = *sp++; 45576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sp++; 45676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 45776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 45876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* This converts from XRGB or ARGB to RGB */ 45976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else 46076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 46176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (i = 0; i < row_width; i++) 46276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 46376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sp++; 46476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *dp++ = *sp++; 46576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *dp++ = *sp++; 46676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *dp++ = *sp++; 46776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 46876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 46976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman row_info->pixel_depth = 24; 47076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman row_info->rowbytes = row_width * 3; 47176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 47276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else /* if (row_info->bit_depth == 16) */ 47376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 47476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (flags & PNG_FLAG_FILLER_AFTER) 47576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 47676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* This converts from RRGGBBXX or RRGGBBAA to RRGGBB */ 47776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sp += 8; dp += 6; 47876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (i = 1; i < row_width; i++) 47976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 48076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* This could be (although png_memcpy is probably slower): 48176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_memcpy(dp, sp, 6); 48276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sp += 8; 48376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dp += 6; 48476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 48576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 48676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *dp++ = *sp++; 48776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *dp++ = *sp++; 48876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *dp++ = *sp++; 48976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *dp++ = *sp++; 49076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *dp++ = *sp++; 49176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *dp++ = *sp++; 49276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sp += 2; 49376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 49476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 49576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else 49676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 49776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* This converts from XXRRGGBB or AARRGGBB to RRGGBB */ 49876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (i = 0; i < row_width; i++) 49976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 50076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* This could be (although png_memcpy is probably slower): 50176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_memcpy(dp, sp, 6); 50276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sp += 8; 50376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dp += 6; 50476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 50576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 50676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sp+=2; 50776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *dp++ = *sp++; 50876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *dp++ = *sp++; 50976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *dp++ = *sp++; 51076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *dp++ = *sp++; 51176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *dp++ = *sp++; 51276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *dp++ = *sp++; 51376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 51476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 51576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman row_info->pixel_depth = 48; 51676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman row_info->rowbytes = row_width * 6; 51776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 51876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman row_info->channels = 3; 51976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 52076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else if ((row_info->color_type == PNG_COLOR_TYPE_GRAY || 52176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && 52276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman (flags & PNG_FLAG_STRIP_ALPHA))) && 52376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman row_info->channels == 2) 52476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 52576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (row_info->bit_depth == 8) 52676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 52776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* This converts from GX or GA to G */ 52876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (flags & PNG_FLAG_FILLER_AFTER) 52976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 53076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (i = 0; i < row_width; i++) 53176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 53276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *dp++ = *sp++; 53376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sp++; 53476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 53576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 53676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* This converts from XG or AG to G */ 53776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else 53876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 53976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (i = 0; i < row_width; i++) 54076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 54176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sp++; 54276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *dp++ = *sp++; 54376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 54476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 54576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman row_info->pixel_depth = 8; 54676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman row_info->rowbytes = row_width; 54776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 54876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else /* if (row_info->bit_depth == 16) */ 54976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 55076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (flags & PNG_FLAG_FILLER_AFTER) 55176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 55276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* This converts from GGXX or GGAA to GG */ 55376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sp += 4; dp += 2; 55476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (i = 1; i < row_width; i++) 55576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 55676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *dp++ = *sp++; 55776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *dp++ = *sp++; 55876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sp += 2; 55976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 56076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 56176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else 56276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 56376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* This converts from XXGG or AAGG to GG */ 56476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (i = 0; i < row_width; i++) 56576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 56676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sp += 2; 56776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *dp++ = *sp++; 56876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *dp++ = *sp++; 56976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 57076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 57176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman row_info->pixel_depth = 16; 57276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman row_info->rowbytes = row_width * 2; 57376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 57476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman row_info->channels = 1; 57576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 57676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (flags & PNG_FLAG_STRIP_ALPHA) 57776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman row_info->color_type &= ~PNG_COLOR_MASK_ALPHA; 57876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 57976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 58076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 58176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 58276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) 58376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Swaps red and blue bytes within a pixel */ 58476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid /* PRIVATE */ 58576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_do_bgr(png_row_infop row_info, png_bytep row) 58676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 58776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_debug(1, "in png_do_bgr"); 58876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 58976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ( 59076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifdef PNG_USELESS_TESTS_SUPPORTED 59176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman row != NULL && row_info != NULL && 59276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 59376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman (row_info->color_type & PNG_COLOR_MASK_COLOR)) 59476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 59576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_uint_32 row_width = row_info->width; 59676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (row_info->bit_depth == 8) 59776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 59876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (row_info->color_type == PNG_COLOR_TYPE_RGB) 59976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 60076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_bytep rp; 60176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_uint_32 i; 60276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 60376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (i = 0, rp = row; i < row_width; i++, rp += 3) 60476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 60576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_byte save = *rp; 60676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *rp = *(rp + 2); 60776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *(rp + 2) = save; 60876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 60976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 61076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) 61176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 61276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_bytep rp; 61376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_uint_32 i; 61476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 61576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (i = 0, rp = row; i < row_width; i++, rp += 4) 61676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 61776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_byte save = *rp; 61876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *rp = *(rp + 2); 61976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *(rp + 2) = save; 62076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 62176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 62276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 62376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else if (row_info->bit_depth == 16) 62476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 62576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (row_info->color_type == PNG_COLOR_TYPE_RGB) 62676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 62776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_bytep rp; 62876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_uint_32 i; 62976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 63076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (i = 0, rp = row; i < row_width; i++, rp += 6) 63176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 63276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_byte save = *rp; 63376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *rp = *(rp + 4); 63476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *(rp + 4) = save; 63576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman save = *(rp + 1); 63676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *(rp + 1) = *(rp + 5); 63776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *(rp + 5) = save; 63876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 63976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 64076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) 64176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 64276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_bytep rp; 64376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_uint_32 i; 64476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 64576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (i = 0, rp = row; i < row_width; i++, rp += 8) 64676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 64776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_byte save = *rp; 64876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *rp = *(rp + 4); 64976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *(rp + 4) = save; 65076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman save = *(rp + 1); 65176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *(rp + 1) = *(rp + 5); 65276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *(rp + 5) = save; 65376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 65476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 65576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 65676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 65776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 65876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */ 65976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 66076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ 66176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman defined(PNG_LEGACY_SUPPORTED) || \ 66276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) 66376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid PNGAPI 66476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_set_user_transform_info(png_structp png_ptr, png_voidp 66576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman user_transform_ptr, int user_transform_depth, int user_transform_channels) 66676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 66776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_debug(1, "in png_set_user_transform_info"); 66876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 66976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (png_ptr == NULL) 67076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return; 67176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED 67276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_ptr->user_transform_ptr = user_transform_ptr; 67376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_ptr->user_transform_depth = (png_byte)user_transform_depth; 67476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_ptr->user_transform_channels = (png_byte)user_transform_channels; 67576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#else 67676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (user_transform_ptr || user_transform_depth || user_transform_channels) 67776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman png_warning(png_ptr, 67876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "This version of libpng does not support user transform info"); 67976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 68076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 68176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 68276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 68376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* This function returns a pointer to the user_transform_ptr associated with 68476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * the user transform functions. The application should free any memory 68576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * associated with this pointer before png_write_destroy and png_read_destroy 68676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * are called. 68776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 68876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_voidp PNGAPI 68976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanpng_get_user_transform_ptr(png_structp png_ptr) 69076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 69176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (png_ptr == NULL) 69276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return (NULL); 69376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED 69476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return ((png_voidp)png_ptr->user_transform_ptr); 69576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#else 69676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return (NULL); 69776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 69876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 69976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ 700