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 */ |
} |