src/java.desktop/share/native/libsplashscreen/libpng/pngrtran.c
changeset 51304 66d9993dd4ad
parent 48280 791d551bcdb8
child 57618 53154e45385a
equal deleted inserted replaced
51303:0eeff620cdf5 51304:66d9993dd4ad
    27  * This file is available under and governed by the GNU General Public
    27  * This file is available under and governed by the GNU General Public
    28  * License version 2 only, as published by the Free Software Foundation.
    28  * License version 2 only, as published by the Free Software Foundation.
    29  * However, the following notice accompanied the original version of this
    29  * However, the following notice accompanied the original version of this
    30  * file and, per its terms, should not be removed:
    30  * file and, per its terms, should not be removed:
    31  *
    31  *
    32  * Last changed in libpng 1.6.33 [September 28, 2017]
    32  * Last changed in libpng 1.6.35 [July 15, 2018]
    33  * Copyright (c) 1998-2002,2004,2006-2017 Glenn Randers-Pehrson
    33  * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
    34  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
    34  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
    35  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
    35  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
    36  *
    36  *
    37  * This code is released under the libpng license.
    37  * This code is released under the libpng license.
    38  * For conditions of distribution and use, see the disclaimer
    38  * For conditions of distribution and use, see the disclaimer
   318     * is expected to be 1 or greater, but this range test allows for some
   318     * is expected to be 1 or greater, but this range test allows for some
   319     * viewing correction values.  The intent is to weed out users of this API
   319     * viewing correction values.  The intent is to weed out users of this API
   320     * who use the inverse of the gamma value accidentally!  Since some of these
   320     * who use the inverse of the gamma value accidentally!  Since some of these
   321     * values are reasonable this may have to be changed:
   321     * values are reasonable this may have to be changed:
   322     *
   322     *
   323     * 1.6.x: changed from 0.07..3 to 0.01..100 (to accomodate the optimal 16-bit
   323     * 1.6.x: changed from 0.07..3 to 0.01..100 (to accommodate the optimal 16-bit
   324     * gamma of 36, and its reciprocal.)
   324     * gamma of 36, and its reciprocal.)
   325     */
   325     */
   326    if (output_gamma < 1000 || output_gamma > 10000000)
   326    if (output_gamma < 1000 || output_gamma > 10000000)
   327       png_error(png_ptr, "output gamma out of expected range");
   327       png_error(png_ptr, "output gamma out of expected range");
   328 
   328 
   773       int total_bits = PNG_QUANTIZE_RED_BITS + PNG_QUANTIZE_GREEN_BITS +
   773       int total_bits = PNG_QUANTIZE_RED_BITS + PNG_QUANTIZE_GREEN_BITS +
   774           PNG_QUANTIZE_BLUE_BITS;
   774           PNG_QUANTIZE_BLUE_BITS;
   775       int num_red = (1 << PNG_QUANTIZE_RED_BITS);
   775       int num_red = (1 << PNG_QUANTIZE_RED_BITS);
   776       int num_green = (1 << PNG_QUANTIZE_GREEN_BITS);
   776       int num_green = (1 << PNG_QUANTIZE_GREEN_BITS);
   777       int num_blue = (1 << PNG_QUANTIZE_BLUE_BITS);
   777       int num_blue = (1 << PNG_QUANTIZE_BLUE_BITS);
   778       png_size_t num_entries = ((png_size_t)1 << total_bits);
   778       size_t num_entries = ((size_t)1 << total_bits);
   779 
   779 
   780       png_ptr->palette_lookup = (png_bytep)png_calloc(png_ptr,
   780       png_ptr->palette_lookup = (png_bytep)png_calloc(png_ptr,
   781           (png_alloc_size_t)(num_entries * (sizeof (png_byte))));
   781           (png_alloc_size_t)(num_entries * (sizeof (png_byte))));
   782 
   782 
   783       distance = (png_bytep)png_malloc(png_ptr, (png_alloc_size_t)(num_entries *
   783       distance = (png_bytep)png_malloc(png_ptr, (png_alloc_size_t)(num_entries *
  1343             png_ptr->screen_gamma = png_reciprocal(png_ptr->colorspace.gamma);
  1343             png_ptr->screen_gamma = png_reciprocal(png_ptr->colorspace.gamma);
  1344       }
  1344       }
  1345 
  1345 
  1346       else if (png_ptr->screen_gamma != 0)
  1346       else if (png_ptr->screen_gamma != 0)
  1347          /* The converse - assume the file matches the screen, note that this
  1347          /* The converse - assume the file matches the screen, note that this
  1348           * perhaps undesireable default can (from 1.5.4) be changed by calling
  1348           * perhaps undesirable default can (from 1.5.4) be changed by calling
  1349           * png_set_alpha_mode (even if the alpha handling mode isn't required
  1349           * png_set_alpha_mode (even if the alpha handling mode isn't required
  1350           * or isn't changed from the default.)
  1350           * or isn't changed from the default.)
  1351           */
  1351           */
  1352          png_ptr->colorspace.gamma = png_reciprocal(png_ptr->screen_gamma);
  1352          png_ptr->colorspace.gamma = png_reciprocal(png_ptr->screen_gamma);
  1353 
  1353 
  1911       int istop = png_ptr->num_palette;
  1911       int istop = png_ptr->num_palette;
  1912       int shift = 8 - png_ptr->sig_bit.red;
  1912       int shift = 8 - png_ptr->sig_bit.red;
  1913 
  1913 
  1914       png_ptr->transformations &= ~PNG_SHIFT;
  1914       png_ptr->transformations &= ~PNG_SHIFT;
  1915 
  1915 
  1916       /* significant bits can be in the range 1 to 7 for a meaninful result, if
  1916       /* significant bits can be in the range 1 to 7 for a meaningful result, if
  1917        * the number of significant bits is 0 then no shift is done (this is an
  1917        * the number of significant bits is 0 then no shift is done (this is an
  1918        * error condition which is silently ignored.)
  1918        * error condition which is silently ignored.)
  1919        */
  1919        */
  1920       if (shift > 0 && shift < 8)
  1920       if (shift > 0 && shift < 8)
  1921          for (i=0; i<istop; ++i)
  1921          for (i=0; i<istop; ++i)
  2177 
  2177 
  2178       switch (row_info->bit_depth)
  2178       switch (row_info->bit_depth)
  2179       {
  2179       {
  2180          case 1:
  2180          case 1:
  2181          {
  2181          {
  2182             png_bytep sp = row + (png_size_t)((row_width - 1) >> 3);
  2182             png_bytep sp = row + (size_t)((row_width - 1) >> 3);
  2183             png_bytep dp = row + (png_size_t)row_width - 1;
  2183             png_bytep dp = row + (size_t)row_width - 1;
  2184             png_uint_32 shift = 7U - ((row_width + 7U) & 0x07);
  2184             png_uint_32 shift = 7U - ((row_width + 7U) & 0x07);
  2185             for (i = 0; i < row_width; i++)
  2185             for (i = 0; i < row_width; i++)
  2186             {
  2186             {
  2187                *dp = (png_byte)((*sp >> shift) & 0x01);
  2187                *dp = (png_byte)((*sp >> shift) & 0x01);
  2188 
  2188 
  2201          }
  2201          }
  2202 
  2202 
  2203          case 2:
  2203          case 2:
  2204          {
  2204          {
  2205 
  2205 
  2206             png_bytep sp = row + (png_size_t)((row_width - 1) >> 2);
  2206             png_bytep sp = row + (size_t)((row_width - 1) >> 2);
  2207             png_bytep dp = row + (png_size_t)row_width - 1;
  2207             png_bytep dp = row + (size_t)row_width - 1;
  2208             png_uint_32 shift = ((3U - ((row_width + 3U) & 0x03)) << 1);
  2208             png_uint_32 shift = ((3U - ((row_width + 3U) & 0x03)) << 1);
  2209             for (i = 0; i < row_width; i++)
  2209             for (i = 0; i < row_width; i++)
  2210             {
  2210             {
  2211                *dp = (png_byte)((*sp >> shift) & 0x03);
  2211                *dp = (png_byte)((*sp >> shift) & 0x03);
  2212 
  2212 
  2224             break;
  2224             break;
  2225          }
  2225          }
  2226 
  2226 
  2227          case 4:
  2227          case 4:
  2228          {
  2228          {
  2229             png_bytep sp = row + (png_size_t)((row_width - 1) >> 1);
  2229             png_bytep sp = row + (size_t)((row_width - 1) >> 1);
  2230             png_bytep dp = row + (png_size_t)row_width - 1;
  2230             png_bytep dp = row + (size_t)row_width - 1;
  2231             png_uint_32 shift = ((1U - ((row_width + 1U) & 0x01)) << 2);
  2231             png_uint_32 shift = ((1U - ((row_width + 1U) & 0x01)) << 2);
  2232             for (i = 0; i < row_width; i++)
  2232             for (i = 0; i < row_width; i++)
  2233             {
  2233             {
  2234                *dp = (png_byte)((*sp >> shift) & 0x0f);
  2234                *dp = (png_byte)((*sp >> shift) & 0x0f);
  2235 
  2235 
  2489 
  2489 
  2490 #ifdef PNG_READ_SWAP_ALPHA_SUPPORTED
  2490 #ifdef PNG_READ_SWAP_ALPHA_SUPPORTED
  2491 static void
  2491 static void
  2492 png_do_read_swap_alpha(png_row_infop row_info, png_bytep row)
  2492 png_do_read_swap_alpha(png_row_infop row_info, png_bytep row)
  2493 {
  2493 {
       
  2494    png_uint_32 row_width = row_info->width;
       
  2495 
  2494    png_debug(1, "in png_do_read_swap_alpha");
  2496    png_debug(1, "in png_do_read_swap_alpha");
  2495 
  2497 
  2496    {
  2498    if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
  2497       png_uint_32 row_width = row_info->width;
  2499    {
  2498       if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
  2500       /* This converts from RGBA to ARGB */
  2499       {
  2501       if (row_info->bit_depth == 8)
  2500          /* This converts from RGBA to ARGB */
  2502       {
  2501          if (row_info->bit_depth == 8)
  2503          png_bytep sp = row + row_info->rowbytes;
  2502          {
  2504          png_bytep dp = sp;
  2503             png_bytep sp = row + row_info->rowbytes;
  2505          png_byte save;
  2504             png_bytep dp = sp;
  2506          png_uint_32 i;
  2505             png_byte save;
  2507 
  2506             png_uint_32 i;
  2508          for (i = 0; i < row_width; i++)
  2507 
  2509          {
  2508             for (i = 0; i < row_width; i++)
  2510             save = *(--sp);
  2509             {
  2511             *(--dp) = *(--sp);
  2510                save = *(--sp);
  2512             *(--dp) = *(--sp);
  2511                *(--dp) = *(--sp);
  2513             *(--dp) = *(--sp);
  2512                *(--dp) = *(--sp);
  2514             *(--dp) = save;
  2513                *(--dp) = *(--sp);
  2515          }
  2514                *(--dp) = save;
  2516       }
  2515             }
       
  2516          }
       
  2517 
  2517 
  2518 #ifdef PNG_READ_16BIT_SUPPORTED
  2518 #ifdef PNG_READ_16BIT_SUPPORTED
  2519          /* This converts from RRGGBBAA to AARRGGBB */
  2519       /* This converts from RRGGBBAA to AARRGGBB */
  2520          else
  2520       else
  2521          {
  2521       {
  2522             png_bytep sp = row + row_info->rowbytes;
  2522          png_bytep sp = row + row_info->rowbytes;
  2523             png_bytep dp = sp;
  2523          png_bytep dp = sp;
  2524             png_byte save[2];
  2524          png_byte save[2];
  2525             png_uint_32 i;
  2525          png_uint_32 i;
  2526 
  2526 
  2527             for (i = 0; i < row_width; i++)
  2527          for (i = 0; i < row_width; i++)
  2528             {
  2528          {
  2529                save[0] = *(--sp);
  2529             save[0] = *(--sp);
  2530                save[1] = *(--sp);
  2530             save[1] = *(--sp);
  2531                *(--dp) = *(--sp);
  2531             *(--dp) = *(--sp);
  2532                *(--dp) = *(--sp);
  2532             *(--dp) = *(--sp);
  2533                *(--dp) = *(--sp);
  2533             *(--dp) = *(--sp);
  2534                *(--dp) = *(--sp);
  2534             *(--dp) = *(--sp);
  2535                *(--dp) = *(--sp);
  2535             *(--dp) = *(--sp);
  2536                *(--dp) = *(--sp);
  2536             *(--dp) = *(--sp);
  2537                *(--dp) = save[0];
  2537             *(--dp) = save[0];
  2538                *(--dp) = save[1];
  2538             *(--dp) = save[1];
  2539             }
  2539          }
  2540          }
  2540       }
  2541 #endif
  2541 #endif
  2542       }
  2542    }
  2543 
  2543 
  2544       else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
  2544    else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
  2545       {
  2545    {
  2546          /* This converts from GA to AG */
  2546       /* This converts from GA to AG */
  2547          if (row_info->bit_depth == 8)
  2547       if (row_info->bit_depth == 8)
  2548          {
  2548       {
  2549             png_bytep sp = row + row_info->rowbytes;
  2549          png_bytep sp = row + row_info->rowbytes;
  2550             png_bytep dp = sp;
  2550          png_bytep dp = sp;
  2551             png_byte save;
  2551          png_byte save;
  2552             png_uint_32 i;
  2552          png_uint_32 i;
  2553 
  2553 
  2554             for (i = 0; i < row_width; i++)
  2554          for (i = 0; i < row_width; i++)
  2555             {
  2555          {
  2556                save = *(--sp);
  2556             save = *(--sp);
  2557                *(--dp) = *(--sp);
  2557             *(--dp) = *(--sp);
  2558                *(--dp) = save;
  2558             *(--dp) = save;
  2559             }
  2559          }
  2560          }
  2560       }
  2561 
  2561 
  2562 #ifdef PNG_READ_16BIT_SUPPORTED
  2562 #ifdef PNG_READ_16BIT_SUPPORTED
  2563          /* This converts from GGAA to AAGG */
  2563       /* This converts from GGAA to AAGG */
  2564          else
  2564       else
  2565          {
  2565       {
  2566             png_bytep sp = row + row_info->rowbytes;
  2566          png_bytep sp = row + row_info->rowbytes;
  2567             png_bytep dp = sp;
  2567          png_bytep dp = sp;
  2568             png_byte save[2];
  2568          png_byte save[2];
  2569             png_uint_32 i;
  2569          png_uint_32 i;
  2570 
  2570 
  2571             for (i = 0; i < row_width; i++)
  2571          for (i = 0; i < row_width; i++)
  2572             {
  2572          {
  2573                save[0] = *(--sp);
  2573             save[0] = *(--sp);
  2574                save[1] = *(--sp);
  2574             save[1] = *(--sp);
  2575                *(--dp) = *(--sp);
  2575             *(--dp) = *(--sp);
  2576                *(--dp) = *(--sp);
  2576             *(--dp) = *(--sp);
  2577                *(--dp) = save[0];
  2577             *(--dp) = save[0];
  2578                *(--dp) = save[1];
  2578             *(--dp) = save[1];
  2579             }
  2579          }
  2580          }
  2580       }
  2581 #endif
  2581 #endif
  2582       }
       
  2583    }
  2582    }
  2584 }
  2583 }
  2585 #endif
  2584 #endif
  2586 
  2585 
  2587 #ifdef PNG_READ_INVERT_ALPHA_SUPPORTED
  2586 #ifdef PNG_READ_INVERT_ALPHA_SUPPORTED
  2707       if (row_info->bit_depth == 8)
  2706       if (row_info->bit_depth == 8)
  2708       {
  2707       {
  2709          if ((flags & PNG_FLAG_FILLER_AFTER) != 0)
  2708          if ((flags & PNG_FLAG_FILLER_AFTER) != 0)
  2710          {
  2709          {
  2711             /* This changes the data from G to GX */
  2710             /* This changes the data from G to GX */
  2712             png_bytep sp = row + (png_size_t)row_width;
  2711             png_bytep sp = row + (size_t)row_width;
  2713             png_bytep dp =  sp + (png_size_t)row_width;
  2712             png_bytep dp =  sp + (size_t)row_width;
  2714             for (i = 1; i < row_width; i++)
  2713             for (i = 1; i < row_width; i++)
  2715             {
  2714             {
  2716                *(--dp) = lo_filler;
  2715                *(--dp) = lo_filler;
  2717                *(--dp) = *(--sp);
  2716                *(--dp) = *(--sp);
  2718             }
  2717             }
  2723          }
  2722          }
  2724 
  2723 
  2725          else
  2724          else
  2726          {
  2725          {
  2727             /* This changes the data from G to XG */
  2726             /* This changes the data from G to XG */
  2728             png_bytep sp = row + (png_size_t)row_width;
  2727             png_bytep sp = row + (size_t)row_width;
  2729             png_bytep dp = sp  + (png_size_t)row_width;
  2728             png_bytep dp = sp  + (size_t)row_width;
  2730             for (i = 0; i < row_width; i++)
  2729             for (i = 0; i < row_width; i++)
  2731             {
  2730             {
  2732                *(--dp) = *(--sp);
  2731                *(--dp) = *(--sp);
  2733                *(--dp) = lo_filler;
  2732                *(--dp) = lo_filler;
  2734             }
  2733             }
  2742       else if (row_info->bit_depth == 16)
  2741       else if (row_info->bit_depth == 16)
  2743       {
  2742       {
  2744          if ((flags & PNG_FLAG_FILLER_AFTER) != 0)
  2743          if ((flags & PNG_FLAG_FILLER_AFTER) != 0)
  2745          {
  2744          {
  2746             /* This changes the data from GG to GGXX */
  2745             /* This changes the data from GG to GGXX */
  2747             png_bytep sp = row + (png_size_t)row_width * 2;
  2746             png_bytep sp = row + (size_t)row_width * 2;
  2748             png_bytep dp = sp  + (png_size_t)row_width * 2;
  2747             png_bytep dp = sp  + (size_t)row_width * 2;
  2749             for (i = 1; i < row_width; i++)
  2748             for (i = 1; i < row_width; i++)
  2750             {
  2749             {
  2751                *(--dp) = lo_filler;
  2750                *(--dp) = lo_filler;
  2752                *(--dp) = hi_filler;
  2751                *(--dp) = hi_filler;
  2753                *(--dp) = *(--sp);
  2752                *(--dp) = *(--sp);
  2761          }
  2760          }
  2762 
  2761 
  2763          else
  2762          else
  2764          {
  2763          {
  2765             /* This changes the data from GG to XXGG */
  2764             /* This changes the data from GG to XXGG */
  2766             png_bytep sp = row + (png_size_t)row_width * 2;
  2765             png_bytep sp = row + (size_t)row_width * 2;
  2767             png_bytep dp = sp  + (png_size_t)row_width * 2;
  2766             png_bytep dp = sp  + (size_t)row_width * 2;
  2768             for (i = 0; i < row_width; i++)
  2767             for (i = 0; i < row_width; i++)
  2769             {
  2768             {
  2770                *(--dp) = *(--sp);
  2769                *(--dp) = *(--sp);
  2771                *(--dp) = *(--sp);
  2770                *(--dp) = *(--sp);
  2772                *(--dp) = lo_filler;
  2771                *(--dp) = lo_filler;
  2784       if (row_info->bit_depth == 8)
  2783       if (row_info->bit_depth == 8)
  2785       {
  2784       {
  2786          if ((flags & PNG_FLAG_FILLER_AFTER) != 0)
  2785          if ((flags & PNG_FLAG_FILLER_AFTER) != 0)
  2787          {
  2786          {
  2788             /* This changes the data from RGB to RGBX */
  2787             /* This changes the data from RGB to RGBX */
  2789             png_bytep sp = row + (png_size_t)row_width * 3;
  2788             png_bytep sp = row + (size_t)row_width * 3;
  2790             png_bytep dp = sp  + (png_size_t)row_width;
  2789             png_bytep dp = sp  + (size_t)row_width;
  2791             for (i = 1; i < row_width; i++)
  2790             for (i = 1; i < row_width; i++)
  2792             {
  2791             {
  2793                *(--dp) = lo_filler;
  2792                *(--dp) = lo_filler;
  2794                *(--dp) = *(--sp);
  2793                *(--dp) = *(--sp);
  2795                *(--dp) = *(--sp);
  2794                *(--dp) = *(--sp);
  2802          }
  2801          }
  2803 
  2802 
  2804          else
  2803          else
  2805          {
  2804          {
  2806             /* This changes the data from RGB to XRGB */
  2805             /* This changes the data from RGB to XRGB */
  2807             png_bytep sp = row + (png_size_t)row_width * 3;
  2806             png_bytep sp = row + (size_t)row_width * 3;
  2808             png_bytep dp = sp + (png_size_t)row_width;
  2807             png_bytep dp = sp + (size_t)row_width;
  2809             for (i = 0; i < row_width; i++)
  2808             for (i = 0; i < row_width; i++)
  2810             {
  2809             {
  2811                *(--dp) = *(--sp);
  2810                *(--dp) = *(--sp);
  2812                *(--dp) = *(--sp);
  2811                *(--dp) = *(--sp);
  2813                *(--dp) = *(--sp);
  2812                *(--dp) = *(--sp);
  2823       else if (row_info->bit_depth == 16)
  2822       else if (row_info->bit_depth == 16)
  2824       {
  2823       {
  2825          if ((flags & PNG_FLAG_FILLER_AFTER) != 0)
  2824          if ((flags & PNG_FLAG_FILLER_AFTER) != 0)
  2826          {
  2825          {
  2827             /* This changes the data from RRGGBB to RRGGBBXX */
  2826             /* This changes the data from RRGGBB to RRGGBBXX */
  2828             png_bytep sp = row + (png_size_t)row_width * 6;
  2827             png_bytep sp = row + (size_t)row_width * 6;
  2829             png_bytep dp = sp  + (png_size_t)row_width * 2;
  2828             png_bytep dp = sp  + (size_t)row_width * 2;
  2830             for (i = 1; i < row_width; i++)
  2829             for (i = 1; i < row_width; i++)
  2831             {
  2830             {
  2832                *(--dp) = lo_filler;
  2831                *(--dp) = lo_filler;
  2833                *(--dp) = hi_filler;
  2832                *(--dp) = hi_filler;
  2834                *(--dp) = *(--sp);
  2833                *(--dp) = *(--sp);
  2846          }
  2845          }
  2847 
  2846 
  2848          else
  2847          else
  2849          {
  2848          {
  2850             /* This changes the data from RRGGBB to XXRRGGBB */
  2849             /* This changes the data from RRGGBB to XXRRGGBB */
  2851             png_bytep sp = row + (png_size_t)row_width * 6;
  2850             png_bytep sp = row + (size_t)row_width * 6;
  2852             png_bytep dp = sp  + (png_size_t)row_width * 2;
  2851             png_bytep dp = sp  + (size_t)row_width * 2;
  2853             for (i = 0; i < row_width; i++)
  2852             for (i = 0; i < row_width; i++)
  2854             {
  2853             {
  2855                *(--dp) = *(--sp);
  2854                *(--dp) = *(--sp);
  2856                *(--dp) = *(--sp);
  2855                *(--dp) = *(--sp);
  2857                *(--dp) = *(--sp);
  2856                *(--dp) = *(--sp);
  2888       if (row_info->color_type == PNG_COLOR_TYPE_GRAY)
  2887       if (row_info->color_type == PNG_COLOR_TYPE_GRAY)
  2889       {
  2888       {
  2890          if (row_info->bit_depth == 8)
  2889          if (row_info->bit_depth == 8)
  2891          {
  2890          {
  2892             /* This changes G to RGB */
  2891             /* This changes G to RGB */
  2893             png_bytep sp = row + (png_size_t)row_width - 1;
  2892             png_bytep sp = row + (size_t)row_width - 1;
  2894             png_bytep dp = sp  + (png_size_t)row_width * 2;
  2893             png_bytep dp = sp  + (size_t)row_width * 2;
  2895             for (i = 0; i < row_width; i++)
  2894             for (i = 0; i < row_width; i++)
  2896             {
  2895             {
  2897                *(dp--) = *sp;
  2896                *(dp--) = *sp;
  2898                *(dp--) = *sp;
  2897                *(dp--) = *sp;
  2899                *(dp--) = *(sp--);
  2898                *(dp--) = *(sp--);
  2901          }
  2900          }
  2902 
  2901 
  2903          else
  2902          else
  2904          {
  2903          {
  2905             /* This changes GG to RRGGBB */
  2904             /* This changes GG to RRGGBB */
  2906             png_bytep sp = row + (png_size_t)row_width * 2 - 1;
  2905             png_bytep sp = row + (size_t)row_width * 2 - 1;
  2907             png_bytep dp = sp  + (png_size_t)row_width * 4;
  2906             png_bytep dp = sp  + (size_t)row_width * 4;
  2908             for (i = 0; i < row_width; i++)
  2907             for (i = 0; i < row_width; i++)
  2909             {
  2908             {
  2910                *(dp--) = *sp;
  2909                *(dp--) = *sp;
  2911                *(dp--) = *(sp - 1);
  2910                *(dp--) = *(sp - 1);
  2912                *(dp--) = *sp;
  2911                *(dp--) = *sp;
  2920       else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
  2919       else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
  2921       {
  2920       {
  2922          if (row_info->bit_depth == 8)
  2921          if (row_info->bit_depth == 8)
  2923          {
  2922          {
  2924             /* This changes GA to RGBA */
  2923             /* This changes GA to RGBA */
  2925             png_bytep sp = row + (png_size_t)row_width * 2 - 1;
  2924             png_bytep sp = row + (size_t)row_width * 2 - 1;
  2926             png_bytep dp = sp  + (png_size_t)row_width * 2;
  2925             png_bytep dp = sp  + (size_t)row_width * 2;
  2927             for (i = 0; i < row_width; i++)
  2926             for (i = 0; i < row_width; i++)
  2928             {
  2927             {
  2929                *(dp--) = *(sp--);
  2928                *(dp--) = *(sp--);
  2930                *(dp--) = *sp;
  2929                *(dp--) = *sp;
  2931                *(dp--) = *sp;
  2930                *(dp--) = *sp;
  2934          }
  2933          }
  2935 
  2934 
  2936          else
  2935          else
  2937          {
  2936          {
  2938             /* This changes GGAA to RRGGBBAA */
  2937             /* This changes GGAA to RRGGBBAA */
  2939             png_bytep sp = row + (png_size_t)row_width * 4 - 1;
  2938             png_bytep sp = row + (size_t)row_width * 4 - 1;
  2940             png_bytep dp = sp  + (png_size_t)row_width * 4;
  2939             png_bytep dp = sp  + (size_t)row_width * 4;
  2941             for (i = 0; i < row_width; i++)
  2940             for (i = 0; i < row_width; i++)
  2942             {
  2941             {
  2943                *(dp--) = *(sp--);
  2942                *(dp--) = *(sp--);
  2944                *(dp--) = *(sp--);
  2943                *(dp--) = *(sp--);
  2945                *(dp--) = *sp;
  2944                *(dp--) = *sp;
  3006  *  In all cases the calculation is to be done in a linear colorspace.  If no
  3005  *  In all cases the calculation is to be done in a linear colorspace.  If no
  3007  *  gamma information is available to correct the encoding of the original RGB
  3006  *  gamma information is available to correct the encoding of the original RGB
  3008  *  values this results in an implicit assumption that the original PNG RGB
  3007  *  values this results in an implicit assumption that the original PNG RGB
  3009  *  values were linear.
  3008  *  values were linear.
  3010  *
  3009  *
  3011  *  Other integer coefficents can be used via png_set_rgb_to_gray().  Because
  3010  *  Other integer coefficients can be used via png_set_rgb_to_gray().  Because
  3012  *  the API takes just red and green coefficients the blue coefficient is
  3011  *  the API takes just red and green coefficients the blue coefficient is
  3013  *  calculated to make the sum 32768.  This will result in different rounding
  3012  *  calculated to make the sum 32768.  This will result in different rounding
  3014  *  to that used above.
  3013  *  to that used above.
  3015  */
  3014  */
  3016 static int
  3015 static int
  3235    png_uint_32 row_width = row_info->width;
  3234    png_uint_32 row_width = row_info->width;
  3236    int shift;
  3235    int shift;
  3237 
  3236 
  3238    png_debug(1, "in png_do_compose");
  3237    png_debug(1, "in png_do_compose");
  3239 
  3238 
  3240    {
  3239    switch (row_info->color_type)
  3241       switch (row_info->color_type)
  3240    {
  3242       {
  3241       case PNG_COLOR_TYPE_GRAY:
  3243          case PNG_COLOR_TYPE_GRAY:
  3242       {
  3244          {
  3243          switch (row_info->bit_depth)
  3245             switch (row_info->bit_depth)
  3244          {
  3246             {
  3245             case 1:
  3247                case 1:
  3246             {
       
  3247                sp = row;
       
  3248                shift = 7;
       
  3249                for (i = 0; i < row_width; i++)
       
  3250                {
       
  3251                   if ((png_uint_16)((*sp >> shift) & 0x01)
       
  3252                      == png_ptr->trans_color.gray)
       
  3253                   {
       
  3254                      unsigned int tmp = *sp & (0x7f7f >> (7 - shift));
       
  3255                      tmp |=
       
  3256                          (unsigned int)(png_ptr->background.gray << shift);
       
  3257                      *sp = (png_byte)(tmp & 0xff);
       
  3258                   }
       
  3259 
       
  3260                   if (shift == 0)
       
  3261                   {
       
  3262                      shift = 7;
       
  3263                      sp++;
       
  3264                   }
       
  3265 
       
  3266                   else
       
  3267                      shift--;
       
  3268                }
       
  3269                break;
       
  3270             }
       
  3271 
       
  3272             case 2:
       
  3273             {
       
  3274 #ifdef PNG_READ_GAMMA_SUPPORTED
       
  3275                if (gamma_table != NULL)
  3248                {
  3276                {
  3249                   sp = row;
  3277                   sp = row;
  3250                   shift = 7;
  3278                   shift = 6;
  3251                   for (i = 0; i < row_width; i++)
  3279                   for (i = 0; i < row_width; i++)
  3252                   {
  3280                   {
  3253                      if ((png_uint_16)((*sp >> shift) & 0x01)
  3281                      if ((png_uint_16)((*sp >> shift) & 0x03)
  3254                         == png_ptr->trans_color.gray)
  3282                          == png_ptr->trans_color.gray)
  3255                      {
  3283                      {
  3256                         unsigned int tmp = *sp & (0x7f7f >> (7 - shift));
  3284                         unsigned int tmp = *sp & (0x3f3f >> (6 - shift));
  3257                         tmp |=
  3285                         tmp |=
  3258                             (unsigned int)(png_ptr->background.gray << shift);
  3286                            (unsigned int)png_ptr->background.gray << shift;
  3259                         *sp = (png_byte)(tmp & 0xff);
  3287                         *sp = (png_byte)(tmp & 0xff);
  3260                      }
  3288                      }
  3261 
  3289 
       
  3290                      else
       
  3291                      {
       
  3292                         unsigned int p = (*sp >> shift) & 0x03;
       
  3293                         unsigned int g = (gamma_table [p | (p << 2) |
       
  3294                             (p << 4) | (p << 6)] >> 6) & 0x03;
       
  3295                         unsigned int tmp = *sp & (0x3f3f >> (6 - shift));
       
  3296                         tmp |= (unsigned int)(g << shift);
       
  3297                         *sp = (png_byte)(tmp & 0xff);
       
  3298                      }
       
  3299 
  3262                      if (shift == 0)
  3300                      if (shift == 0)
  3263                      {
  3301                      {
  3264                         shift = 7;
  3302                         shift = 6;
  3265                         sp++;
  3303                         sp++;
  3266                      }
  3304                      }
  3267 
  3305 
  3268                      else
  3306                      else
  3269                         shift--;
  3307                         shift -= 2;
  3270                   }
  3308                   }
  3271                   break;
  3309                }
  3272                }
  3310 
  3273 
  3311                else
  3274                case 2:
  3312 #endif
  3275                {
  3313                {
  3276 #ifdef PNG_READ_GAMMA_SUPPORTED
  3314                   sp = row;
  3277                   if (gamma_table != NULL)
  3315                   shift = 6;
       
  3316                   for (i = 0; i < row_width; i++)
  3278                   {
  3317                   {
  3279                      sp = row;
  3318                      if ((png_uint_16)((*sp >> shift) & 0x03)
  3280                      shift = 6;
  3319                          == png_ptr->trans_color.gray)
  3281                      for (i = 0; i < row_width; i++)
       
  3282                      {
  3320                      {
  3283                         if ((png_uint_16)((*sp >> shift) & 0x03)
  3321                         unsigned int tmp = *sp & (0x3f3f >> (6 - shift));
  3284                             == png_ptr->trans_color.gray)
  3322                         tmp |=
  3285                         {
  3323                             (unsigned int)png_ptr->background.gray << shift;
  3286                            unsigned int tmp = *sp & (0x3f3f >> (6 - shift));
  3324                         *sp = (png_byte)(tmp & 0xff);
  3287                            tmp |=
       
  3288                               (unsigned int)png_ptr->background.gray << shift;
       
  3289                            *sp = (png_byte)(tmp & 0xff);
       
  3290                         }
       
  3291 
       
  3292                         else
       
  3293                         {
       
  3294                            unsigned int p = (*sp >> shift) & 0x03;
       
  3295                            unsigned int g = (gamma_table [p | (p << 2) |
       
  3296                                (p << 4) | (p << 6)] >> 6) & 0x03;
       
  3297                            unsigned int tmp = *sp & (0x3f3f >> (6 - shift));
       
  3298                            tmp |= (unsigned int)(g << shift);
       
  3299                            *sp = (png_byte)(tmp & 0xff);
       
  3300                         }
       
  3301 
       
  3302                         if (shift == 0)
       
  3303                         {
       
  3304                            shift = 6;
       
  3305                            sp++;
       
  3306                         }
       
  3307 
       
  3308                         else
       
  3309                            shift -= 2;
       
  3310                      }
  3325                      }
       
  3326 
       
  3327                      if (shift == 0)
       
  3328                      {
       
  3329                         shift = 6;
       
  3330                         sp++;
       
  3331                      }
       
  3332 
       
  3333                      else
       
  3334                         shift -= 2;
  3311                   }
  3335                   }
  3312 
  3336                }
  3313                   else
  3337                break;
  3314 #endif
  3338             }
  3315                   {
  3339 
  3316                      sp = row;
  3340             case 4:
  3317                      shift = 6;
       
  3318                      for (i = 0; i < row_width; i++)
       
  3319                      {
       
  3320                         if ((png_uint_16)((*sp >> shift) & 0x03)
       
  3321                             == png_ptr->trans_color.gray)
       
  3322                         {
       
  3323                            unsigned int tmp = *sp & (0x3f3f >> (6 - shift));
       
  3324                            tmp |=
       
  3325                                (unsigned int)png_ptr->background.gray << shift;
       
  3326                            *sp = (png_byte)(tmp & 0xff);
       
  3327                         }
       
  3328 
       
  3329                         if (shift == 0)
       
  3330                         {
       
  3331                            shift = 6;
       
  3332                            sp++;
       
  3333                         }
       
  3334 
       
  3335                         else
       
  3336                            shift -= 2;
       
  3337                      }
       
  3338                   }
       
  3339                   break;
       
  3340                }
       
  3341 
       
  3342                case 4:
       
  3343                {
       
  3344 #ifdef PNG_READ_GAMMA_SUPPORTED
       
  3345                   if (gamma_table != NULL)
       
  3346                   {
       
  3347                      sp = row;
       
  3348                      shift = 4;
       
  3349                      for (i = 0; i < row_width; i++)
       
  3350                      {
       
  3351                         if ((png_uint_16)((*sp >> shift) & 0x0f)
       
  3352                             == png_ptr->trans_color.gray)
       
  3353                         {
       
  3354                            unsigned int tmp = *sp & (0x0f0f >> (4 - shift));
       
  3355                            tmp |=
       
  3356                               (unsigned int)(png_ptr->background.gray << shift);
       
  3357                            *sp = (png_byte)(tmp & 0xff);
       
  3358                         }
       
  3359 
       
  3360                         else
       
  3361                         {
       
  3362                            unsigned int p = (*sp >> shift) & 0x0f;
       
  3363                            unsigned int g = (gamma_table[p | (p << 4)] >> 4) &
       
  3364                               0x0f;
       
  3365                            unsigned int tmp = *sp & (0x0f0f >> (4 - shift));
       
  3366                            tmp |= (unsigned int)(g << shift);
       
  3367                            *sp = (png_byte)(tmp & 0xff);
       
  3368                         }
       
  3369 
       
  3370                         if (shift == 0)
       
  3371                         {
       
  3372                            shift = 4;
       
  3373                            sp++;
       
  3374                         }
       
  3375 
       
  3376                         else
       
  3377                            shift -= 4;
       
  3378                      }
       
  3379                   }
       
  3380 
       
  3381                   else
       
  3382 #endif
       
  3383                   {
       
  3384                      sp = row;
       
  3385                      shift = 4;
       
  3386                      for (i = 0; i < row_width; i++)
       
  3387                      {
       
  3388                         if ((png_uint_16)((*sp >> shift) & 0x0f)
       
  3389                             == png_ptr->trans_color.gray)
       
  3390                         {
       
  3391                            unsigned int tmp = *sp & (0x0f0f >> (4 - shift));
       
  3392                            tmp |=
       
  3393                               (unsigned int)(png_ptr->background.gray << shift);
       
  3394                            *sp = (png_byte)(tmp & 0xff);
       
  3395                         }
       
  3396 
       
  3397                         if (shift == 0)
       
  3398                         {
       
  3399                            shift = 4;
       
  3400                            sp++;
       
  3401                         }
       
  3402 
       
  3403                         else
       
  3404                            shift -= 4;
       
  3405                      }
       
  3406                   }
       
  3407                   break;
       
  3408                }
       
  3409 
       
  3410                case 8:
       
  3411                {
       
  3412 #ifdef PNG_READ_GAMMA_SUPPORTED
       
  3413                   if (gamma_table != NULL)
       
  3414                   {
       
  3415                      sp = row;
       
  3416                      for (i = 0; i < row_width; i++, sp++)
       
  3417                      {
       
  3418                         if (*sp == png_ptr->trans_color.gray)
       
  3419                            *sp = (png_byte)png_ptr->background.gray;
       
  3420 
       
  3421                         else
       
  3422                            *sp = gamma_table[*sp];
       
  3423                      }
       
  3424                   }
       
  3425                   else
       
  3426 #endif
       
  3427                   {
       
  3428                      sp = row;
       
  3429                      for (i = 0; i < row_width; i++, sp++)
       
  3430                      {
       
  3431                         if (*sp == png_ptr->trans_color.gray)
       
  3432                            *sp = (png_byte)png_ptr->background.gray;
       
  3433                      }
       
  3434                   }
       
  3435                   break;
       
  3436                }
       
  3437 
       
  3438                case 16:
       
  3439                {
       
  3440 #ifdef PNG_READ_GAMMA_SUPPORTED
       
  3441                   if (gamma_16 != NULL)
       
  3442                   {
       
  3443                      sp = row;
       
  3444                      for (i = 0; i < row_width; i++, sp += 2)
       
  3445                      {
       
  3446                         png_uint_16 v;
       
  3447 
       
  3448                         v = (png_uint_16)(((*sp) << 8) + *(sp + 1));
       
  3449 
       
  3450                         if (v == png_ptr->trans_color.gray)
       
  3451                         {
       
  3452                            /* Background is already in screen gamma */
       
  3453                            *sp = (png_byte)((png_ptr->background.gray >> 8)
       
  3454                                 & 0xff);
       
  3455                            *(sp + 1) = (png_byte)(png_ptr->background.gray
       
  3456                                 & 0xff);
       
  3457                         }
       
  3458 
       
  3459                         else
       
  3460                         {
       
  3461                            v = gamma_16[*(sp + 1) >> gamma_shift][*sp];
       
  3462                            *sp = (png_byte)((v >> 8) & 0xff);
       
  3463                            *(sp + 1) = (png_byte)(v & 0xff);
       
  3464                         }
       
  3465                      }
       
  3466                   }
       
  3467                   else
       
  3468 #endif
       
  3469                   {
       
  3470                      sp = row;
       
  3471                      for (i = 0; i < row_width; i++, sp += 2)
       
  3472                      {
       
  3473                         png_uint_16 v;
       
  3474 
       
  3475                         v = (png_uint_16)(((*sp) << 8) + *(sp + 1));
       
  3476 
       
  3477                         if (v == png_ptr->trans_color.gray)
       
  3478                         {
       
  3479                            *sp = (png_byte)((png_ptr->background.gray >> 8)
       
  3480                                 & 0xff);
       
  3481                            *(sp + 1) = (png_byte)(png_ptr->background.gray
       
  3482                                 & 0xff);
       
  3483                         }
       
  3484                      }
       
  3485                   }
       
  3486                   break;
       
  3487                }
       
  3488 
       
  3489                default:
       
  3490                   break;
       
  3491             }
       
  3492             break;
       
  3493          }
       
  3494 
       
  3495          case PNG_COLOR_TYPE_RGB:
       
  3496          {
       
  3497             if (row_info->bit_depth == 8)
       
  3498             {
  3341             {
  3499 #ifdef PNG_READ_GAMMA_SUPPORTED
  3342 #ifdef PNG_READ_GAMMA_SUPPORTED
  3500                if (gamma_table != NULL)
  3343                if (gamma_table != NULL)
  3501                {
  3344                {
  3502                   sp = row;
  3345                   sp = row;
  3503                   for (i = 0; i < row_width; i++, sp += 3)
  3346                   shift = 4;
       
  3347                   for (i = 0; i < row_width; i++)
  3504                   {
  3348                   {
  3505                      if (*sp == png_ptr->trans_color.red &&
  3349                      if ((png_uint_16)((*sp >> shift) & 0x0f)
  3506                          *(sp + 1) == png_ptr->trans_color.green &&
  3350                          == png_ptr->trans_color.gray)
  3507                          *(sp + 2) == png_ptr->trans_color.blue)
       
  3508                      {
  3351                      {
  3509                         *sp = (png_byte)png_ptr->background.red;
  3352                         unsigned int tmp = *sp & (0x0f0f >> (4 - shift));
  3510                         *(sp + 1) = (png_byte)png_ptr->background.green;
  3353                         tmp |=
  3511                         *(sp + 2) = (png_byte)png_ptr->background.blue;
  3354                            (unsigned int)(png_ptr->background.gray << shift);
       
  3355                         *sp = (png_byte)(tmp & 0xff);
  3512                      }
  3356                      }
  3513 
  3357 
  3514                      else
  3358                      else
  3515                      {
  3359                      {
       
  3360                         unsigned int p = (*sp >> shift) & 0x0f;
       
  3361                         unsigned int g = (gamma_table[p | (p << 4)] >> 4) &
       
  3362                            0x0f;
       
  3363                         unsigned int tmp = *sp & (0x0f0f >> (4 - shift));
       
  3364                         tmp |= (unsigned int)(g << shift);
       
  3365                         *sp = (png_byte)(tmp & 0xff);
       
  3366                      }
       
  3367 
       
  3368                      if (shift == 0)
       
  3369                      {
       
  3370                         shift = 4;
       
  3371                         sp++;
       
  3372                      }
       
  3373 
       
  3374                      else
       
  3375                         shift -= 4;
       
  3376                   }
       
  3377                }
       
  3378 
       
  3379                else
       
  3380 #endif
       
  3381                {
       
  3382                   sp = row;
       
  3383                   shift = 4;
       
  3384                   for (i = 0; i < row_width; i++)
       
  3385                   {
       
  3386                      if ((png_uint_16)((*sp >> shift) & 0x0f)
       
  3387                          == png_ptr->trans_color.gray)
       
  3388                      {
       
  3389                         unsigned int tmp = *sp & (0x0f0f >> (4 - shift));
       
  3390                         tmp |=
       
  3391                            (unsigned int)(png_ptr->background.gray << shift);
       
  3392                         *sp = (png_byte)(tmp & 0xff);
       
  3393                      }
       
  3394 
       
  3395                      if (shift == 0)
       
  3396                      {
       
  3397                         shift = 4;
       
  3398                         sp++;
       
  3399                      }
       
  3400 
       
  3401                      else
       
  3402                         shift -= 4;
       
  3403                   }
       
  3404                }
       
  3405                break;
       
  3406             }
       
  3407 
       
  3408             case 8:
       
  3409             {
       
  3410 #ifdef PNG_READ_GAMMA_SUPPORTED
       
  3411                if (gamma_table != NULL)
       
  3412                {
       
  3413                   sp = row;
       
  3414                   for (i = 0; i < row_width; i++, sp++)
       
  3415                   {
       
  3416                      if (*sp == png_ptr->trans_color.gray)
       
  3417                         *sp = (png_byte)png_ptr->background.gray;
       
  3418 
       
  3419                      else
  3516                         *sp = gamma_table[*sp];
  3420                         *sp = gamma_table[*sp];
  3517                         *(sp + 1) = gamma_table[*(sp + 1)];
       
  3518                         *(sp + 2) = gamma_table[*(sp + 2)];
       
  3519                      }
       
  3520                   }
  3421                   }
  3521                }
  3422                }
  3522                else
  3423                else
  3523 #endif
  3424 #endif
  3524                {
  3425                {
  3525                   sp = row;
  3426                   sp = row;
  3526                   for (i = 0; i < row_width; i++, sp += 3)
  3427                   for (i = 0; i < row_width; i++, sp++)
  3527                   {
  3428                   {
  3528                      if (*sp == png_ptr->trans_color.red &&
  3429                      if (*sp == png_ptr->trans_color.gray)
  3529                          *(sp + 1) == png_ptr->trans_color.green &&
  3430                         *sp = (png_byte)png_ptr->background.gray;
  3530                          *(sp + 2) == png_ptr->trans_color.blue)
       
  3531                      {
       
  3532                         *sp = (png_byte)png_ptr->background.red;
       
  3533                         *(sp + 1) = (png_byte)png_ptr->background.green;
       
  3534                         *(sp + 2) = (png_byte)png_ptr->background.blue;
       
  3535                      }
       
  3536                   }
  3431                   }
  3537                }
  3432                }
  3538             }
  3433                break;
  3539             else /* if (row_info->bit_depth == 16) */
  3434             }
       
  3435 
       
  3436             case 16:
  3540             {
  3437             {
  3541 #ifdef PNG_READ_GAMMA_SUPPORTED
  3438 #ifdef PNG_READ_GAMMA_SUPPORTED
  3542                if (gamma_16 != NULL)
  3439                if (gamma_16 != NULL)
  3543                {
       
  3544                   sp = row;
       
  3545                   for (i = 0; i < row_width; i++, sp += 6)
       
  3546                   {
       
  3547                      png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1));
       
  3548 
       
  3549                      png_uint_16 g = (png_uint_16)(((*(sp + 2)) << 8)
       
  3550                          + *(sp + 3));
       
  3551 
       
  3552                      png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8)
       
  3553                          + *(sp + 5));
       
  3554 
       
  3555                      if (r == png_ptr->trans_color.red &&
       
  3556                          g == png_ptr->trans_color.green &&
       
  3557                          b == png_ptr->trans_color.blue)
       
  3558                      {
       
  3559                         /* Background is already in screen gamma */
       
  3560                         *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff);
       
  3561                         *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff);
       
  3562                         *(sp + 2) = (png_byte)((png_ptr->background.green >> 8)
       
  3563                                 & 0xff);
       
  3564                         *(sp + 3) = (png_byte)(png_ptr->background.green
       
  3565                                 & 0xff);
       
  3566                         *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8)
       
  3567                                 & 0xff);
       
  3568                         *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff);
       
  3569                      }
       
  3570 
       
  3571                      else
       
  3572                      {
       
  3573                         png_uint_16 v = gamma_16[*(sp + 1) >> gamma_shift][*sp];
       
  3574                         *sp = (png_byte)((v >> 8) & 0xff);
       
  3575                         *(sp + 1) = (png_byte)(v & 0xff);
       
  3576 
       
  3577                         v = gamma_16[*(sp + 3) >> gamma_shift][*(sp + 2)];
       
  3578                         *(sp + 2) = (png_byte)((v >> 8) & 0xff);
       
  3579                         *(sp + 3) = (png_byte)(v & 0xff);
       
  3580 
       
  3581                         v = gamma_16[*(sp + 5) >> gamma_shift][*(sp + 4)];
       
  3582                         *(sp + 4) = (png_byte)((v >> 8) & 0xff);
       
  3583                         *(sp + 5) = (png_byte)(v & 0xff);
       
  3584                      }
       
  3585                   }
       
  3586                }
       
  3587 
       
  3588                else
       
  3589 #endif
       
  3590                {
       
  3591                   sp = row;
       
  3592                   for (i = 0; i < row_width; i++, sp += 6)
       
  3593                   {
       
  3594                      png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1));
       
  3595 
       
  3596                      png_uint_16 g = (png_uint_16)(((*(sp + 2)) << 8)
       
  3597                          + *(sp + 3));
       
  3598 
       
  3599                      png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8)
       
  3600                          + *(sp + 5));
       
  3601 
       
  3602                      if (r == png_ptr->trans_color.red &&
       
  3603                          g == png_ptr->trans_color.green &&
       
  3604                          b == png_ptr->trans_color.blue)
       
  3605                      {
       
  3606                         *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff);
       
  3607                         *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff);
       
  3608                         *(sp + 2) = (png_byte)((png_ptr->background.green >> 8)
       
  3609                                 & 0xff);
       
  3610                         *(sp + 3) = (png_byte)(png_ptr->background.green
       
  3611                                 & 0xff);
       
  3612                         *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8)
       
  3613                                 & 0xff);
       
  3614                         *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff);
       
  3615                      }
       
  3616                   }
       
  3617                }
       
  3618             }
       
  3619             break;
       
  3620          }
       
  3621 
       
  3622          case PNG_COLOR_TYPE_GRAY_ALPHA:
       
  3623          {
       
  3624             if (row_info->bit_depth == 8)
       
  3625             {
       
  3626 #ifdef PNG_READ_GAMMA_SUPPORTED
       
  3627                if (gamma_to_1 != NULL && gamma_from_1 != NULL &&
       
  3628                    gamma_table != NULL)
       
  3629                {
  3440                {
  3630                   sp = row;
  3441                   sp = row;
  3631                   for (i = 0; i < row_width; i++, sp += 2)
  3442                   for (i = 0; i < row_width; i++, sp += 2)
  3632                   {
  3443                   {
  3633                      png_uint_16 a = *(sp + 1);
  3444                      png_uint_16 v;
  3634 
  3445 
  3635                      if (a == 0xff)
  3446                      v = (png_uint_16)(((*sp) << 8) + *(sp + 1));
  3636                         *sp = gamma_table[*sp];
  3447 
  3637 
  3448                      if (v == png_ptr->trans_color.gray)
  3638                      else if (a == 0)
       
  3639                      {
  3449                      {
  3640                         /* Background is already in screen gamma */
  3450                         /* Background is already in screen gamma */
  3641                         *sp = (png_byte)png_ptr->background.gray;
  3451                         *sp = (png_byte)((png_ptr->background.gray >> 8)
       
  3452                              & 0xff);
       
  3453                         *(sp + 1) = (png_byte)(png_ptr->background.gray
       
  3454                              & 0xff);
  3642                      }
  3455                      }
  3643 
  3456 
  3644                      else
  3457                      else
  3645                      {
  3458                      {
  3646                         png_byte v, w;
       
  3647 
       
  3648                         v = gamma_to_1[*sp];
       
  3649                         png_composite(w, v, a, png_ptr->background_1.gray);
       
  3650                         if (optimize == 0)
       
  3651                            w = gamma_from_1[w];
       
  3652                         *sp = w;
       
  3653                      }
       
  3654                   }
       
  3655                }
       
  3656                else
       
  3657 #endif
       
  3658                {
       
  3659                   sp = row;
       
  3660                   for (i = 0; i < row_width; i++, sp += 2)
       
  3661                   {
       
  3662                      png_byte a = *(sp + 1);
       
  3663 
       
  3664                      if (a == 0)
       
  3665                         *sp = (png_byte)png_ptr->background.gray;
       
  3666 
       
  3667                      else if (a < 0xff)
       
  3668                         png_composite(*sp, *sp, a, png_ptr->background.gray);
       
  3669                   }
       
  3670                }
       
  3671             }
       
  3672             else /* if (png_ptr->bit_depth == 16) */
       
  3673             {
       
  3674 #ifdef PNG_READ_GAMMA_SUPPORTED
       
  3675                if (gamma_16 != NULL && gamma_16_from_1 != NULL &&
       
  3676                    gamma_16_to_1 != NULL)
       
  3677                {
       
  3678                   sp = row;
       
  3679                   for (i = 0; i < row_width; i++, sp += 4)
       
  3680                   {
       
  3681                      png_uint_16 a = (png_uint_16)(((*(sp + 2)) << 8)
       
  3682                          + *(sp + 3));
       
  3683 
       
  3684                      if (a == (png_uint_16)0xffff)
       
  3685                      {
       
  3686                         png_uint_16 v;
       
  3687 
       
  3688                         v = gamma_16[*(sp + 1) >> gamma_shift][*sp];
  3459                         v = gamma_16[*(sp + 1) >> gamma_shift][*sp];
  3689                         *sp = (png_byte)((v >> 8) & 0xff);
  3460                         *sp = (png_byte)((v >> 8) & 0xff);
  3690                         *(sp + 1) = (png_byte)(v & 0xff);
  3461                         *(sp + 1) = (png_byte)(v & 0xff);
  3691                      }
  3462                      }
  3692 
  3463                   }
  3693                      else if (a == 0)
  3464                }
       
  3465                else
       
  3466 #endif
       
  3467                {
       
  3468                   sp = row;
       
  3469                   for (i = 0; i < row_width; i++, sp += 2)
       
  3470                   {
       
  3471                      png_uint_16 v;
       
  3472 
       
  3473                      v = (png_uint_16)(((*sp) << 8) + *(sp + 1));
       
  3474 
       
  3475                      if (v == png_ptr->trans_color.gray)
  3694                      {
  3476                      {
  3695                         /* Background is already in screen gamma */
       
  3696                         *sp = (png_byte)((png_ptr->background.gray >> 8)
  3477                         *sp = (png_byte)((png_ptr->background.gray >> 8)
  3697                                 & 0xff);
  3478                              & 0xff);
  3698                         *(sp + 1) = (png_byte)(png_ptr->background.gray & 0xff);
  3479                         *(sp + 1) = (png_byte)(png_ptr->background.gray
  3699                      }
  3480                              & 0xff);
  3700 
       
  3701                      else
       
  3702                      {
       
  3703                         png_uint_16 g, v, w;
       
  3704 
       
  3705                         g = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp];
       
  3706                         png_composite_16(v, g, a, png_ptr->background_1.gray);
       
  3707                         if (optimize != 0)
       
  3708                            w = v;
       
  3709                         else
       
  3710                            w = gamma_16_from_1[(v & 0xff) >>
       
  3711                                gamma_shift][v >> 8];
       
  3712                         *sp = (png_byte)((w >> 8) & 0xff);
       
  3713                         *(sp + 1) = (png_byte)(w & 0xff);
       
  3714                      }
  3481                      }
  3715                   }
  3482                   }
  3716                }
  3483                }
  3717                else
  3484                break;
  3718 #endif
  3485             }
  3719                {
  3486 
  3720                   sp = row;
  3487             default:
  3721                   for (i = 0; i < row_width; i++, sp += 4)
  3488                break;
       
  3489          }
       
  3490          break;
       
  3491       }
       
  3492 
       
  3493       case PNG_COLOR_TYPE_RGB:
       
  3494       {
       
  3495          if (row_info->bit_depth == 8)
       
  3496          {
       
  3497 #ifdef PNG_READ_GAMMA_SUPPORTED
       
  3498             if (gamma_table != NULL)
       
  3499             {
       
  3500                sp = row;
       
  3501                for (i = 0; i < row_width; i++, sp += 3)
       
  3502                {
       
  3503                   if (*sp == png_ptr->trans_color.red &&
       
  3504                       *(sp + 1) == png_ptr->trans_color.green &&
       
  3505                       *(sp + 2) == png_ptr->trans_color.blue)
  3722                   {
  3506                   {
  3723                      png_uint_16 a = (png_uint_16)(((*(sp + 2)) << 8)
  3507                      *sp = (png_byte)png_ptr->background.red;
       
  3508                      *(sp + 1) = (png_byte)png_ptr->background.green;
       
  3509                      *(sp + 2) = (png_byte)png_ptr->background.blue;
       
  3510                   }
       
  3511 
       
  3512                   else
       
  3513                   {
       
  3514                      *sp = gamma_table[*sp];
       
  3515                      *(sp + 1) = gamma_table[*(sp + 1)];
       
  3516                      *(sp + 2) = gamma_table[*(sp + 2)];
       
  3517                   }
       
  3518                }
       
  3519             }
       
  3520             else
       
  3521 #endif
       
  3522             {
       
  3523                sp = row;
       
  3524                for (i = 0; i < row_width; i++, sp += 3)
       
  3525                {
       
  3526                   if (*sp == png_ptr->trans_color.red &&
       
  3527                       *(sp + 1) == png_ptr->trans_color.green &&
       
  3528                       *(sp + 2) == png_ptr->trans_color.blue)
       
  3529                   {
       
  3530                      *sp = (png_byte)png_ptr->background.red;
       
  3531                      *(sp + 1) = (png_byte)png_ptr->background.green;
       
  3532                      *(sp + 2) = (png_byte)png_ptr->background.blue;
       
  3533                   }
       
  3534                }
       
  3535             }
       
  3536          }
       
  3537          else /* if (row_info->bit_depth == 16) */
       
  3538          {
       
  3539 #ifdef PNG_READ_GAMMA_SUPPORTED
       
  3540             if (gamma_16 != NULL)
       
  3541             {
       
  3542                sp = row;
       
  3543                for (i = 0; i < row_width; i++, sp += 6)
       
  3544                {
       
  3545                   png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1));
       
  3546 
       
  3547                   png_uint_16 g = (png_uint_16)(((*(sp + 2)) << 8)
       
  3548                       + *(sp + 3));
       
  3549 
       
  3550                   png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8)
       
  3551                       + *(sp + 5));
       
  3552 
       
  3553                   if (r == png_ptr->trans_color.red &&
       
  3554                       g == png_ptr->trans_color.green &&
       
  3555                       b == png_ptr->trans_color.blue)
       
  3556                   {
       
  3557                      /* Background is already in screen gamma */
       
  3558                      *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff);
       
  3559                      *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff);
       
  3560                      *(sp + 2) = (png_byte)((png_ptr->background.green >> 8)
       
  3561                              & 0xff);
       
  3562                      *(sp + 3) = (png_byte)(png_ptr->background.green
       
  3563                              & 0xff);
       
  3564                      *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8)
       
  3565                              & 0xff);
       
  3566                      *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff);
       
  3567                   }
       
  3568 
       
  3569                   else
       
  3570                   {
       
  3571                      png_uint_16 v = gamma_16[*(sp + 1) >> gamma_shift][*sp];
       
  3572                      *sp = (png_byte)((v >> 8) & 0xff);
       
  3573                      *(sp + 1) = (png_byte)(v & 0xff);
       
  3574 
       
  3575                      v = gamma_16[*(sp + 3) >> gamma_shift][*(sp + 2)];
       
  3576                      *(sp + 2) = (png_byte)((v >> 8) & 0xff);
       
  3577                      *(sp + 3) = (png_byte)(v & 0xff);
       
  3578 
       
  3579                      v = gamma_16[*(sp + 5) >> gamma_shift][*(sp + 4)];
       
  3580                      *(sp + 4) = (png_byte)((v >> 8) & 0xff);
       
  3581                      *(sp + 5) = (png_byte)(v & 0xff);
       
  3582                   }
       
  3583                }
       
  3584             }
       
  3585 
       
  3586             else
       
  3587 #endif
       
  3588             {
       
  3589                sp = row;
       
  3590                for (i = 0; i < row_width; i++, sp += 6)
       
  3591                {
       
  3592                   png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1));
       
  3593 
       
  3594                   png_uint_16 g = (png_uint_16)(((*(sp + 2)) << 8)
       
  3595                       + *(sp + 3));
       
  3596 
       
  3597                   png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8)
       
  3598                       + *(sp + 5));
       
  3599 
       
  3600                   if (r == png_ptr->trans_color.red &&
       
  3601                       g == png_ptr->trans_color.green &&
       
  3602                       b == png_ptr->trans_color.blue)
       
  3603                   {
       
  3604                      *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff);
       
  3605                      *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff);
       
  3606                      *(sp + 2) = (png_byte)((png_ptr->background.green >> 8)
       
  3607                              & 0xff);
       
  3608                      *(sp + 3) = (png_byte)(png_ptr->background.green
       
  3609                              & 0xff);
       
  3610                      *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8)
       
  3611                              & 0xff);
       
  3612                      *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff);
       
  3613                   }
       
  3614                }
       
  3615             }
       
  3616          }
       
  3617          break;
       
  3618       }
       
  3619 
       
  3620       case PNG_COLOR_TYPE_GRAY_ALPHA:
       
  3621       {
       
  3622          if (row_info->bit_depth == 8)
       
  3623          {
       
  3624 #ifdef PNG_READ_GAMMA_SUPPORTED
       
  3625             if (gamma_to_1 != NULL && gamma_from_1 != NULL &&
       
  3626                 gamma_table != NULL)
       
  3627             {
       
  3628                sp = row;
       
  3629                for (i = 0; i < row_width; i++, sp += 2)
       
  3630                {
       
  3631                   png_uint_16 a = *(sp + 1);
       
  3632 
       
  3633                   if (a == 0xff)
       
  3634                      *sp = gamma_table[*sp];
       
  3635 
       
  3636                   else if (a == 0)
       
  3637                   {
       
  3638                      /* Background is already in screen gamma */
       
  3639                      *sp = (png_byte)png_ptr->background.gray;
       
  3640                   }
       
  3641 
       
  3642                   else
       
  3643                   {
       
  3644                      png_byte v, w;
       
  3645 
       
  3646                      v = gamma_to_1[*sp];
       
  3647                      png_composite(w, v, a, png_ptr->background_1.gray);
       
  3648                      if (optimize == 0)
       
  3649                         w = gamma_from_1[w];
       
  3650                      *sp = w;
       
  3651                   }
       
  3652                }
       
  3653             }
       
  3654             else
       
  3655 #endif
       
  3656             {
       
  3657                sp = row;
       
  3658                for (i = 0; i < row_width; i++, sp += 2)
       
  3659                {
       
  3660                   png_byte a = *(sp + 1);
       
  3661 
       
  3662                   if (a == 0)
       
  3663                      *sp = (png_byte)png_ptr->background.gray;
       
  3664 
       
  3665                   else if (a < 0xff)
       
  3666                      png_composite(*sp, *sp, a, png_ptr->background.gray);
       
  3667                }
       
  3668             }
       
  3669          }
       
  3670          else /* if (png_ptr->bit_depth == 16) */
       
  3671          {
       
  3672 #ifdef PNG_READ_GAMMA_SUPPORTED
       
  3673             if (gamma_16 != NULL && gamma_16_from_1 != NULL &&
       
  3674                 gamma_16_to_1 != NULL)
       
  3675             {
       
  3676                sp = row;
       
  3677                for (i = 0; i < row_width; i++, sp += 4)
       
  3678                {
       
  3679                   png_uint_16 a = (png_uint_16)(((*(sp + 2)) << 8)
       
  3680                       + *(sp + 3));
       
  3681 
       
  3682                   if (a == (png_uint_16)0xffff)
       
  3683                   {
       
  3684                      png_uint_16 v;
       
  3685 
       
  3686                      v = gamma_16[*(sp + 1) >> gamma_shift][*sp];
       
  3687                      *sp = (png_byte)((v >> 8) & 0xff);
       
  3688                      *(sp + 1) = (png_byte)(v & 0xff);
       
  3689                   }
       
  3690 
       
  3691                   else if (a == 0)
       
  3692                   {
       
  3693                      /* Background is already in screen gamma */
       
  3694                      *sp = (png_byte)((png_ptr->background.gray >> 8)
       
  3695                              & 0xff);
       
  3696                      *(sp + 1) = (png_byte)(png_ptr->background.gray & 0xff);
       
  3697                   }
       
  3698 
       
  3699                   else
       
  3700                   {
       
  3701                      png_uint_16 g, v, w;
       
  3702 
       
  3703                      g = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp];
       
  3704                      png_composite_16(v, g, a, png_ptr->background_1.gray);
       
  3705                      if (optimize != 0)
       
  3706                         w = v;
       
  3707                      else
       
  3708                         w = gamma_16_from_1[(v & 0xff) >>
       
  3709                             gamma_shift][v >> 8];
       
  3710                      *sp = (png_byte)((w >> 8) & 0xff);
       
  3711                      *(sp + 1) = (png_byte)(w & 0xff);
       
  3712                   }
       
  3713                }
       
  3714             }
       
  3715             else
       
  3716 #endif
       
  3717             {
       
  3718                sp = row;
       
  3719                for (i = 0; i < row_width; i++, sp += 4)
       
  3720                {
       
  3721                   png_uint_16 a = (png_uint_16)(((*(sp + 2)) << 8)
       
  3722                       + *(sp + 3));
       
  3723 
       
  3724                   if (a == 0)
       
  3725                   {
       
  3726                      *sp = (png_byte)((png_ptr->background.gray >> 8)
       
  3727                              & 0xff);
       
  3728                      *(sp + 1) = (png_byte)(png_ptr->background.gray & 0xff);
       
  3729                   }
       
  3730 
       
  3731                   else if (a < 0xffff)
       
  3732                   {
       
  3733                      png_uint_16 g, v;
       
  3734 
       
  3735                      g = (png_uint_16)(((*sp) << 8) + *(sp + 1));
       
  3736                      png_composite_16(v, g, a, png_ptr->background.gray);
       
  3737                      *sp = (png_byte)((v >> 8) & 0xff);
       
  3738                      *(sp + 1) = (png_byte)(v & 0xff);
       
  3739                   }
       
  3740                }
       
  3741             }
       
  3742          }
       
  3743          break;
       
  3744       }
       
  3745 
       
  3746       case PNG_COLOR_TYPE_RGB_ALPHA:
       
  3747       {
       
  3748          if (row_info->bit_depth == 8)
       
  3749          {
       
  3750 #ifdef PNG_READ_GAMMA_SUPPORTED
       
  3751             if (gamma_to_1 != NULL && gamma_from_1 != NULL &&
       
  3752                 gamma_table != NULL)
       
  3753             {
       
  3754                sp = row;
       
  3755                for (i = 0; i < row_width; i++, sp += 4)
       
  3756                {
       
  3757                   png_byte a = *(sp + 3);
       
  3758 
       
  3759                   if (a == 0xff)
       
  3760                   {
       
  3761                      *sp = gamma_table[*sp];
       
  3762                      *(sp + 1) = gamma_table[*(sp + 1)];
       
  3763                      *(sp + 2) = gamma_table[*(sp + 2)];
       
  3764                   }
       
  3765 
       
  3766                   else if (a == 0)
       
  3767                   {
       
  3768                      /* Background is already in screen gamma */
       
  3769                      *sp = (png_byte)png_ptr->background.red;
       
  3770                      *(sp + 1) = (png_byte)png_ptr->background.green;
       
  3771                      *(sp + 2) = (png_byte)png_ptr->background.blue;
       
  3772                   }
       
  3773 
       
  3774                   else
       
  3775                   {
       
  3776                      png_byte v, w;
       
  3777 
       
  3778                      v = gamma_to_1[*sp];
       
  3779                      png_composite(w, v, a, png_ptr->background_1.red);
       
  3780                      if (optimize == 0) w = gamma_from_1[w];
       
  3781                      *sp = w;
       
  3782 
       
  3783                      v = gamma_to_1[*(sp + 1)];
       
  3784                      png_composite(w, v, a, png_ptr->background_1.green);
       
  3785                      if (optimize == 0) w = gamma_from_1[w];
       
  3786                      *(sp + 1) = w;
       
  3787 
       
  3788                      v = gamma_to_1[*(sp + 2)];
       
  3789                      png_composite(w, v, a, png_ptr->background_1.blue);
       
  3790                      if (optimize == 0) w = gamma_from_1[w];
       
  3791                      *(sp + 2) = w;
       
  3792                   }
       
  3793                }
       
  3794             }
       
  3795             else
       
  3796 #endif
       
  3797             {
       
  3798                sp = row;
       
  3799                for (i = 0; i < row_width; i++, sp += 4)
       
  3800                {
       
  3801                   png_byte a = *(sp + 3);
       
  3802 
       
  3803                   if (a == 0)
       
  3804                   {
       
  3805                      *sp = (png_byte)png_ptr->background.red;
       
  3806                      *(sp + 1) = (png_byte)png_ptr->background.green;
       
  3807                      *(sp + 2) = (png_byte)png_ptr->background.blue;
       
  3808                   }
       
  3809 
       
  3810                   else if (a < 0xff)
       
  3811                   {
       
  3812                      png_composite(*sp, *sp, a, png_ptr->background.red);
       
  3813 
       
  3814                      png_composite(*(sp + 1), *(sp + 1), a,
       
  3815                          png_ptr->background.green);
       
  3816 
       
  3817                      png_composite(*(sp + 2), *(sp + 2), a,
       
  3818                          png_ptr->background.blue);
       
  3819                   }
       
  3820                }
       
  3821             }
       
  3822          }
       
  3823          else /* if (row_info->bit_depth == 16) */
       
  3824          {
       
  3825 #ifdef PNG_READ_GAMMA_SUPPORTED
       
  3826             if (gamma_16 != NULL && gamma_16_from_1 != NULL &&
       
  3827                 gamma_16_to_1 != NULL)
       
  3828             {
       
  3829                sp = row;
       
  3830                for (i = 0; i < row_width; i++, sp += 8)
       
  3831                {
       
  3832                   png_uint_16 a = (png_uint_16)(((png_uint_16)(*(sp + 6))
       
  3833                       << 8) + (png_uint_16)(*(sp + 7)));
       
  3834 
       
  3835                   if (a == (png_uint_16)0xffff)
       
  3836                   {
       
  3837                      png_uint_16 v;
       
  3838 
       
  3839                      v = gamma_16[*(sp + 1) >> gamma_shift][*sp];
       
  3840                      *sp = (png_byte)((v >> 8) & 0xff);
       
  3841                      *(sp + 1) = (png_byte)(v & 0xff);
       
  3842 
       
  3843                      v = gamma_16[*(sp + 3) >> gamma_shift][*(sp + 2)];
       
  3844                      *(sp + 2) = (png_byte)((v >> 8) & 0xff);
       
  3845                      *(sp + 3) = (png_byte)(v & 0xff);
       
  3846 
       
  3847                      v = gamma_16[*(sp + 5) >> gamma_shift][*(sp + 4)];
       
  3848                      *(sp + 4) = (png_byte)((v >> 8) & 0xff);
       
  3849                      *(sp + 5) = (png_byte)(v & 0xff);
       
  3850                   }
       
  3851 
       
  3852                   else if (a == 0)
       
  3853                   {
       
  3854                      /* Background is already in screen gamma */
       
  3855                      *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff);
       
  3856                      *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff);
       
  3857                      *(sp + 2) = (png_byte)((png_ptr->background.green >> 8)
       
  3858                              & 0xff);
       
  3859                      *(sp + 3) = (png_byte)(png_ptr->background.green
       
  3860                              & 0xff);
       
  3861                      *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8)
       
  3862                              & 0xff);
       
  3863                      *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff);
       
  3864                   }
       
  3865 
       
  3866                   else
       
  3867                   {
       
  3868                      png_uint_16 v, w;
       
  3869 
       
  3870                      v = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp];
       
  3871                      png_composite_16(w, v, a, png_ptr->background_1.red);
       
  3872                      if (optimize == 0)
       
  3873                         w = gamma_16_from_1[((w & 0xff) >> gamma_shift)][w >>
       
  3874                              8];
       
  3875                      *sp = (png_byte)((w >> 8) & 0xff);
       
  3876                      *(sp + 1) = (png_byte)(w & 0xff);
       
  3877 
       
  3878                      v = gamma_16_to_1[*(sp + 3) >> gamma_shift][*(sp + 2)];
       
  3879                      png_composite_16(w, v, a, png_ptr->background_1.green);
       
  3880                      if (optimize == 0)
       
  3881                         w = gamma_16_from_1[((w & 0xff) >> gamma_shift)][w >>
       
  3882                              8];
       
  3883 
       
  3884                      *(sp + 2) = (png_byte)((w >> 8) & 0xff);
       
  3885                      *(sp + 3) = (png_byte)(w & 0xff);
       
  3886 
       
  3887                      v = gamma_16_to_1[*(sp + 5) >> gamma_shift][*(sp + 4)];
       
  3888                      png_composite_16(w, v, a, png_ptr->background_1.blue);
       
  3889                      if (optimize == 0)
       
  3890                         w = gamma_16_from_1[((w & 0xff) >> gamma_shift)][w >>
       
  3891                              8];
       
  3892 
       
  3893                      *(sp + 4) = (png_byte)((w >> 8) & 0xff);
       
  3894                      *(sp + 5) = (png_byte)(w & 0xff);
       
  3895                   }
       
  3896                }
       
  3897             }
       
  3898 
       
  3899             else
       
  3900 #endif
       
  3901             {
       
  3902                sp = row;
       
  3903                for (i = 0; i < row_width; i++, sp += 8)
       
  3904                {
       
  3905                   png_uint_16 a = (png_uint_16)(((png_uint_16)(*(sp + 6))
       
  3906                       << 8) + (png_uint_16)(*(sp + 7)));
       
  3907 
       
  3908                   if (a == 0)
       
  3909                   {
       
  3910                      *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff);
       
  3911                      *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff);
       
  3912                      *(sp + 2) = (png_byte)((png_ptr->background.green >> 8)
       
  3913                              & 0xff);
       
  3914                      *(sp + 3) = (png_byte)(png_ptr->background.green
       
  3915                              & 0xff);
       
  3916                      *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8)
       
  3917                              & 0xff);
       
  3918                      *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff);
       
  3919                   }
       
  3920 
       
  3921                   else if (a < 0xffff)
       
  3922                   {
       
  3923                      png_uint_16 v;
       
  3924 
       
  3925                      png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1));
       
  3926                      png_uint_16 g = (png_uint_16)(((*(sp + 2)) << 8)
  3724                          + *(sp + 3));
  3927                          + *(sp + 3));
  3725 
  3928                      png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8)
  3726                      if (a == 0)
  3929                          + *(sp + 5));
  3727                      {
  3930 
  3728                         *sp = (png_byte)((png_ptr->background.gray >> 8)
  3931                      png_composite_16(v, r, a, png_ptr->background.red);
  3729                                 & 0xff);
  3932                      *sp = (png_byte)((v >> 8) & 0xff);
  3730                         *(sp + 1) = (png_byte)(png_ptr->background.gray & 0xff);
  3933                      *(sp + 1) = (png_byte)(v & 0xff);
  3731                      }
  3934 
  3732 
  3935                      png_composite_16(v, g, a, png_ptr->background.green);
  3733                      else if (a < 0xffff)
  3936                      *(sp + 2) = (png_byte)((v >> 8) & 0xff);
  3734                      {
  3937                      *(sp + 3) = (png_byte)(v & 0xff);
  3735                         png_uint_16 g, v;
  3938 
  3736 
  3939                      png_composite_16(v, b, a, png_ptr->background.blue);
  3737                         g = (png_uint_16)(((*sp) << 8) + *(sp + 1));
  3940                      *(sp + 4) = (png_byte)((v >> 8) & 0xff);
  3738                         png_composite_16(v, g, a, png_ptr->background.gray);
  3941                      *(sp + 5) = (png_byte)(v & 0xff);
  3739                         *sp = (png_byte)((v >> 8) & 0xff);
       
  3740                         *(sp + 1) = (png_byte)(v & 0xff);
       
  3741                      }
       
  3742                   }
  3942                   }
  3743                }
  3943                }
  3744             }
  3944             }
  3745             break;
  3945          }
  3746          }
  3946          break;
  3747 
  3947       }
  3748          case PNG_COLOR_TYPE_RGB_ALPHA:
  3948 
  3749          {
  3949       default:
  3750             if (row_info->bit_depth == 8)
  3950          break;
  3751             {
       
  3752 #ifdef PNG_READ_GAMMA_SUPPORTED
       
  3753                if (gamma_to_1 != NULL && gamma_from_1 != NULL &&
       
  3754                    gamma_table != NULL)
       
  3755                {
       
  3756                   sp = row;
       
  3757                   for (i = 0; i < row_width; i++, sp += 4)
       
  3758                   {
       
  3759                      png_byte a = *(sp + 3);
       
  3760 
       
  3761                      if (a == 0xff)
       
  3762                      {
       
  3763                         *sp = gamma_table[*sp];
       
  3764                         *(sp + 1) = gamma_table[*(sp + 1)];
       
  3765                         *(sp + 2) = gamma_table[*(sp + 2)];
       
  3766                      }
       
  3767 
       
  3768                      else if (a == 0)
       
  3769                      {
       
  3770                         /* Background is already in screen gamma */
       
  3771                         *sp = (png_byte)png_ptr->background.red;
       
  3772                         *(sp + 1) = (png_byte)png_ptr->background.green;
       
  3773                         *(sp + 2) = (png_byte)png_ptr->background.blue;
       
  3774                      }
       
  3775 
       
  3776                      else
       
  3777                      {
       
  3778                         png_byte v, w;
       
  3779 
       
  3780                         v = gamma_to_1[*sp];
       
  3781                         png_composite(w, v, a, png_ptr->background_1.red);
       
  3782                         if (optimize == 0) w = gamma_from_1[w];
       
  3783                         *sp = w;
       
  3784 
       
  3785                         v = gamma_to_1[*(sp + 1)];
       
  3786                         png_composite(w, v, a, png_ptr->background_1.green);
       
  3787                         if (optimize == 0) w = gamma_from_1[w];
       
  3788                         *(sp + 1) = w;
       
  3789 
       
  3790                         v = gamma_to_1[*(sp + 2)];
       
  3791                         png_composite(w, v, a, png_ptr->background_1.blue);
       
  3792                         if (optimize == 0) w = gamma_from_1[w];
       
  3793                         *(sp + 2) = w;
       
  3794                      }
       
  3795                   }
       
  3796                }
       
  3797                else
       
  3798 #endif
       
  3799                {
       
  3800                   sp = row;
       
  3801                   for (i = 0; i < row_width; i++, sp += 4)
       
  3802                   {
       
  3803                      png_byte a = *(sp + 3);
       
  3804 
       
  3805                      if (a == 0)
       
  3806                      {
       
  3807                         *sp = (png_byte)png_ptr->background.red;
       
  3808                         *(sp + 1) = (png_byte)png_ptr->background.green;
       
  3809                         *(sp + 2) = (png_byte)png_ptr->background.blue;
       
  3810                      }
       
  3811 
       
  3812                      else if (a < 0xff)
       
  3813                      {
       
  3814                         png_composite(*sp, *sp, a, png_ptr->background.red);
       
  3815 
       
  3816                         png_composite(*(sp + 1), *(sp + 1), a,
       
  3817                             png_ptr->background.green);
       
  3818 
       
  3819                         png_composite(*(sp + 2), *(sp + 2), a,
       
  3820                             png_ptr->background.blue);
       
  3821                      }
       
  3822                   }
       
  3823                }
       
  3824             }
       
  3825             else /* if (row_info->bit_depth == 16) */
       
  3826             {
       
  3827 #ifdef PNG_READ_GAMMA_SUPPORTED
       
  3828                if (gamma_16 != NULL && gamma_16_from_1 != NULL &&
       
  3829                    gamma_16_to_1 != NULL)
       
  3830                {
       
  3831                   sp = row;
       
  3832                   for (i = 0; i < row_width; i++, sp += 8)
       
  3833                   {
       
  3834                      png_uint_16 a = (png_uint_16)(((png_uint_16)(*(sp + 6))
       
  3835                          << 8) + (png_uint_16)(*(sp + 7)));
       
  3836 
       
  3837                      if (a == (png_uint_16)0xffff)
       
  3838                      {
       
  3839                         png_uint_16 v;
       
  3840 
       
  3841                         v = gamma_16[*(sp + 1) >> gamma_shift][*sp];
       
  3842                         *sp = (png_byte)((v >> 8) & 0xff);
       
  3843                         *(sp + 1) = (png_byte)(v & 0xff);
       
  3844 
       
  3845                         v = gamma_16[*(sp + 3) >> gamma_shift][*(sp + 2)];
       
  3846                         *(sp + 2) = (png_byte)((v >> 8) & 0xff);
       
  3847                         *(sp + 3) = (png_byte)(v & 0xff);
       
  3848 
       
  3849                         v = gamma_16[*(sp + 5) >> gamma_shift][*(sp + 4)];
       
  3850                         *(sp + 4) = (png_byte)((v >> 8) & 0xff);
       
  3851                         *(sp + 5) = (png_byte)(v & 0xff);
       
  3852                      }
       
  3853 
       
  3854                      else if (a == 0)
       
  3855                      {
       
  3856                         /* Background is already in screen gamma */
       
  3857                         *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff);
       
  3858                         *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff);
       
  3859                         *(sp + 2) = (png_byte)((png_ptr->background.green >> 8)
       
  3860                                 & 0xff);
       
  3861                         *(sp + 3) = (png_byte)(png_ptr->background.green
       
  3862                                 & 0xff);
       
  3863                         *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8)
       
  3864                                 & 0xff);
       
  3865                         *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff);
       
  3866                      }
       
  3867 
       
  3868                      else
       
  3869                      {
       
  3870                         png_uint_16 v, w;
       
  3871 
       
  3872                         v = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp];
       
  3873                         png_composite_16(w, v, a, png_ptr->background_1.red);
       
  3874                         if (optimize == 0)
       
  3875                            w = gamma_16_from_1[((w & 0xff) >> gamma_shift)][w >>
       
  3876                                 8];
       
  3877                         *sp = (png_byte)((w >> 8) & 0xff);
       
  3878                         *(sp + 1) = (png_byte)(w & 0xff);
       
  3879 
       
  3880                         v = gamma_16_to_1[*(sp + 3) >> gamma_shift][*(sp + 2)];
       
  3881                         png_composite_16(w, v, a, png_ptr->background_1.green);
       
  3882                         if (optimize == 0)
       
  3883                            w = gamma_16_from_1[((w & 0xff) >> gamma_shift)][w >>
       
  3884                                 8];
       
  3885 
       
  3886                         *(sp + 2) = (png_byte)((w >> 8) & 0xff);
       
  3887                         *(sp + 3) = (png_byte)(w & 0xff);
       
  3888 
       
  3889                         v = gamma_16_to_1[*(sp + 5) >> gamma_shift][*(sp + 4)];
       
  3890                         png_composite_16(w, v, a, png_ptr->background_1.blue);
       
  3891                         if (optimize == 0)
       
  3892                            w = gamma_16_from_1[((w & 0xff) >> gamma_shift)][w >>
       
  3893                                 8];
       
  3894 
       
  3895                         *(sp + 4) = (png_byte)((w >> 8) & 0xff);
       
  3896                         *(sp + 5) = (png_byte)(w & 0xff);
       
  3897                      }
       
  3898                   }
       
  3899                }
       
  3900 
       
  3901                else
       
  3902 #endif
       
  3903                {
       
  3904                   sp = row;
       
  3905                   for (i = 0; i < row_width; i++, sp += 8)
       
  3906                   {
       
  3907                      png_uint_16 a = (png_uint_16)(((png_uint_16)(*(sp + 6))
       
  3908                          << 8) + (png_uint_16)(*(sp + 7)));
       
  3909 
       
  3910                      if (a == 0)
       
  3911                      {
       
  3912                         *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff);
       
  3913                         *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff);
       
  3914                         *(sp + 2) = (png_byte)((png_ptr->background.green >> 8)
       
  3915                                 & 0xff);
       
  3916                         *(sp + 3) = (png_byte)(png_ptr->background.green
       
  3917                                 & 0xff);
       
  3918                         *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8)
       
  3919                                 & 0xff);
       
  3920                         *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff);
       
  3921                      }
       
  3922 
       
  3923                      else if (a < 0xffff)
       
  3924                      {
       
  3925                         png_uint_16 v;
       
  3926 
       
  3927                         png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1));
       
  3928                         png_uint_16 g = (png_uint_16)(((*(sp + 2)) << 8)
       
  3929                             + *(sp + 3));
       
  3930                         png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8)
       
  3931                             + *(sp + 5));
       
  3932 
       
  3933                         png_composite_16(v, r, a, png_ptr->background.red);
       
  3934                         *sp = (png_byte)((v >> 8) & 0xff);
       
  3935                         *(sp + 1) = (png_byte)(v & 0xff);
       
  3936 
       
  3937                         png_composite_16(v, g, a, png_ptr->background.green);
       
  3938                         *(sp + 2) = (png_byte)((v >> 8) & 0xff);
       
  3939                         *(sp + 3) = (png_byte)(v & 0xff);
       
  3940 
       
  3941                         png_composite_16(v, b, a, png_ptr->background.blue);
       
  3942                         *(sp + 4) = (png_byte)((v >> 8) & 0xff);
       
  3943                         *(sp + 5) = (png_byte)(v & 0xff);
       
  3944                      }
       
  3945                   }
       
  3946                }
       
  3947             }
       
  3948             break;
       
  3949          }
       
  3950 
       
  3951          default:
       
  3952             break;
       
  3953       }
       
  3954    }
  3951    }
  3955 }
  3952 }
  3956 #endif /* READ_BACKGROUND || READ_ALPHA_MODE */
  3953 #endif /* READ_BACKGROUND || READ_ALPHA_MODE */
  3957 
  3954 
  3958 #ifdef PNG_READ_GAMMA_SUPPORTED
  3955 #ifdef PNG_READ_GAMMA_SUPPORTED
  4246       {
  4243       {
  4247          switch (row_info->bit_depth)
  4244          switch (row_info->bit_depth)
  4248          {
  4245          {
  4249             case 1:
  4246             case 1:
  4250             {
  4247             {
  4251                sp = row + (png_size_t)((row_width - 1) >> 3);
  4248                sp = row + (size_t)((row_width - 1) >> 3);
  4252                dp = row + (png_size_t)row_width - 1;
  4249                dp = row + (size_t)row_width - 1;
  4253                shift = 7 - (int)((row_width + 7) & 0x07);
  4250                shift = 7 - (int)((row_width + 7) & 0x07);
  4254                for (i = 0; i < row_width; i++)
  4251                for (i = 0; i < row_width; i++)
  4255                {
  4252                {
  4256                   if ((*sp >> shift) & 0x01)
  4253                   if ((*sp >> shift) & 0x01)
  4257                      *dp = 1;
  4254                      *dp = 1;
  4273                break;
  4270                break;
  4274             }
  4271             }
  4275 
  4272 
  4276             case 2:
  4273             case 2:
  4277             {
  4274             {
  4278                sp = row + (png_size_t)((row_width - 1) >> 2);
  4275                sp = row + (size_t)((row_width - 1) >> 2);
  4279                dp = row + (png_size_t)row_width - 1;
  4276                dp = row + (size_t)row_width - 1;
  4280                shift = (int)((3 - ((row_width + 3) & 0x03)) << 1);
  4277                shift = (int)((3 - ((row_width + 3) & 0x03)) << 1);
  4281                for (i = 0; i < row_width; i++)
  4278                for (i = 0; i < row_width; i++)
  4282                {
  4279                {
  4283                   value = (*sp >> shift) & 0x03;
  4280                   value = (*sp >> shift) & 0x03;
  4284                   *dp = (png_byte)value;
  4281                   *dp = (png_byte)value;
  4296                break;
  4293                break;
  4297             }
  4294             }
  4298 
  4295 
  4299             case 4:
  4296             case 4:
  4300             {
  4297             {
  4301                sp = row + (png_size_t)((row_width - 1) >> 1);
  4298                sp = row + (size_t)((row_width - 1) >> 1);
  4302                dp = row + (png_size_t)row_width - 1;
  4299                dp = row + (size_t)row_width - 1;
  4303                shift = (int)((row_width & 0x01) << 2);
  4300                shift = (int)((row_width & 0x01) << 2);
  4304                for (i = 0; i < row_width; i++)
  4301                for (i = 0; i < row_width; i++)
  4305                {
  4302                {
  4306                   value = (*sp >> shift) & 0x0f;
  4303                   value = (*sp >> shift) & 0x0f;
  4307                   *dp = (png_byte)value;
  4304                   *dp = (png_byte)value;
  4330       if (row_info->bit_depth == 8)
  4327       if (row_info->bit_depth == 8)
  4331       {
  4328       {
  4332          {
  4329          {
  4333             if (num_trans > 0)
  4330             if (num_trans > 0)
  4334             {
  4331             {
  4335                sp = row + (png_size_t)row_width - 1;
  4332                sp = row + (size_t)row_width - 1;
  4336                dp = row + ((png_size_t)row_width << 2) - 1;
  4333                dp = row + ((size_t)row_width << 2) - 1;
  4337 
  4334 
  4338                for (i = 0; i < row_width; i++)
  4335                for (i = 0; i < row_width; i++)
  4339                {
  4336                {
  4340                   if ((int)(*sp) >= num_trans)
  4337                   if ((int)(*sp) >= num_trans)
  4341                      *dp-- = 0xff;
  4338                      *dp-- = 0xff;
  4355                row_info->channels = 4;
  4352                row_info->channels = 4;
  4356             }
  4353             }
  4357 
  4354 
  4358             else
  4355             else
  4359             {
  4356             {
  4360                sp = row + (png_size_t)row_width - 1;
  4357                sp = row + (size_t)row_width - 1;
  4361                dp = row + (png_size_t)(row_width * 3) - 1;
  4358                dp = row + (size_t)(row_width * 3) - 1;
  4362 
  4359 
  4363                for (i = 0; i < row_width; i++)
  4360                for (i = 0; i < row_width; i++)
  4364                {
  4361                {
  4365                   *dp-- = palette[*sp].blue;
  4362                   *dp-- = palette[*sp].blue;
  4366                   *dp-- = palette[*sp].green;
  4363                   *dp-- = palette[*sp].green;
  4391    png_uint_32 i;
  4388    png_uint_32 i;
  4392    png_uint_32 row_width=row_info->width;
  4389    png_uint_32 row_width=row_info->width;
  4393 
  4390 
  4394    png_debug(1, "in png_do_expand");
  4391    png_debug(1, "in png_do_expand");
  4395 
  4392 
  4396    {
  4393    if (row_info->color_type == PNG_COLOR_TYPE_GRAY)
  4397       if (row_info->color_type == PNG_COLOR_TYPE_GRAY)
  4394    {
  4398       {
  4395       unsigned int gray = trans_color != NULL ? trans_color->gray : 0;
  4399          unsigned int gray = trans_color != NULL ? trans_color->gray : 0;
  4396 
  4400 
  4397       if (row_info->bit_depth < 8)
  4401          if (row_info->bit_depth < 8)
  4398       {
  4402          {
  4399          switch (row_info->bit_depth)
  4403             switch (row_info->bit_depth)
  4400          {
  4404             {
  4401             case 1:
  4405                case 1:
  4402             {
  4406                {
  4403                gray = (gray & 0x01) * 0xff;
  4407                   gray = (gray & 0x01) * 0xff;
  4404                sp = row + (size_t)((row_width - 1) >> 3);
  4408                   sp = row + (png_size_t)((row_width - 1) >> 3);
  4405                dp = row + (size_t)row_width - 1;
  4409                   dp = row + (png_size_t)row_width - 1;
  4406                shift = 7 - (int)((row_width + 7) & 0x07);
  4410                   shift = 7 - (int)((row_width + 7) & 0x07);
  4407                for (i = 0; i < row_width; i++)
  4411                   for (i = 0; i < row_width; i++)
  4408                {
       
  4409                   if ((*sp >> shift) & 0x01)
       
  4410                      *dp = 0xff;
       
  4411 
       
  4412                   else
       
  4413                      *dp = 0;
       
  4414 
       
  4415                   if (shift == 7)
  4412                   {
  4416                   {
  4413                      if ((*sp >> shift) & 0x01)
  4417                      shift = 0;
  4414                         *dp = 0xff;
  4418                      sp--;
  4415 
       
  4416                      else
       
  4417                         *dp = 0;
       
  4418 
       
  4419                      if (shift == 7)
       
  4420                      {
       
  4421                         shift = 0;
       
  4422                         sp--;
       
  4423                      }
       
  4424 
       
  4425                      else
       
  4426                         shift++;
       
  4427 
       
  4428                      dp--;
       
  4429                   }
  4419                   }
  4430                   break;
  4420 
  4431                }
  4421                   else
  4432 
  4422                      shift++;
  4433                case 2:
  4423 
  4434                {
  4424                   dp--;
  4435                   gray = (gray & 0x03) * 0x55;
  4425                }
  4436                   sp = row + (png_size_t)((row_width - 1) >> 2);
  4426                break;
  4437                   dp = row + (png_size_t)row_width - 1;
  4427             }
  4438                   shift = (int)((3 - ((row_width + 3) & 0x03)) << 1);
  4428 
  4439                   for (i = 0; i < row_width; i++)
  4429             case 2:
       
  4430             {
       
  4431                gray = (gray & 0x03) * 0x55;
       
  4432                sp = row + (size_t)((row_width - 1) >> 2);
       
  4433                dp = row + (size_t)row_width - 1;
       
  4434                shift = (int)((3 - ((row_width + 3) & 0x03)) << 1);
       
  4435                for (i = 0; i < row_width; i++)
       
  4436                {
       
  4437                   value = (*sp >> shift) & 0x03;
       
  4438                   *dp = (png_byte)(value | (value << 2) | (value << 4) |
       
  4439                      (value << 6));
       
  4440                   if (shift == 6)
  4440                   {
  4441                   {
  4441                      value = (*sp >> shift) & 0x03;
  4442                      shift = 0;
  4442                      *dp = (png_byte)(value | (value << 2) | (value << 4) |
  4443                      sp--;
  4443                         (value << 6));
       
  4444                      if (shift == 6)
       
  4445                      {
       
  4446                         shift = 0;
       
  4447                         sp--;
       
  4448                      }
       
  4449 
       
  4450                      else
       
  4451                         shift += 2;
       
  4452 
       
  4453                      dp--;
       
  4454                   }
  4444                   }
  4455                   break;
  4445 
  4456                }
  4446                   else
  4457 
  4447                      shift += 2;
  4458                case 4:
  4448 
  4459                {
  4449                   dp--;
  4460                   gray = (gray & 0x0f) * 0x11;
  4450                }
  4461                   sp = row + (png_size_t)((row_width - 1) >> 1);
  4451                break;
  4462                   dp = row + (png_size_t)row_width - 1;
  4452             }
  4463                   shift = (int)((1 - ((row_width + 1) & 0x01)) << 2);
  4453 
  4464                   for (i = 0; i < row_width; i++)
  4454             case 4:
       
  4455             {
       
  4456                gray = (gray & 0x0f) * 0x11;
       
  4457                sp = row + (size_t)((row_width - 1) >> 1);
       
  4458                dp = row + (size_t)row_width - 1;
       
  4459                shift = (int)((1 - ((row_width + 1) & 0x01)) << 2);
       
  4460                for (i = 0; i < row_width; i++)
       
  4461                {
       
  4462                   value = (*sp >> shift) & 0x0f;
       
  4463                   *dp = (png_byte)(value | (value << 4));
       
  4464                   if (shift == 4)
  4465                   {
  4465                   {
  4466                      value = (*sp >> shift) & 0x0f;
  4466                      shift = 0;
  4467                      *dp = (png_byte)(value | (value << 4));
  4467                      sp--;
  4468                      if (shift == 4)
       
  4469                      {
       
  4470                         shift = 0;
       
  4471                         sp--;
       
  4472                      }
       
  4473 
       
  4474                      else
       
  4475                         shift = 4;
       
  4476 
       
  4477                      dp--;
       
  4478                   }
  4468                   }
  4479                   break;
       
  4480                }
       
  4481 
       
  4482                default:
       
  4483                   break;
       
  4484             }
       
  4485 
       
  4486             row_info->bit_depth = 8;
       
  4487             row_info->pixel_depth = 8;
       
  4488             row_info->rowbytes = row_width;
       
  4489          }
       
  4490 
       
  4491          if (trans_color != NULL)
       
  4492          {
       
  4493             if (row_info->bit_depth == 8)
       
  4494             {
       
  4495                gray = gray & 0xff;
       
  4496                sp = row + (png_size_t)row_width - 1;
       
  4497                dp = row + ((png_size_t)row_width << 1) - 1;
       
  4498 
       
  4499                for (i = 0; i < row_width; i++)
       
  4500                {
       
  4501                   if ((*sp & 0xffU) == gray)
       
  4502                      *dp-- = 0;
       
  4503 
  4469 
  4504                   else
  4470                   else
  4505                      *dp-- = 0xff;
  4471                      shift = 4;
  4506 
  4472 
  4507                   *dp-- = *sp--;
  4473                   dp--;
  4508                }
  4474                }
  4509             }
  4475                break;
  4510 
  4476             }
  4511             else if (row_info->bit_depth == 16)
  4477 
  4512             {
  4478             default:
  4513                unsigned int gray_high = (gray >> 8) & 0xff;
  4479                break;
  4514                unsigned int gray_low = gray & 0xff;
  4480          }
  4515                sp = row + row_info->rowbytes - 1;
  4481 
  4516                dp = row + (row_info->rowbytes << 1) - 1;
  4482          row_info->bit_depth = 8;
  4517                for (i = 0; i < row_width; i++)
  4483          row_info->pixel_depth = 8;
  4518                {
  4484          row_info->rowbytes = row_width;
  4519                   if ((*(sp - 1) & 0xffU) == gray_high &&
  4485       }
  4520                       (*(sp) & 0xffU) == gray_low)
  4486 
  4521                   {
  4487       if (trans_color != NULL)
  4522                      *dp-- = 0;
       
  4523                      *dp-- = 0;
       
  4524                   }
       
  4525 
       
  4526                   else
       
  4527                   {
       
  4528                      *dp-- = 0xff;
       
  4529                      *dp-- = 0xff;
       
  4530                   }
       
  4531 
       
  4532                   *dp-- = *sp--;
       
  4533                   *dp-- = *sp--;
       
  4534                }
       
  4535             }
       
  4536 
       
  4537             row_info->color_type = PNG_COLOR_TYPE_GRAY_ALPHA;
       
  4538             row_info->channels = 2;
       
  4539             row_info->pixel_depth = (png_byte)(row_info->bit_depth << 1);
       
  4540             row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth,
       
  4541                 row_width);
       
  4542          }
       
  4543       }
       
  4544       else if (row_info->color_type == PNG_COLOR_TYPE_RGB &&
       
  4545           trans_color != NULL)
       
  4546       {
  4488       {
  4547          if (row_info->bit_depth == 8)
  4489          if (row_info->bit_depth == 8)
  4548          {
  4490          {
  4549             png_byte red = (png_byte)(trans_color->red & 0xff);
  4491             gray = gray & 0xff;
  4550             png_byte green = (png_byte)(trans_color->green & 0xff);
  4492             sp = row + (size_t)row_width - 1;
  4551             png_byte blue = (png_byte)(trans_color->blue & 0xff);
  4493             dp = row + ((size_t)row_width << 1) - 1;
  4552             sp = row + (png_size_t)row_info->rowbytes - 1;
  4494 
  4553             dp = row + ((png_size_t)row_width << 2) - 1;
       
  4554             for (i = 0; i < row_width; i++)
  4495             for (i = 0; i < row_width; i++)
  4555             {
  4496             {
  4556                if (*(sp - 2) == red && *(sp - 1) == green && *(sp) == blue)
  4497                if ((*sp & 0xffU) == gray)
  4557                   *dp-- = 0;
  4498                   *dp-- = 0;
  4558 
  4499 
  4559                else
  4500                else
  4560                   *dp-- = 0xff;
  4501                   *dp-- = 0xff;
  4561 
  4502 
  4562                *dp-- = *sp--;
  4503                *dp-- = *sp--;
       
  4504             }
       
  4505          }
       
  4506 
       
  4507          else if (row_info->bit_depth == 16)
       
  4508          {
       
  4509             unsigned int gray_high = (gray >> 8) & 0xff;
       
  4510             unsigned int gray_low = gray & 0xff;
       
  4511             sp = row + row_info->rowbytes - 1;
       
  4512             dp = row + (row_info->rowbytes << 1) - 1;
       
  4513             for (i = 0; i < row_width; i++)
       
  4514             {
       
  4515                if ((*(sp - 1) & 0xffU) == gray_high &&
       
  4516                    (*(sp) & 0xffU) == gray_low)
       
  4517                {
       
  4518                   *dp-- = 0;
       
  4519                   *dp-- = 0;
       
  4520                }
       
  4521 
       
  4522                else
       
  4523                {
       
  4524                   *dp-- = 0xff;
       
  4525                   *dp-- = 0xff;
       
  4526                }
       
  4527 
  4563                *dp-- = *sp--;
  4528                *dp-- = *sp--;
  4564                *dp-- = *sp--;
  4529                *dp-- = *sp--;
  4565             }
  4530             }
  4566          }
  4531          }
  4567          else if (row_info->bit_depth == 16)
  4532 
  4568          {
  4533          row_info->color_type = PNG_COLOR_TYPE_GRAY_ALPHA;
  4569             png_byte red_high = (png_byte)((trans_color->red >> 8) & 0xff);
  4534          row_info->channels = 2;
  4570             png_byte green_high = (png_byte)((trans_color->green >> 8) & 0xff);
  4535          row_info->pixel_depth = (png_byte)(row_info->bit_depth << 1);
  4571             png_byte blue_high = (png_byte)((trans_color->blue >> 8) & 0xff);
  4536          row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth,
  4572             png_byte red_low = (png_byte)(trans_color->red & 0xff);
  4537              row_width);
  4573             png_byte green_low = (png_byte)(trans_color->green & 0xff);
  4538       }
  4574             png_byte blue_low = (png_byte)(trans_color->blue & 0xff);
  4539    }
  4575             sp = row + row_info->rowbytes - 1;
  4540    else if (row_info->color_type == PNG_COLOR_TYPE_RGB &&
  4576             dp = row + ((png_size_t)row_width << 3) - 1;
  4541        trans_color != NULL)
  4577             for (i = 0; i < row_width; i++)
  4542    {
  4578             {
  4543       if (row_info->bit_depth == 8)
  4579                if (*(sp - 5) == red_high &&
  4544       {
  4580                    *(sp - 4) == red_low &&
  4545          png_byte red = (png_byte)(trans_color->red & 0xff);
  4581                    *(sp - 3) == green_high &&
  4546          png_byte green = (png_byte)(trans_color->green & 0xff);
  4582                    *(sp - 2) == green_low &&
  4547          png_byte blue = (png_byte)(trans_color->blue & 0xff);
  4583                    *(sp - 1) == blue_high &&
  4548          sp = row + (size_t)row_info->rowbytes - 1;
  4584                    *(sp    ) == blue_low)
  4549          dp = row + ((size_t)row_width << 2) - 1;
  4585                {
  4550          for (i = 0; i < row_width; i++)
  4586                   *dp-- = 0;
  4551          {
  4587                   *dp-- = 0;
  4552             if (*(sp - 2) == red && *(sp - 1) == green && *(sp) == blue)
  4588                }
  4553                *dp-- = 0;
  4589 
  4554 
  4590                else
  4555             else
  4591                {
  4556                *dp-- = 0xff;
  4592                   *dp-- = 0xff;
  4557 
  4593                   *dp-- = 0xff;
  4558             *dp-- = *sp--;
  4594                }
  4559             *dp-- = *sp--;
  4595 
  4560             *dp-- = *sp--;
  4596                *dp-- = *sp--;
  4561          }
  4597                *dp-- = *sp--;
  4562       }
  4598                *dp-- = *sp--;
  4563       else if (row_info->bit_depth == 16)
  4599                *dp-- = *sp--;
  4564       {
  4600                *dp-- = *sp--;
  4565          png_byte red_high = (png_byte)((trans_color->red >> 8) & 0xff);
  4601                *dp-- = *sp--;
  4566          png_byte green_high = (png_byte)((trans_color->green >> 8) & 0xff);
  4602             }
  4567          png_byte blue_high = (png_byte)((trans_color->blue >> 8) & 0xff);
  4603          }
  4568          png_byte red_low = (png_byte)(trans_color->red & 0xff);
  4604          row_info->color_type = PNG_COLOR_TYPE_RGB_ALPHA;
  4569          png_byte green_low = (png_byte)(trans_color->green & 0xff);
  4605          row_info->channels = 4;
  4570          png_byte blue_low = (png_byte)(trans_color->blue & 0xff);
  4606          row_info->pixel_depth = (png_byte)(row_info->bit_depth << 2);
  4571          sp = row + row_info->rowbytes - 1;
  4607          row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width);
  4572          dp = row + ((size_t)row_width << 3) - 1;
  4608       }
  4573          for (i = 0; i < row_width; i++)
       
  4574          {
       
  4575             if (*(sp - 5) == red_high &&
       
  4576                 *(sp - 4) == red_low &&
       
  4577                 *(sp - 3) == green_high &&
       
  4578                 *(sp - 2) == green_low &&
       
  4579                 *(sp - 1) == blue_high &&
       
  4580                 *(sp    ) == blue_low)
       
  4581             {
       
  4582                *dp-- = 0;
       
  4583                *dp-- = 0;
       
  4584             }
       
  4585 
       
  4586             else
       
  4587             {
       
  4588                *dp-- = 0xff;
       
  4589                *dp-- = 0xff;
       
  4590             }
       
  4591 
       
  4592             *dp-- = *sp--;
       
  4593             *dp-- = *sp--;
       
  4594             *dp-- = *sp--;
       
  4595             *dp-- = *sp--;
       
  4596             *dp-- = *sp--;
       
  4597             *dp-- = *sp--;
       
  4598          }
       
  4599       }
       
  4600       row_info->color_type = PNG_COLOR_TYPE_RGB_ALPHA;
       
  4601       row_info->channels = 4;
       
  4602       row_info->pixel_depth = (png_byte)(row_info->bit_depth << 2);
       
  4603       row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width);
  4609    }
  4604    }
  4610 }
  4605 }
  4611 #endif
  4606 #endif
  4612 
  4607 
  4613 #ifdef PNG_READ_EXPAND_16_SUPPORTED
  4608 #ifdef PNG_READ_EXPAND_16_SUPPORTED
  4786              (png_ptr->transformations & PNG_EXPAND_tRNS) != 0)
  4781              (png_ptr->transformations & PNG_EXPAND_tRNS) != 0)
  4787             png_do_expand(row_info, png_ptr->row_buf + 1,
  4782             png_do_expand(row_info, png_ptr->row_buf + 1,
  4788                 &(png_ptr->trans_color));
  4783                 &(png_ptr->trans_color));
  4789 
  4784 
  4790          else
  4785          else
  4791             png_do_expand(row_info, png_ptr->row_buf + 1,
  4786             png_do_expand(row_info, png_ptr->row_buf + 1, NULL);
  4792                 NULL);
       
  4793       }
  4787       }
  4794    }
  4788    }
  4795 #endif
  4789 #endif
  4796 
  4790 
  4797 #ifdef PNG_READ_STRIP_ALPHA_SUPPORTED
  4791 #ifdef PNG_READ_STRIP_ALPHA_SUPPORTED
  5011       if (png_ptr->read_user_transform_fn != NULL)
  5005       if (png_ptr->read_user_transform_fn != NULL)
  5012          (*(png_ptr->read_user_transform_fn)) /* User read transform function */
  5006          (*(png_ptr->read_user_transform_fn)) /* User read transform function */
  5013              (png_ptr,     /* png_ptr */
  5007              (png_ptr,     /* png_ptr */
  5014              row_info,     /* row_info: */
  5008              row_info,     /* row_info: */
  5015                 /*  png_uint_32 width;       width of row */
  5009                 /*  png_uint_32 width;       width of row */
  5016                 /*  png_size_t rowbytes;     number of bytes in row */
  5010                 /*  size_t rowbytes;         number of bytes in row */
  5017                 /*  png_byte color_type;     color type of pixels */
  5011                 /*  png_byte color_type;     color type of pixels */
  5018                 /*  png_byte bit_depth;      bit depth of samples */
  5012                 /*  png_byte bit_depth;      bit depth of samples */
  5019                 /*  png_byte channels;       number of channels (1-4) */
  5013                 /*  png_byte channels;       number of channels (1-4) */
  5020                 /*  png_byte pixel_depth;    bits per pixel (depth*channels) */
  5014                 /*  png_byte pixel_depth;    bits per pixel (depth*channels) */
  5021              png_ptr->row_buf + 1);    /* start of pixel data for row */
  5015              png_ptr->row_buf + 1);    /* start of pixel data for row */