| Index: third_party/libpng/pngwutil.c
|
| diff --git a/third_party/libpng/pngwutil.c b/third_party/libpng/pngwutil.c
|
| index c75f53eb7de8d83ed78aa96752e327b851f20e50..bc6c98669c5a0b31edf1f4a61559ba948477926b 100644
|
| --- a/third_party/libpng/pngwutil.c
|
| +++ b/third_party/libpng/pngwutil.c
|
| @@ -1,8 +1,8 @@
|
|
|
| /* pngwutil.c - utilities to write a PNG file
|
| *
|
| - * Last changed in libpng 1.2.43 [February 25, 2010]
|
| - * Copyright (c) 1998-2010 Glenn Randers-Pehrson
|
| + * Last changed in libpng 1.2.54 [November 12, 2015]
|
| + * Copyright (c) 1998-2015 Glenn Randers-Pehrson
|
| * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
| * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
| *
|
| @@ -254,7 +254,7 @@ png_text_compress(png_structp png_ptr,
|
| old_ptr = comp->output_ptr;
|
| comp->output_ptr = (png_charpp)png_malloc(png_ptr,
|
| (png_uint_32)
|
| - (comp->max_output_ptr * png_sizeof(png_charpp)));
|
| + (comp->max_output_ptr * png_sizeof(png_charp)));
|
| png_memcpy(comp->output_ptr, old_ptr, old_max
|
| * png_sizeof(png_charp));
|
| png_free(png_ptr, old_ptr);
|
| @@ -575,17 +575,20 @@ png_write_PLTE(png_structp png_ptr, png_colorp palette, png_uint_32 num_pal)
|
| #ifdef PNG_USE_LOCAL_ARRAYS
|
| PNG_PLTE;
|
| #endif
|
| - png_uint_32 i;
|
| + png_uint_32 max_palette_length, i;
|
| png_colorp pal_ptr;
|
| png_byte buf[3];
|
|
|
| png_debug(1, "in png_write_PLTE");
|
|
|
| + max_palette_length = (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) ?
|
| + (1 << png_ptr->bit_depth) : PNG_MAX_PALETTE_LENGTH;
|
| +
|
| if ((
|
| #ifdef PNG_MNG_FEATURES_SUPPORTED
|
| !(png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE) &&
|
| #endif
|
| - num_pal == 0) || num_pal > 256)
|
| + num_pal == 0) || num_pal > max_palette_length)
|
| {
|
| if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
|
| {
|
| @@ -1759,6 +1762,7 @@ void /* PRIVATE */
|
| png_write_start_row(png_structp png_ptr)
|
| {
|
| #ifdef PNG_WRITE_INTERLACING_SUPPORTED
|
| +#ifndef PNG_USE_GLOBAL_ARRAYS
|
| /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
|
|
|
| /* Start of interlace block */
|
| @@ -1773,6 +1777,7 @@ png_write_start_row(png_structp png_ptr)
|
| /* Offset to next interlace block in the y direction */
|
| int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};
|
| #endif
|
| +#endif
|
|
|
| png_size_t buf_size;
|
|
|
| @@ -1857,6 +1862,7 @@ void /* PRIVATE */
|
| png_write_finish_row(png_structp png_ptr)
|
| {
|
| #ifdef PNG_WRITE_INTERLACING_SUPPORTED
|
| +#ifndef PNG_USE_GLOBAL_ARRAYS
|
| /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
|
|
|
| /* Start of interlace block */
|
| @@ -1871,6 +1877,7 @@ png_write_finish_row(png_structp png_ptr)
|
| /* Offset to next interlace block in the y direction */
|
| int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};
|
| #endif
|
| +#endif
|
|
|
| int ret;
|
|
|
| @@ -1976,11 +1983,13 @@ png_do_write_interlace(png_row_infop row_info, png_bytep row, int pass)
|
| {
|
| /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
|
|
|
| +#ifndef PNG_USE_GLOBAL_ARRAYS
|
| /* Start of interlace block */
|
| int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};
|
|
|
| /* Offset to next interlace block */
|
| int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
|
| +#endif
|
|
|
| png_debug(1, "in png_do_write_interlace");
|
|
|
| @@ -2150,20 +2159,9 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
|
| png_uint_32 mins, bpp;
|
| png_byte filter_to_do = png_ptr->do_filter;
|
| png_uint_32 row_bytes = row_info->rowbytes;
|
| -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
|
| - int num_p_filters = (int)png_ptr->num_prev_filters;
|
| -#endif
|
|
|
| png_debug(1, "in png_write_find_filter");
|
|
|
| -#ifndef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
|
| - if (png_ptr->row_number == 0 && filter_to_do == PNG_ALL_FILTERS)
|
| - {
|
| - /* These will never be selected so we need not test them. */
|
| - filter_to_do &= ~(PNG_FILTER_UP | PNG_FILTER_PAETH);
|
| - }
|
| -#endif
|
| -
|
| /* Find out how many bytes offset each pixel is */
|
| bpp = (row_info->pixel_depth + 7) >> 3;
|
|
|
| @@ -2213,41 +2211,6 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
|
| sum += (v < 128) ? v : 256 - v;
|
| }
|
|
|
| -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
|
| - if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
|
| - {
|
| - png_uint_32 sumhi, sumlo;
|
| - int j;
|
| - sumlo = sum & PNG_LOMASK;
|
| - sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; /* Gives us some footroom */
|
| -
|
| - /* Reduce the sum if we match any of the previous rows */
|
| - for (j = 0; j < num_p_filters; j++)
|
| - {
|
| - if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_NONE)
|
| - {
|
| - sumlo = (sumlo * png_ptr->filter_weights[j]) >>
|
| - PNG_WEIGHT_SHIFT;
|
| - sumhi = (sumhi * png_ptr->filter_weights[j]) >>
|
| - PNG_WEIGHT_SHIFT;
|
| - }
|
| - }
|
| -
|
| - /* Factor in the cost of this filter (this is here for completeness,
|
| - * but it makes no sense to have a "cost" for the NONE filter, as
|
| - * it has the minimum possible computational cost - none).
|
| - */
|
| - sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_NONE]) >>
|
| - PNG_COST_SHIFT;
|
| - sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_NONE]) >>
|
| - PNG_COST_SHIFT;
|
| -
|
| - if (sumhi > PNG_HIMASK)
|
| - sum = PNG_MAXSUM;
|
| - else
|
| - sum = (sumhi << PNG_HISHIFT) + sumlo;
|
| - }
|
| -#endif
|
| mins = sum;
|
| }
|
|
|
| @@ -2277,41 +2240,6 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
|
| png_uint_32 i;
|
| int v;
|
|
|
| -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
|
| - /* We temporarily increase the "minimum sum" by the factor we
|
| - * would reduce the sum of this filter, so that we can do the
|
| - * early exit comparison without scaling the sum each time.
|
| - */
|
| - if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
|
| - {
|
| - int j;
|
| - png_uint_32 lmhi, lmlo;
|
| - lmlo = lmins & PNG_LOMASK;
|
| - lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK;
|
| -
|
| - for (j = 0; j < num_p_filters; j++)
|
| - {
|
| - if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_SUB)
|
| - {
|
| - lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >>
|
| - PNG_WEIGHT_SHIFT;
|
| - lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >>
|
| - PNG_WEIGHT_SHIFT;
|
| - }
|
| - }
|
| -
|
| - lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >>
|
| - PNG_COST_SHIFT;
|
| - lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >>
|
| - PNG_COST_SHIFT;
|
| -
|
| - if (lmhi > PNG_HIMASK)
|
| - lmins = PNG_MAXSUM;
|
| - else
|
| - lmins = (lmhi << PNG_HISHIFT) + lmlo;
|
| - }
|
| -#endif
|
| -
|
| for (i = 0, rp = row_buf + 1, dp = png_ptr->sub_row + 1; i < bpp;
|
| i++, rp++, dp++)
|
| {
|
| @@ -2330,37 +2258,6 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
|
| break;
|
| }
|
|
|
| -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
|
| - if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
|
| - {
|
| - int j;
|
| - png_uint_32 sumhi, sumlo;
|
| - sumlo = sum & PNG_LOMASK;
|
| - sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK;
|
| -
|
| - for (j = 0; j < num_p_filters; j++)
|
| - {
|
| - if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_SUB)
|
| - {
|
| - sumlo = (sumlo * png_ptr->inv_filter_weights[j]) >>
|
| - PNG_WEIGHT_SHIFT;
|
| - sumhi = (sumhi * png_ptr->inv_filter_weights[j]) >>
|
| - PNG_WEIGHT_SHIFT;
|
| - }
|
| - }
|
| -
|
| - sumlo = (sumlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >>
|
| - PNG_COST_SHIFT;
|
| - sumhi = (sumhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >>
|
| - PNG_COST_SHIFT;
|
| -
|
| - if (sumhi > PNG_HIMASK)
|
| - sum = PNG_MAXSUM;
|
| - else
|
| - sum = (sumhi << PNG_HISHIFT) + sumlo;
|
| - }
|
| -#endif
|
| -
|
| if (sum < mins)
|
| {
|
| mins = sum;
|
| @@ -2390,38 +2287,6 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
|
| png_uint_32 i;
|
| int v;
|
|
|
| -
|
| -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
|
| - if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
|
| - {
|
| - int j;
|
| - png_uint_32 lmhi, lmlo;
|
| - lmlo = lmins & PNG_LOMASK;
|
| - lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK;
|
| -
|
| - for (j = 0; j < num_p_filters; j++)
|
| - {
|
| - if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_UP)
|
| - {
|
| - lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >>
|
| - PNG_WEIGHT_SHIFT;
|
| - lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >>
|
| - PNG_WEIGHT_SHIFT;
|
| - }
|
| - }
|
| -
|
| - lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_UP]) >>
|
| - PNG_COST_SHIFT;
|
| - lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_UP]) >>
|
| - PNG_COST_SHIFT;
|
| -
|
| - if (lmhi > PNG_HIMASK)
|
| - lmins = PNG_MAXSUM;
|
| - else
|
| - lmins = (lmhi << PNG_HISHIFT) + lmlo;
|
| - }
|
| -#endif
|
| -
|
| for (i = 0, rp = row_buf + 1, dp = png_ptr->up_row + 1,
|
| pp = prev_row + 1; i < row_bytes; i++)
|
| {
|
| @@ -2433,37 +2298,6 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
|
| break;
|
| }
|
|
|
| -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
|
| - if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
|
| - {
|
| - int j;
|
| - png_uint_32 sumhi, sumlo;
|
| - sumlo = sum & PNG_LOMASK;
|
| - sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK;
|
| -
|
| - for (j = 0; j < num_p_filters; j++)
|
| - {
|
| - if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_UP)
|
| - {
|
| - sumlo = (sumlo * png_ptr->filter_weights[j]) >>
|
| - PNG_WEIGHT_SHIFT;
|
| - sumhi = (sumhi * png_ptr->filter_weights[j]) >>
|
| - PNG_WEIGHT_SHIFT;
|
| - }
|
| - }
|
| -
|
| - sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_UP]) >>
|
| - PNG_COST_SHIFT;
|
| - sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_UP]) >>
|
| - PNG_COST_SHIFT;
|
| -
|
| - if (sumhi > PNG_HIMASK)
|
| - sum = PNG_MAXSUM;
|
| - else
|
| - sum = (sumhi << PNG_HISHIFT) + sumlo;
|
| - }
|
| -#endif
|
| -
|
| if (sum < mins)
|
| {
|
| mins = sum;
|
| @@ -2496,37 +2330,6 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
|
| png_uint_32 i;
|
| int v;
|
|
|
| -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
|
| - if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
|
| - {
|
| - int j;
|
| - png_uint_32 lmhi, lmlo;
|
| - lmlo = lmins & PNG_LOMASK;
|
| - lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK;
|
| -
|
| - for (j = 0; j < num_p_filters; j++)
|
| - {
|
| - if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_AVG)
|
| - {
|
| - lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >>
|
| - PNG_WEIGHT_SHIFT;
|
| - lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >>
|
| - PNG_WEIGHT_SHIFT;
|
| - }
|
| - }
|
| -
|
| - lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_AVG]) >>
|
| - PNG_COST_SHIFT;
|
| - lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_AVG]) >>
|
| - PNG_COST_SHIFT;
|
| -
|
| - if (lmhi > PNG_HIMASK)
|
| - lmins = PNG_MAXSUM;
|
| - else
|
| - lmins = (lmhi << PNG_HISHIFT) + lmlo;
|
| - }
|
| -#endif
|
| -
|
| for (i = 0, rp = row_buf + 1, dp = png_ptr->avg_row + 1,
|
| pp = prev_row + 1; i < bpp; i++)
|
| {
|
| @@ -2545,37 +2348,6 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
|
| break;
|
| }
|
|
|
| -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
|
| - if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
|
| - {
|
| - int j;
|
| - png_uint_32 sumhi, sumlo;
|
| - sumlo = sum & PNG_LOMASK;
|
| - sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK;
|
| -
|
| - for (j = 0; j < num_p_filters; j++)
|
| - {
|
| - if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_NONE)
|
| - {
|
| - sumlo = (sumlo * png_ptr->filter_weights[j]) >>
|
| - PNG_WEIGHT_SHIFT;
|
| - sumhi = (sumhi * png_ptr->filter_weights[j]) >>
|
| - PNG_WEIGHT_SHIFT;
|
| - }
|
| - }
|
| -
|
| - sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_AVG]) >>
|
| - PNG_COST_SHIFT;
|
| - sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_AVG]) >>
|
| - PNG_COST_SHIFT;
|
| -
|
| - if (sumhi > PNG_HIMASK)
|
| - sum = PNG_MAXSUM;
|
| - else
|
| - sum = (sumhi << PNG_HISHIFT) + sumlo;
|
| - }
|
| -#endif
|
| -
|
| if (sum < mins)
|
| {
|
| mins = sum;
|
| @@ -2629,37 +2401,6 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
|
| png_uint_32 i;
|
| int v;
|
|
|
| -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
|
| - if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
|
| - {
|
| - int j;
|
| - png_uint_32 lmhi, lmlo;
|
| - lmlo = lmins & PNG_LOMASK;
|
| - lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK;
|
| -
|
| - for (j = 0; j < num_p_filters; j++)
|
| - {
|
| - if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_PAETH)
|
| - {
|
| - lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >>
|
| - PNG_WEIGHT_SHIFT;
|
| - lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >>
|
| - PNG_WEIGHT_SHIFT;
|
| - }
|
| - }
|
| -
|
| - lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_PAETH]) >>
|
| - PNG_COST_SHIFT;
|
| - lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_PAETH]) >>
|
| - PNG_COST_SHIFT;
|
| -
|
| - if (lmhi > PNG_HIMASK)
|
| - lmins = PNG_MAXSUM;
|
| - else
|
| - lmins = (lmhi << PNG_HISHIFT) + lmlo;
|
| - }
|
| -#endif
|
| -
|
| for (i = 0, rp = row_buf + 1, dp = png_ptr->paeth_row + 1,
|
| pp = prev_row + 1; i < bpp; i++)
|
| {
|
| @@ -2710,37 +2451,6 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
|
| break;
|
| }
|
|
|
| -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
|
| - if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
|
| - {
|
| - int j;
|
| - png_uint_32 sumhi, sumlo;
|
| - sumlo = sum & PNG_LOMASK;
|
| - sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK;
|
| -
|
| - for (j = 0; j < num_p_filters; j++)
|
| - {
|
| - if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_PAETH)
|
| - {
|
| - sumlo = (sumlo * png_ptr->filter_weights[j]) >>
|
| - PNG_WEIGHT_SHIFT;
|
| - sumhi = (sumhi * png_ptr->filter_weights[j]) >>
|
| - PNG_WEIGHT_SHIFT;
|
| - }
|
| - }
|
| -
|
| - sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_PAETH]) >>
|
| - PNG_COST_SHIFT;
|
| - sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_PAETH]) >>
|
| - PNG_COST_SHIFT;
|
| -
|
| - if (sumhi > PNG_HIMASK)
|
| - sum = PNG_MAXSUM;
|
| - else
|
| - sum = (sumhi << PNG_HISHIFT) + sumlo;
|
| - }
|
| -#endif
|
| -
|
| if (sum < mins)
|
| {
|
| best_row = png_ptr->paeth_row;
|
| @@ -2750,21 +2460,6 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
|
| /* Do the actual writing of the filtered row data from the chosen filter. */
|
|
|
| png_write_filtered_row(png_ptr, best_row);
|
| -
|
| -#ifdef PNG_WRITE_FILTER_SUPPORTED
|
| -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
|
| - /* Save the type of filter we picked this time for future calculations */
|
| - if (png_ptr->num_prev_filters > 0)
|
| - {
|
| - int j;
|
| - for (j = 1; j < num_p_filters; j++)
|
| - {
|
| - png_ptr->prev_filters[j] = png_ptr->prev_filters[j - 1];
|
| - }
|
| - png_ptr->prev_filters[j] = best_row[0];
|
| - }
|
| -#endif
|
| -#endif /* PNG_WRITE_FILTER_SUPPORTED */
|
| }
|
|
|
|
|
|
|