18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* pngtrans.c - transforms the data in a row (used by both readers and writers) 38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Last changed in libpng 1.2.17 May 15, 2007 58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * For conditions of distribution and use, see copyright notice in png.h 68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Copyright (c) 1998-2007 Glenn Randers-Pehrson 78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) 88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) 98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define PNG_INTERNAL 128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "png.h" 138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* turn on BGR-to-RGB mapping */ 178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_bgr(png_structp png_ptr) 198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(1, "in png_set_bgr\n"); 218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(png_ptr == NULL) return; 228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->transformations |= PNG_BGR; 238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) 278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* turn on 16 bit byte swapping */ 288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_swap(png_structp png_ptr) 308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(1, "in png_set_swap\n"); 328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(png_ptr == NULL) return; 338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->bit_depth == 16) 348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->transformations |= PNG_SWAP_BYTES; 358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED) 398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* turn on pixel packing */ 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_packing(png_structp png_ptr) 428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(1, "in png_set_packing\n"); 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(png_ptr == NULL) return; 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->bit_depth < 8) 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->transformations |= PNG_PACK; 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->usr_bit_depth = 8; 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED) 548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* turn on packed pixel swapping */ 558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_packswap(png_structp png_ptr) 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(1, "in png_set_packswap\n"); 598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(png_ptr == NULL) return; 608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->bit_depth < 8) 618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->transformations |= PNG_PACKSWAP; 628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) 668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_shift(png_structp png_ptr, png_color_8p true_bits) 688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(1, "in png_set_shift\n"); 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(png_ptr == NULL) return; 718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->transformations |= PNG_SHIFT; 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->shift = *true_bits; 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_INTERLACING_SUPPORTED) || \ 778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project defined(PNG_WRITE_INTERLACING_SUPPORTED) 788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint PNGAPI 798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_interlace_handling(png_structp png_ptr) 808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(1, "in png_set_interlace handling\n"); 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr && png_ptr->interlaced) 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->transformations |= PNG_INTERLACE; 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (7); 868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (1); 898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Add a filler byte on read, or remove a filler or alpha byte on write. 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * The filler type has changed in v0.95 to allow future 2-byte fillers 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * for 48-bit input data, as well as to avoid problems with some compilers 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * that don't like bytes as parameters. 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_filler(png_structp png_ptr, png_uint_32 filler, int filler_loc) 1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(1, "in png_set_filler\n"); 1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(png_ptr == NULL) return; 1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->transformations |= PNG_FILLER; 1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->filler = (png_byte)filler; 1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (filler_loc == PNG_FILLER_AFTER) 1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->flags |= PNG_FLAG_FILLER_AFTER; 1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER; 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* This should probably go in the "do_read_filler" routine. 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * I attempted to do that in libpng-1.0.1a but that caused problems 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * so I restored it in libpng-1.0.2a 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->color_type == PNG_COLOR_TYPE_RGB) 1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->usr_channels = 4; 1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Also I added this in libpng-1.0.2a (what happens when we expand 1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * a less-than-8-bit grayscale to GA? */ 1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY && png_ptr->bit_depth >= 8) 1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->usr_channels = 2; 1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if !defined(PNG_1_0_X) 1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Added to libpng-1.2.7 */ 1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_add_alpha(png_structp png_ptr, png_uint_32 filler, int filler_loc) 1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(1, "in png_set_add_alpha\n"); 1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(png_ptr == NULL) return; 1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_set_filler(png_ptr, filler, filler_loc); 1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->transformations |= PNG_ADD_ALPHA; 1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \ 1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) 1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_swap_alpha(png_structp png_ptr) 1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(1, "in png_set_swap_alpha\n"); 1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(png_ptr == NULL) return; 1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->transformations |= PNG_SWAP_ALPHA; 1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \ 1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) 1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_invert_alpha(png_structp png_ptr) 1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(1, "in png_set_invert_alpha\n"); 1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(png_ptr == NULL) return; 1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->transformations |= PNG_INVERT_ALPHA; 1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) 1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_invert_mono(png_structp png_ptr) 1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(1, "in png_set_invert_mono\n"); 1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(png_ptr == NULL) return; 1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->transformations |= PNG_INVERT_MONO; 1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* invert monochrome grayscale data */ 1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_do_invert(png_row_infop row_info, png_bytep row) 1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(1, "in png_do_invert\n"); 1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* This test removed from libpng version 1.0.13 and 1.2.0: 1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * if (row_info->bit_depth == 1 && 1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_USELESS_TESTS_SUPPORTED) 1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (row == NULL || row_info == NULL) 1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (row_info->color_type == PNG_COLOR_TYPE_GRAY) 1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_bytep rp = row; 1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_uint_32 i; 1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_uint_32 istop = row_info->rowbytes; 1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < istop; i++) 1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *rp = (png_byte)(~(*rp)); 1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project rp++; 1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && 1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project row_info->bit_depth == 8) 2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_bytep rp = row; 2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_uint_32 i; 2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_uint_32 istop = row_info->rowbytes; 2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < istop; i+=2) 2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *rp = (png_byte)(~(*rp)); 2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project rp+=2; 2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && 2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project row_info->bit_depth == 16) 2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_bytep rp = row; 2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_uint_32 i; 2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_uint_32 istop = row_info->rowbytes; 2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < istop; i+=4) 2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *rp = (png_byte)(~(*rp)); 2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *(rp+1) = (png_byte)(~(*(rp+1))); 2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project rp+=4; 2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) 2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* swaps byte order on 16 bit depth images */ 2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_do_swap(png_row_infop row_info, png_bytep row) 2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(1, "in png_do_swap\n"); 2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( 2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_USELESS_TESTS_SUPPORTED) 2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project row != NULL && row_info != NULL && 2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project row_info->bit_depth == 16) 2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_bytep rp = row; 2418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_uint_32 i; 2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_uint_32 istop= row_info->width * row_info->channels; 2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < istop; i++, rp += 2) 2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_byte t = *rp; 2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *rp = *(rp + 1); 2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *(rp + 1) = t; 2498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED) 2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic PNG_CONST png_byte onebppswaptable[256] = { 2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 2578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0, 2588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, 2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8, 2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, 2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4, 2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, 2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC, 2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, 2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2, 2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, 2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA, 2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, 2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6, 2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, 2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE, 2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, 2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1, 2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, 2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9, 2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, 2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5, 2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, 2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD, 2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, 2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3, 2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, 2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB, 2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, 2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7, 2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF 2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic PNG_CONST png_byte twobppswaptable[256] = { 2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x00, 0x40, 0x80, 0xC0, 0x10, 0x50, 0x90, 0xD0, 2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x20, 0x60, 0xA0, 0xE0, 0x30, 0x70, 0xB0, 0xF0, 2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x04, 0x44, 0x84, 0xC4, 0x14, 0x54, 0x94, 0xD4, 2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x24, 0x64, 0xA4, 0xE4, 0x34, 0x74, 0xB4, 0xF4, 2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x08, 0x48, 0x88, 0xC8, 0x18, 0x58, 0x98, 0xD8, 2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x28, 0x68, 0xA8, 0xE8, 0x38, 0x78, 0xB8, 0xF8, 2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x0C, 0x4C, 0x8C, 0xCC, 0x1C, 0x5C, 0x9C, 0xDC, 2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x2C, 0x6C, 0xAC, 0xEC, 0x3C, 0x7C, 0xBC, 0xFC, 2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x01, 0x41, 0x81, 0xC1, 0x11, 0x51, 0x91, 0xD1, 3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x21, 0x61, 0xA1, 0xE1, 0x31, 0x71, 0xB1, 0xF1, 3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x05, 0x45, 0x85, 0xC5, 0x15, 0x55, 0x95, 0xD5, 3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x25, 0x65, 0xA5, 0xE5, 0x35, 0x75, 0xB5, 0xF5, 3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x09, 0x49, 0x89, 0xC9, 0x19, 0x59, 0x99, 0xD9, 3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x29, 0x69, 0xA9, 0xE9, 0x39, 0x79, 0xB9, 0xF9, 3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x0D, 0x4D, 0x8D, 0xCD, 0x1D, 0x5D, 0x9D, 0xDD, 3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x2D, 0x6D, 0xAD, 0xED, 0x3D, 0x7D, 0xBD, 0xFD, 3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x02, 0x42, 0x82, 0xC2, 0x12, 0x52, 0x92, 0xD2, 3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x22, 0x62, 0xA2, 0xE2, 0x32, 0x72, 0xB2, 0xF2, 3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x06, 0x46, 0x86, 0xC6, 0x16, 0x56, 0x96, 0xD6, 3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x26, 0x66, 0xA6, 0xE6, 0x36, 0x76, 0xB6, 0xF6, 3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x0A, 0x4A, 0x8A, 0xCA, 0x1A, 0x5A, 0x9A, 0xDA, 3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x2A, 0x6A, 0xAA, 0xEA, 0x3A, 0x7A, 0xBA, 0xFA, 3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x0E, 0x4E, 0x8E, 0xCE, 0x1E, 0x5E, 0x9E, 0xDE, 3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x2E, 0x6E, 0xAE, 0xEE, 0x3E, 0x7E, 0xBE, 0xFE, 3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x03, 0x43, 0x83, 0xC3, 0x13, 0x53, 0x93, 0xD3, 3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x23, 0x63, 0xA3, 0xE3, 0x33, 0x73, 0xB3, 0xF3, 3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x07, 0x47, 0x87, 0xC7, 0x17, 0x57, 0x97, 0xD7, 3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x27, 0x67, 0xA7, 0xE7, 0x37, 0x77, 0xB7, 0xF7, 3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x0B, 0x4B, 0x8B, 0xCB, 0x1B, 0x5B, 0x9B, 0xDB, 3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x2B, 0x6B, 0xAB, 0xEB, 0x3B, 0x7B, 0xBB, 0xFB, 3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x0F, 0x4F, 0x8F, 0xCF, 0x1F, 0x5F, 0x9F, 0xDF, 3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x2F, 0x6F, 0xAF, 0xEF, 0x3F, 0x7F, 0xBF, 0xFF 3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic PNG_CONST png_byte fourbppswaptable[256] = { 3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0, 3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71, 3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1, 3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72, 3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x82, 0x92, 0xA2, 0xB2, 0xC2, 0xD2, 0xE2, 0xF2, 3328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73, 3338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x83, 0x93, 0xA3, 0xB3, 0xC3, 0xD3, 0xE3, 0xF3, 3348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74, 3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x84, 0x94, 0xA4, 0xB4, 0xC4, 0xD4, 0xE4, 0xF4, 3368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75, 3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x85, 0x95, 0xA5, 0xB5, 0xC5, 0xD5, 0xE5, 0xF5, 3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76, 3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x86, 0x96, 0xA6, 0xB6, 0xC6, 0xD6, 0xE6, 0xF6, 3408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77, 3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x87, 0x97, 0xA7, 0xB7, 0xC7, 0xD7, 0xE7, 0xF7, 3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78, 3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x88, 0x98, 0xA8, 0xB8, 0xC8, 0xD8, 0xE8, 0xF8, 3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79, 3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, 0xE9, 0xF9, 3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x0A, 0x1A, 0x2A, 0x3A, 0x4A, 0x5A, 0x6A, 0x7A, 3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x8A, 0x9A, 0xAA, 0xBA, 0xCA, 0xDA, 0xEA, 0xFA, 3488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x0B, 0x1B, 0x2B, 0x3B, 0x4B, 0x5B, 0x6B, 0x7B, 3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x8B, 0x9B, 0xAB, 0xBB, 0xCB, 0xDB, 0xEB, 0xFB, 3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x0C, 0x1C, 0x2C, 0x3C, 0x4C, 0x5C, 0x6C, 0x7C, 3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x8C, 0x9C, 0xAC, 0xBC, 0xCC, 0xDC, 0xEC, 0xFC, 3528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x0D, 0x1D, 0x2D, 0x3D, 0x4D, 0x5D, 0x6D, 0x7D, 3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x8D, 0x9D, 0xAD, 0xBD, 0xCD, 0xDD, 0xED, 0xFD, 3548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x0E, 0x1E, 0x2E, 0x3E, 0x4E, 0x5E, 0x6E, 0x7E, 3558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x8E, 0x9E, 0xAE, 0xBE, 0xCE, 0xDE, 0xEE, 0xFE, 3568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x0F, 0x1F, 0x2F, 0x3F, 0x4F, 0x5F, 0x6F, 0x7F, 3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF 3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* swaps pixel packing order within bytes */ 3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 3628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_do_packswap(png_row_infop row_info, png_bytep row) 3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(1, "in png_do_packswap\n"); 3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( 3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_USELESS_TESTS_SUPPORTED) 3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project row != NULL && row_info != NULL && 3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project row_info->bit_depth < 8) 3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_bytep rp, end, table; 3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project end = row + row_info->rowbytes; 3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (row_info->bit_depth == 1) 3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project table = (png_bytep)onebppswaptable; 3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (row_info->bit_depth == 2) 3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project table = (png_bytep)twobppswaptable; 3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (row_info->bit_depth == 4) 3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project table = (png_bytep)fourbppswaptable; 3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (rp = row; rp < end; rp++) 3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *rp = table[*rp]; 3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_READ_PACKSWAP_SUPPORTED or PNG_WRITE_PACKSWAP_SUPPORTED */ 3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_WRITE_FILLER_SUPPORTED) || \ 3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project defined(PNG_READ_STRIP_ALPHA_SUPPORTED) 3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* remove filler or alpha byte(s) */ 3938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags) 3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(1, "in png_do_strip_filler\n"); 3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_USELESS_TESTS_SUPPORTED) 3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (row != NULL && row_info != NULL) 3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_bytep sp=row; 4028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_bytep dp=row; 4038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_uint_32 row_width=row_info->width; 4048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_uint_32 i; 4058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ((row_info->color_type == PNG_COLOR_TYPE_RGB || 4078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA && 4088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (flags & PNG_FLAG_STRIP_ALPHA))) && 4098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project row_info->channels == 4) 4108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (row_info->bit_depth == 8) 4128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* This converts from RGBX or RGBA to RGB */ 4148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (flags & PNG_FLAG_FILLER_AFTER) 4158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dp+=3; sp+=4; 4178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 1; i < row_width; i++) 4188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *dp++ = *sp++; 4208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *dp++ = *sp++; 4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *dp++ = *sp++; 4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sp++; 4238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* This converts from XRGB or ARGB to RGB */ 4268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 4278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < row_width; i++) 4298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sp++; 4318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *dp++ = *sp++; 4328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *dp++ = *sp++; 4338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *dp++ = *sp++; 4348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project row_info->pixel_depth = 24; 4378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project row_info->rowbytes = row_width * 3; 4388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else /* if (row_info->bit_depth == 16) */ 4408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (flags & PNG_FLAG_FILLER_AFTER) 4428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* This converts from RRGGBBXX or RRGGBBAA to RRGGBB */ 4448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sp += 8; dp += 6; 4458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 1; i < row_width; i++) 4468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* This could be (although png_memcpy is probably slower): 4488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_memcpy(dp, sp, 6); 4498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sp += 8; 4508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dp += 6; 4518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 4528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *dp++ = *sp++; 4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *dp++ = *sp++; 4558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *dp++ = *sp++; 4568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *dp++ = *sp++; 4578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *dp++ = *sp++; 4588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *dp++ = *sp++; 4598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sp += 2; 4608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 4638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* This converts from XXRRGGBB or AARRGGBB to RRGGBB */ 4658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < row_width; i++) 4668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* This could be (although png_memcpy is probably slower): 4688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_memcpy(dp, sp, 6); 4698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sp += 8; 4708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dp += 6; 4718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 4728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sp+=2; 4748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *dp++ = *sp++; 4758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *dp++ = *sp++; 4768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *dp++ = *sp++; 4778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *dp++ = *sp++; 4788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *dp++ = *sp++; 4798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *dp++ = *sp++; 4808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project row_info->pixel_depth = 48; 4838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project row_info->rowbytes = row_width * 6; 4848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project row_info->channels = 3; 4868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if ((row_info->color_type == PNG_COLOR_TYPE_GRAY || 4888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && 4898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (flags & PNG_FLAG_STRIP_ALPHA))) && 4908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project row_info->channels == 2) 4918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (row_info->bit_depth == 8) 4938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* This converts from GX or GA to G */ 4958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (flags & PNG_FLAG_FILLER_AFTER) 4968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < row_width; i++) 4988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *dp++ = *sp++; 5008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sp++; 5018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* This converts from XG or AG to G */ 5048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 5058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < row_width; i++) 5078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sp++; 5098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *dp++ = *sp++; 5108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project row_info->pixel_depth = 8; 5138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project row_info->rowbytes = row_width; 5148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else /* if (row_info->bit_depth == 16) */ 5168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (flags & PNG_FLAG_FILLER_AFTER) 5188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* This converts from GGXX or GGAA to GG */ 5208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sp += 4; dp += 2; 5218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 1; i < row_width; i++) 5228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *dp++ = *sp++; 5248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *dp++ = *sp++; 5258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sp += 2; 5268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 5298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* This converts from XXGG or AAGG to GG */ 5318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < row_width; i++) 5328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sp += 2; 5348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *dp++ = *sp++; 5358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *dp++ = *sp++; 5368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project row_info->pixel_depth = 16; 5398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project row_info->rowbytes = row_width * 2; 5408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project row_info->channels = 1; 5428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (flags & PNG_FLAG_STRIP_ALPHA) 5448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project row_info->color_type &= ~PNG_COLOR_MASK_ALPHA; 5458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 5488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) 5508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* swaps red and blue bytes within a pixel */ 5518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid /* PRIVATE */ 5528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_do_bgr(png_row_infop row_info, png_bytep row) 5538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(1, "in png_do_bgr\n"); 5558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( 5568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_USELESS_TESTS_SUPPORTED) 5578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project row != NULL && row_info != NULL && 5588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 5598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (row_info->color_type & PNG_COLOR_MASK_COLOR)) 5608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_uint_32 row_width = row_info->width; 5628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (row_info->bit_depth == 8) 5638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (row_info->color_type == PNG_COLOR_TYPE_RGB) 5658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_bytep rp; 5678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_uint_32 i; 5688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0, rp = row; i < row_width; i++, rp += 3) 5708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_byte save = *rp; 5728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *rp = *(rp + 2); 5738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *(rp + 2) = save; 5748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) 5778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_bytep rp; 5798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_uint_32 i; 5808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0, rp = row; i < row_width; i++, rp += 4) 5828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_byte save = *rp; 5848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *rp = *(rp + 2); 5858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *(rp + 2) = save; 5868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (row_info->bit_depth == 16) 5908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (row_info->color_type == PNG_COLOR_TYPE_RGB) 5928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_bytep rp; 5948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_uint_32 i; 5958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0, rp = row; i < row_width; i++, rp += 6) 5978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_byte save = *rp; 5998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *rp = *(rp + 4); 6008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *(rp + 4) = save; 6018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project save = *(rp + 1); 6028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *(rp + 1) = *(rp + 5); 6038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *(rp + 5) = save; 6048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) 6078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_bytep rp; 6098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_uint_32 i; 6108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0, rp = row; i < row_width; i++, rp += 8) 6128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_byte save = *rp; 6148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *rp = *(rp + 4); 6158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *(rp + 4) = save; 6168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project save = *(rp + 1); 6178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *(rp + 1) = *(rp + 5); 6188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *(rp + 5) = save; 6198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */ 6258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ 6278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ 6288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project defined(PNG_LEGACY_SUPPORTED) 6298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PNGAPI 6308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_set_user_transform_info(png_structp png_ptr, png_voidp 6318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project user_transform_ptr, int user_transform_depth, int user_transform_channels) 6328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 6338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_debug(1, "in png_set_user_transform_info\n"); 6348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(png_ptr == NULL) return; 6358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) 6368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->user_transform_ptr = user_transform_ptr; 6378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->user_transform_depth = (png_byte)user_transform_depth; 6388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_ptr->user_transform_channels = (png_byte)user_transform_channels; 6398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 6408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(user_transform_ptr || user_transform_depth || user_transform_channels) 6418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project png_warning(png_ptr, 6428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "This version of libpng does not support user transform info"); 6438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 6448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 6468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* This function returns a pointer to the user_transform_ptr associated with 6488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * the user transform functions. The application should free any memory 6498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * associated with this pointer before png_write_destroy and png_read_destroy 6508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * are called. 6518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 6528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_voidp PNGAPI 6538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpng_get_user_transform_ptr(png_structp png_ptr) 6548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 6558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) 6568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (png_ptr == NULL) return (NULL); 6578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return ((png_voidp)png_ptr->user_transform_ptr); 6588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 6598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (NULL); 6608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 6618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ 663