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