|
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) ![]() |
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 */