fltk 1.3.0rc3
About: FLTK (Fast Light Tool Kit) is a cross-platform C++ GUI toolkit for UNIX/Linux (X11), Microsoft Windows, and MacOS X. Release candidate.
  SfR Fresh Dox: fltk-1.3.0rc3-source.tar.gz ("inofficial" and yet experimental doxygen-generated source code documentation)  

pngtrans.c

Go to the documentation of this file.
00001 
00002 /* pngtrans.c - transforms the data in a row (used by both readers and writers)
00003  *
00004  * Last changed in libpng 1.2.36 [May 14, 2009]
00005  * Copyright (c) 1998-2009 Glenn Randers-Pehrson
00006  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
00007  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
00008  *
00009  * This code is released under the libpng license.
00010  * For conditions of distribution and use, see the disclaimer
00011  * and license in png.h
00012  */
00013 
00014 #define PNG_INTERNAL
00015 #include "png.h"
00016 #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
00017 
00018 #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
00019 /* Turn on BGR-to-RGB mapping */
00020 void PNGAPI
00021 png_set_bgr(png_structp png_ptr)
00022 {
00023    png_debug(1, "in png_set_bgr");
00024    if (png_ptr == NULL)
00025       return;
00026    png_ptr->transformations |= PNG_BGR;
00027 }
00028 #endif
00029 
00030 #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
00031 /* Turn on 16 bit byte swapping */
00032 void PNGAPI
00033 png_set_swap(png_structp png_ptr)
00034 {
00035    png_debug(1, "in png_set_swap");
00036    if (png_ptr == NULL)
00037       return;
00038    if (png_ptr->bit_depth == 16)
00039       png_ptr->transformations |= PNG_SWAP_BYTES;
00040 }
00041 #endif
00042 
00043 #if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED)
00044 /* Turn on pixel packing */
00045 void PNGAPI
00046 png_set_packing(png_structp png_ptr)
00047 {
00048    png_debug(1, "in png_set_packing");
00049    if (png_ptr == NULL)
00050       return;
00051    if (png_ptr->bit_depth < 8)
00052    {
00053       png_ptr->transformations |= PNG_PACK;
00054       png_ptr->usr_bit_depth = 8;
00055    }
00056 }
00057 #endif
00058 
00059 #if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
00060 /* Turn on packed pixel swapping */
00061 void PNGAPI
00062 png_set_packswap(png_structp png_ptr)
00063 {
00064    png_debug(1, "in png_set_packswap");
00065    if (png_ptr == NULL)
00066       return;
00067    if (png_ptr->bit_depth < 8)
00068       png_ptr->transformations |= PNG_PACKSWAP;
00069 }
00070 #endif
00071 
00072 #if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED)
00073 void PNGAPI
00074 png_set_shift(png_structp png_ptr, png_color_8p true_bits)
00075 {
00076    png_debug(1, "in png_set_shift");
00077    if (png_ptr == NULL)
00078       return;
00079    png_ptr->transformations |= PNG_SHIFT;
00080    png_ptr->shift = *true_bits;
00081 }
00082 #endif
00083 
00084 #if defined(PNG_READ_INTERLACING_SUPPORTED) || \
00085     defined(PNG_WRITE_INTERLACING_SUPPORTED)
00086 int PNGAPI
00087 png_set_interlace_handling(png_structp png_ptr)
00088 {
00089    png_debug(1, "in png_set_interlace handling");
00090    if (png_ptr && png_ptr->interlaced)
00091    {
00092       png_ptr->transformations |= PNG_INTERLACE;
00093       return (7);
00094    }
00095 
00096    return (1);
00097 }
00098 #endif
00099 
00100 #if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)
00101 /* Add a filler byte on read, or remove a filler or alpha byte on write.
00102  * The filler type has changed in v0.95 to allow future 2-byte fillers
00103  * for 48-bit input data, as well as to avoid problems with some compilers
00104  * that don't like bytes as parameters.
00105  */
00106 void PNGAPI
00107 png_set_filler(png_structp png_ptr, png_uint_32 filler, int filler_loc)
00108 {
00109    png_debug(1, "in png_set_filler");
00110    if (png_ptr == NULL)
00111       return;
00112    png_ptr->transformations |= PNG_FILLER;
00113    png_ptr->filler = (png_byte)filler;
00114    if (filler_loc == PNG_FILLER_AFTER)
00115       png_ptr->flags |= PNG_FLAG_FILLER_AFTER;
00116    else
00117       png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER;
00118 
00119    /* This should probably go in the "do_read_filler" routine.
00120     * I attempted to do that in libpng-1.0.1a but that caused problems
00121     * so I restored it in libpng-1.0.2a
00122    */
00123 
00124    if (png_ptr->color_type == PNG_COLOR_TYPE_RGB)
00125    {
00126       png_ptr->usr_channels = 4;
00127    }
00128 
00129    /* Also I added this in libpng-1.0.2a (what happens when we expand
00130     * a less-than-8-bit grayscale to GA? */
00131 
00132    if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY && png_ptr->bit_depth >= 8)
00133    {
00134       png_ptr->usr_channels = 2;
00135    }
00136 }
00137 
00138 #if !defined(PNG_1_0_X)
00139 /* Added to libpng-1.2.7 */
00140 void PNGAPI
00141 png_set_add_alpha(png_structp png_ptr, png_uint_32 filler, int filler_loc)
00142 {
00143    png_debug(1, "in png_set_add_alpha");
00144    if (png_ptr == NULL)
00145       return;
00146    png_set_filler(png_ptr, filler, filler_loc);
00147    png_ptr->transformations |= PNG_ADD_ALPHA;
00148 }
00149 #endif
00150 
00151 #endif
00152 
00153 #if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \
00154     defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
00155 void PNGAPI
00156 png_set_swap_alpha(png_structp png_ptr)
00157 {
00158    png_debug(1, "in png_set_swap_alpha");
00159    if (png_ptr == NULL)
00160       return;
00161    png_ptr->transformations |= PNG_SWAP_ALPHA;
00162 }
00163 #endif
00164 
00165 #if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \
00166     defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
00167 void PNGAPI
00168 png_set_invert_alpha(png_structp png_ptr)
00169 {
00170    png_debug(1, "in png_set_invert_alpha");
00171    if (png_ptr == NULL)
00172       return;
00173    png_ptr->transformations |= PNG_INVERT_ALPHA;
00174 }
00175 #endif
00176 
00177 #if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED)
00178 void PNGAPI
00179 png_set_invert_mono(png_structp png_ptr)
00180 {
00181    png_debug(1, "in png_set_invert_mono");
00182    if (png_ptr == NULL)
00183       return;
00184    png_ptr->transformations |= PNG_INVERT_MONO;
00185 }
00186 
00187 /* Invert monochrome grayscale data */
00188 void /* PRIVATE */
00189 png_do_invert(png_row_infop row_info, png_bytep row)
00190 {
00191    png_debug(1, "in png_do_invert");
00192   /* This test removed from libpng version 1.0.13 and 1.2.0:
00193    *   if (row_info->bit_depth == 1 &&
00194    */
00195 #if defined(PNG_USELESS_TESTS_SUPPORTED)
00196    if (row == NULL || row_info == NULL)
00197      return;
00198 #endif
00199    if (row_info->color_type == PNG_COLOR_TYPE_GRAY)
00200    {
00201       png_bytep rp = row;
00202       png_uint_32 i;
00203       png_uint_32 istop = row_info->rowbytes;
00204 
00205       for (i = 0; i < istop; i++)
00206       {
00207          *rp = (png_byte)(~(*rp));
00208          rp++;
00209       }
00210    }
00211    else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
00212       row_info->bit_depth == 8)
00213    {
00214       png_bytep rp = row;
00215       png_uint_32 i;
00216       png_uint_32 istop = row_info->rowbytes;
00217 
00218       for (i = 0; i < istop; i+=2)
00219       {
00220          *rp = (png_byte)(~(*rp));
00221          rp+=2;
00222       }
00223    }
00224    else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
00225       row_info->bit_depth == 16)
00226    {
00227       png_bytep rp = row;
00228       png_uint_32 i;
00229       png_uint_32 istop = row_info->rowbytes;
00230 
00231       for (i = 0; i < istop; i+=4)
00232       {
00233          *rp = (png_byte)(~(*rp));
00234          *(rp+1) = (png_byte)(~(*(rp+1)));
00235          rp+=4;
00236       }
00237    }
00238 }
00239 #endif
00240 
00241 #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
00242 /* Swaps byte order on 16 bit depth images */
00243 void /* PRIVATE */
00244 png_do_swap(png_row_infop row_info, png_bytep row)
00245 {
00246    png_debug(1, "in png_do_swap");
00247    if (
00248 #if defined(PNG_USELESS_TESTS_SUPPORTED)
00249        row != NULL && row_info != NULL &&
00250 #endif
00251        row_info->bit_depth == 16)
00252    {
00253       png_bytep rp = row;
00254       png_uint_32 i;
00255       png_uint_32 istop= row_info->width * row_info->channels;
00256 
00257       for (i = 0; i < istop; i++, rp += 2)
00258       {
00259          png_byte t = *rp;
00260          *rp = *(rp + 1);
00261          *(rp + 1) = t;
00262       }
00263    }
00264 }
00265 #endif
00266 
00267 #if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
00268 static PNG_CONST png_byte onebppswaptable[256] = {
00269    0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,
00270    0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
00271    0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8,
00272    0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
00273    0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4,
00274    0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
00275    0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC,
00276    0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
00277    0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2,
00278    0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
00279    0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA,
00280    0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
00281    0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6,
00282    0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
00283    0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE,
00284    0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
00285    0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1,
00286    0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
00287    0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9,
00288    0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
00289    0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5,
00290    0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
00291    0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED,
00292    0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
00293    0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3,
00294    0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
00295    0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB,
00296    0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
00297    0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7,
00298    0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
00299    0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF,
00300    0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
00301 };
00302 
00303 static PNG_CONST png_byte twobppswaptable[256] = {
00304    0x00, 0x40, 0x80, 0xC0, 0x10, 0x50, 0x90, 0xD0,
00305    0x20, 0x60, 0xA0, 0xE0, 0x30, 0x70, 0xB0, 0xF0,
00306    0x04, 0x44, 0x84, 0xC4, 0x14, 0x54, 0x94, 0xD4,
00307    0x24, 0x64, 0xA4, 0xE4, 0x34, 0x74, 0xB4, 0xF4,
00308    0x08, 0x48, 0x88, 0xC8, 0x18, 0x58, 0x98, 0xD8,
00309    0x28, 0x68, 0xA8, 0xE8, 0x38, 0x78, 0xB8, 0xF8,
00310    0x0C, 0x4C, 0x8C, 0xCC, 0x1C, 0x5C, 0x9C, 0xDC,
00311    0x2C, 0x6C, 0xAC, 0xEC, 0x3C, 0x7C, 0xBC, 0xFC,
00312    0x01, 0x41, 0x81, 0xC1, 0x11, 0x51, 0x91, 0xD1,
00313    0x21, 0x61, 0xA1, 0xE1, 0x31, 0x71, 0xB1, 0xF1,
00314    0x05, 0x45, 0x85, 0xC5, 0x15, 0x55, 0x95, 0xD5,
00315    0x25, 0x65, 0xA5, 0xE5, 0x35, 0x75, 0xB5, 0xF5,
00316    0x09, 0x49, 0x89, 0xC9, 0x19, 0x59, 0x99, 0xD9,
00317    0x29, 0x69, 0xA9, 0xE9, 0x39, 0x79, 0xB9, 0xF9,
00318    0x0D, 0x4D, 0x8D, 0xCD, 0x1D, 0x5D, 0x9D, 0xDD,
00319    0x2D, 0x6D, 0xAD, 0xED, 0x3D, 0x7D, 0xBD, 0xFD,
00320    0x02, 0x42, 0x82, 0xC2, 0x12, 0x52, 0x92, 0xD2,
00321    0x22, 0x62, 0xA2, 0xE2, 0x32, 0x72, 0xB2, 0xF2,
00322    0x06, 0x46, 0x86, 0xC6, 0x16, 0x56, 0x96, 0xD6,
00323    0x26, 0x66, 0xA6, 0xE6, 0x36, 0x76, 0xB6, 0xF6,
00324    0x0A, 0x4A, 0x8A, 0xCA, 0x1A, 0x5A, 0x9A, 0xDA,
00325    0x2A, 0x6A, 0xAA, 0xEA, 0x3A, 0x7A, 0xBA, 0xFA,
00326    0x0E, 0x4E, 0x8E, 0xCE, 0x1E, 0x5E, 0x9E, 0xDE,
00327    0x2E, 0x6E, 0xAE, 0xEE, 0x3E, 0x7E, 0xBE, 0xFE,
00328    0x03, 0x43, 0x83, 0xC3, 0x13, 0x53, 0x93, 0xD3,
00329    0x23, 0x63, 0xA3, 0xE3, 0x33, 0x73, 0xB3, 0xF3,
00330    0x07, 0x47, 0x87, 0xC7, 0x17, 0x57, 0x97, 0xD7,
00331    0x27, 0x67, 0xA7, 0xE7, 0x37, 0x77, 0xB7, 0xF7,
00332    0x0B, 0x4B, 0x8B, 0xCB, 0x1B, 0x5B, 0x9B, 0xDB,
00333    0x2B, 0x6B, 0xAB, 0xEB, 0x3B, 0x7B, 0xBB, 0xFB,
00334    0x0F, 0x4F, 0x8F, 0xCF, 0x1F, 0x5F, 0x9F, 0xDF,
00335    0x2F, 0x6F, 0xAF, 0xEF, 0x3F, 0x7F, 0xBF, 0xFF
00336 };
00337 
00338 static PNG_CONST png_byte fourbppswaptable[256] = {
00339    0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70,
00340    0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0,
00341    0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71,
00342    0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1,
00343    0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72,
00344    0x82, 0x92, 0xA2, 0xB2, 0xC2, 0xD2, 0xE2, 0xF2,
00345    0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73,
00346    0x83, 0x93, 0xA3, 0xB3, 0xC3, 0xD3, 0xE3, 0xF3,
00347    0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74,
00348    0x84, 0x94, 0xA4, 0xB4, 0xC4, 0xD4, 0xE4, 0xF4,
00349    0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75,
00350    0x85, 0x95, 0xA5, 0xB5, 0xC5, 0xD5, 0xE5, 0xF5,
00351    0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76,
00352    0x86, 0x96, 0xA6, 0xB6, 0xC6, 0xD6, 0xE6, 0xF6,
00353    0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77,
00354    0x87, 0x97, 0xA7, 0xB7, 0xC7, 0xD7, 0xE7, 0xF7,
00355    0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78,
00356    0x88, 0x98, 0xA8, 0xB8, 0xC8, 0xD8, 0xE8, 0xF8,
00357    0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79,
00358    0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, 0xE9, 0xF9,
00359    0x0A, 0x1A, 0x2A, 0x3A, 0x4A, 0x5A, 0x6A, 0x7A,
00360    0x8A, 0x9A, 0xAA, 0xBA, 0xCA, 0xDA, 0xEA, 0xFA,
00361    0x0B, 0x1B, 0x2B, 0x3B, 0x4B, 0x5B, 0x6B, 0x7B,
00362    0x8B, 0x9B, 0xAB, 0xBB, 0xCB, 0xDB, 0xEB, 0xFB,
00363    0x0C, 0x1C, 0x2C, 0x3C, 0x4C, 0x5C, 0x6C, 0x7C,
00364    0x8C, 0x9C, 0xAC, 0xBC, 0xCC, 0xDC, 0xEC, 0xFC,
00365    0x0D, 0x1D, 0x2D, 0x3D, 0x4D, 0x5D, 0x6D, 0x7D,
00366    0x8D, 0x9D, 0xAD, 0xBD, 0xCD, 0xDD, 0xED, 0xFD,
00367    0x0E, 0x1E, 0x2E, 0x3E, 0x4E, 0x5E, 0x6E, 0x7E,
00368    0x8E, 0x9E, 0xAE, 0xBE, 0xCE, 0xDE, 0xEE, 0xFE,
00369    0x0F, 0x1F, 0x2F, 0x3F, 0x4F, 0x5F, 0x6F, 0x7F,
00370    0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF
00371 };
00372 
00373 /* Swaps pixel packing order within bytes */
00374 void /* PRIVATE */
00375 png_do_packswap(png_row_infop row_info, png_bytep row)
00376 {
00377    png_debug(1, "in png_do_packswap");
00378    if (
00379 #if defined(PNG_USELESS_TESTS_SUPPORTED)
00380        row != NULL && row_info != NULL &&
00381 #endif
00382        row_info->bit_depth < 8)
00383    {
00384       png_bytep rp, end, table;
00385 
00386       end = row + row_info->rowbytes;
00387 
00388       if (row_info->bit_depth == 1)
00389          table = (png_bytep)onebppswaptable;
00390       else if (row_info->bit_depth == 2)
00391          table = (png_bytep)twobppswaptable;
00392       else if (row_info->bit_depth == 4)
00393          table = (png_bytep)fourbppswaptable;
00394       else
00395          return;
00396 
00397       for (rp = row; rp < end; rp++)
00398          *rp = table[*rp];
00399    }
00400 }
00401 #endif /* PNG_READ_PACKSWAP_SUPPORTED or PNG_WRITE_PACKSWAP_SUPPORTED */
00402 
00403 #if defined(PNG_WRITE_FILLER_SUPPORTED) || \
00404     defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
00405 /* Remove filler or alpha byte(s) */
00406 void /* PRIVATE */
00407 png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags)
00408 {
00409    png_debug(1, "in png_do_strip_filler");
00410 #if defined(PNG_USELESS_TESTS_SUPPORTED)
00411    if (row != NULL && row_info != NULL)
00412 #endif
00413    {
00414       png_bytep sp=row;
00415       png_bytep dp=row;
00416       png_uint_32 row_width=row_info->width;
00417       png_uint_32 i;
00418 
00419       if ((row_info->color_type == PNG_COLOR_TYPE_RGB ||
00420           (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA &&
00421           (flags & PNG_FLAG_STRIP_ALPHA))) &&
00422           row_info->channels == 4)
00423       {
00424          if (row_info->bit_depth == 8)
00425          {
00426             /* This converts from RGBX or RGBA to RGB */
00427             if (flags & PNG_FLAG_FILLER_AFTER)
00428             {
00429                dp+=3; sp+=4;
00430                for (i = 1; i < row_width; i++)
00431                {
00432                   *dp++ = *sp++;
00433                   *dp++ = *sp++;
00434                   *dp++ = *sp++;
00435                   sp++;
00436                }
00437             }
00438             /* This converts from XRGB or ARGB to RGB */
00439             else
00440             {
00441                for (i = 0; i < row_width; i++)
00442                {
00443                   sp++;
00444                   *dp++ = *sp++;
00445                   *dp++ = *sp++;
00446                   *dp++ = *sp++;
00447                }
00448             }
00449             row_info->pixel_depth = 24;
00450             row_info->rowbytes = row_width * 3;
00451          }
00452          else /* if (row_info->bit_depth == 16) */
00453          {
00454             if (flags & PNG_FLAG_FILLER_AFTER)
00455             {
00456                /* This converts from RRGGBBXX or RRGGBBAA to RRGGBB */
00457                sp += 8; dp += 6;
00458                for (i = 1; i < row_width; i++)
00459                {
00460                   /* This could be (although png_memcpy is probably slower):
00461                   png_memcpy(dp, sp, 6);
00462                   sp += 8;
00463                   dp += 6;
00464                   */
00465 
00466                   *dp++ = *sp++;
00467                   *dp++ = *sp++;
00468                   *dp++ = *sp++;
00469                   *dp++ = *sp++;
00470                   *dp++ = *sp++;
00471                   *dp++ = *sp++;
00472                   sp += 2;
00473                }
00474             }
00475             else
00476             {
00477                /* This converts from XXRRGGBB or AARRGGBB to RRGGBB */
00478                for (i = 0; i < row_width; i++)
00479                {
00480                   /* This could be (although png_memcpy is probably slower):
00481                   png_memcpy(dp, sp, 6);
00482                   sp += 8;
00483                   dp += 6;
00484                   */
00485 
00486                   sp+=2;
00487                   *dp++ = *sp++;
00488                   *dp++ = *sp++;
00489                   *dp++ = *sp++;
00490                   *dp++ = *sp++;
00491                   *dp++ = *sp++;
00492                   *dp++ = *sp++;
00493                }
00494             }
00495             row_info->pixel_depth = 48;
00496             row_info->rowbytes = row_width * 6;
00497          }
00498          row_info->channels = 3;
00499       }
00500       else if ((row_info->color_type == PNG_COLOR_TYPE_GRAY ||
00501          (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
00502          (flags & PNG_FLAG_STRIP_ALPHA))) &&
00503           row_info->channels == 2)
00504       {
00505          if (row_info->bit_depth == 8)
00506          {
00507             /* This converts from GX or GA to G */
00508             if (flags & PNG_FLAG_FILLER_AFTER)
00509             {
00510                for (i = 0; i < row_width; i++)
00511                {
00512                   *dp++ = *sp++;
00513                   sp++;
00514                }
00515             }
00516             /* This converts from XG or AG to G */
00517             else
00518             {
00519                for (i = 0; i < row_width; i++)
00520                {
00521                   sp++;
00522                   *dp++ = *sp++;
00523                }
00524             }
00525             row_info->pixel_depth = 8;
00526             row_info->rowbytes = row_width;
00527          }
00528          else /* if (row_info->bit_depth == 16) */
00529          {
00530             if (flags & PNG_FLAG_FILLER_AFTER)
00531             {
00532                /* This converts from GGXX or GGAA to GG */
00533                sp += 4; dp += 2;
00534                for (i = 1; i < row_width; i++)
00535                {
00536                   *dp++ = *sp++;
00537                   *dp++ = *sp++;
00538                   sp += 2;
00539                }
00540             }
00541             else
00542             {
00543                /* This converts from XXGG or AAGG to GG */
00544                for (i = 0; i < row_width; i++)
00545                {
00546                   sp += 2;
00547                   *dp++ = *sp++;
00548                   *dp++ = *sp++;
00549                }
00550             }
00551             row_info->pixel_depth = 16;
00552             row_info->rowbytes = row_width * 2;
00553          }
00554          row_info->channels = 1;
00555       }
00556       if (flags & PNG_FLAG_STRIP_ALPHA)
00557         row_info->color_type &= ~PNG_COLOR_MASK_ALPHA;
00558    }
00559 }
00560 #endif
00561 
00562 #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
00563 /* Swaps red and blue bytes within a pixel */
00564 void /* PRIVATE */
00565 png_do_bgr(png_row_infop row_info, png_bytep row)
00566 {
00567    png_debug(1, "in png_do_bgr");
00568    if (
00569 #if defined(PNG_USELESS_TESTS_SUPPORTED)
00570        row != NULL && row_info != NULL &&
00571 #endif
00572        (row_info->color_type & PNG_COLOR_MASK_COLOR))
00573    {
00574       png_uint_32 row_width = row_info->width;
00575       if (row_info->bit_depth == 8)
00576       {
00577          if (row_info->color_type == PNG_COLOR_TYPE_RGB)
00578          {
00579             png_bytep rp;
00580             png_uint_32 i;
00581 
00582             for (i = 0, rp = row; i < row_width; i++, rp += 3)
00583             {
00584                png_byte save = *rp;
00585                *rp = *(rp + 2);
00586                *(rp + 2) = save;
00587             }
00588          }
00589          else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
00590          {
00591             png_bytep rp;
00592             png_uint_32 i;
00593 
00594             for (i = 0, rp = row; i < row_width; i++, rp += 4)
00595             {
00596                png_byte save = *rp;
00597                *rp = *(rp + 2);
00598                *(rp + 2) = save;
00599             }
00600          }
00601       }
00602       else if (row_info->bit_depth == 16)
00603       {
00604          if (row_info->color_type == PNG_COLOR_TYPE_RGB)
00605          {
00606             png_bytep rp;
00607             png_uint_32 i;
00608 
00609             for (i = 0, rp = row; i < row_width; i++, rp += 6)
00610             {
00611                png_byte save = *rp;
00612                *rp = *(rp + 4);
00613                *(rp + 4) = save;
00614                save = *(rp + 1);
00615                *(rp + 1) = *(rp + 5);
00616                *(rp + 5) = save;
00617             }
00618          }
00619          else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
00620          {
00621             png_bytep rp;
00622             png_uint_32 i;
00623 
00624             for (i = 0, rp = row; i < row_width; i++, rp += 8)
00625             {
00626                png_byte save = *rp;
00627                *rp = *(rp + 4);
00628                *(rp + 4) = save;
00629                save = *(rp + 1);
00630                *(rp + 1) = *(rp + 5);
00631                *(rp + 5) = save;
00632             }
00633          }
00634       }
00635    }
00636 }
00637 #endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */
00638 
00639 #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
00640     defined(PNG_LEGACY_SUPPORTED) || \
00641     defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
00642 void PNGAPI
00643 png_set_user_transform_info(png_structp png_ptr, png_voidp
00644    user_transform_ptr, int user_transform_depth, int user_transform_channels)
00645 {
00646    png_debug(1, "in png_set_user_transform_info");
00647    if (png_ptr == NULL)
00648       return;
00649 #if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
00650    png_ptr->user_transform_ptr = user_transform_ptr;
00651    png_ptr->user_transform_depth = (png_byte)user_transform_depth;
00652    png_ptr->user_transform_channels = (png_byte)user_transform_channels;
00653 #else
00654    if (user_transform_ptr || user_transform_depth || user_transform_channels)
00655       png_warning(png_ptr,
00656         "This version of libpng does not support user transform info");
00657 #endif
00658 }
00659 #endif
00660 
00661 /* This function returns a pointer to the user_transform_ptr associated with
00662  * the user transform functions.  The application should free any memory
00663  * associated with this pointer before png_write_destroy and png_read_destroy
00664  * are called.
00665  */
00666 png_voidp PNGAPI
00667 png_get_user_transform_ptr(png_structp png_ptr)
00668 {
00669    if (png_ptr == NULL)
00670       return (NULL);
00671 #if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
00672    return ((png_voidp)png_ptr->user_transform_ptr);
00673 #else
00674    return (NULL);
00675 #endif
00676 }
00677 #endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */