ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

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.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.