Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(227)

Side by Side Diff: third_party/libpng/pngwutil.c

Issue 1467263003: third_party/libpng: update to 1.2.54 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« third_party/libpng/pngset.c ('K') | « third_party/libpng/pngwrite.c ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 /* pngwutil.c - utilities to write a PNG file 2 /* pngwutil.c - utilities to write a PNG file
3 * 3 *
4 * Last changed in libpng 1.2.43 [February 25, 2010] 4 * Last changed in libpng 1.2.54 [November 12, 2015]
5 * Copyright (c) 1998-2010 Glenn Randers-Pehrson 5 * Copyright (c) 1998-2015 Glenn Randers-Pehrson
6 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) 6 * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
7 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) 7 * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
8 * 8 *
9 * This code is released under the libpng license. 9 * This code is released under the libpng license.
10 * For conditions of distribution and use, see the disclaimer 10 * For conditions of distribution and use, see the disclaimer
11 * and license in png.h 11 * and license in png.h
12 */ 12 */
13 13
14 #define PNG_INTERNAL 14 #define PNG_INTERNAL
15 #define PNG_NO_PEDANTIC_WARNINGS 15 #define PNG_NO_PEDANTIC_WARNINGS
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
247 247
248 old_max = comp->max_output_ptr; 248 old_max = comp->max_output_ptr;
249 comp->max_output_ptr = comp->num_output_ptr + 4; 249 comp->max_output_ptr = comp->num_output_ptr + 4;
250 if (comp->output_ptr != NULL) 250 if (comp->output_ptr != NULL)
251 { 251 {
252 png_charpp old_ptr; 252 png_charpp old_ptr;
253 253
254 old_ptr = comp->output_ptr; 254 old_ptr = comp->output_ptr;
255 comp->output_ptr = (png_charpp)png_malloc(png_ptr, 255 comp->output_ptr = (png_charpp)png_malloc(png_ptr,
256 (png_uint_32) 256 (png_uint_32)
257 (comp->max_output_ptr * png_sizeof(png_charpp))); 257 (comp->max_output_ptr * png_sizeof(png_charp)));
258 png_memcpy(comp->output_ptr, old_ptr, old_max 258 png_memcpy(comp->output_ptr, old_ptr, old_max
259 * png_sizeof(png_charp)); 259 * png_sizeof(png_charp));
260 png_free(png_ptr, old_ptr); 260 png_free(png_ptr, old_ptr);
261 } 261 }
262 else 262 else
263 comp->output_ptr = (png_charpp)png_malloc(png_ptr, 263 comp->output_ptr = (png_charpp)png_malloc(png_ptr,
264 (png_uint_32) 264 (png_uint_32)
265 (comp->max_output_ptr * png_sizeof(png_charp))); 265 (comp->max_output_ptr * png_sizeof(png_charp)));
266 } 266 }
267 267
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after
568 /* Write the palette. We are careful not to trust png_color to be in the 568 /* Write the palette. We are careful not to trust png_color to be in the
569 * correct order for PNG, so people can redefine it to any convenient 569 * correct order for PNG, so people can redefine it to any convenient
570 * structure. 570 * structure.
571 */ 571 */
572 void /* PRIVATE */ 572 void /* PRIVATE */
573 png_write_PLTE(png_structp png_ptr, png_colorp palette, png_uint_32 num_pal) 573 png_write_PLTE(png_structp png_ptr, png_colorp palette, png_uint_32 num_pal)
574 { 574 {
575 #ifdef PNG_USE_LOCAL_ARRAYS 575 #ifdef PNG_USE_LOCAL_ARRAYS
576 PNG_PLTE; 576 PNG_PLTE;
577 #endif 577 #endif
578 png_uint_32 i; 578 png_uint_32 max_palette_length, i;
579 png_colorp pal_ptr; 579 png_colorp pal_ptr;
580 png_byte buf[3]; 580 png_byte buf[3];
581 581
582 png_debug(1, "in png_write_PLTE"); 582 png_debug(1, "in png_write_PLTE");
583 583
584 max_palette_length = (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) ?
585 (1 << png_ptr->bit_depth) : PNG_MAX_PALETTE_LENGTH;
586
584 if (( 587 if ((
585 #ifdef PNG_MNG_FEATURES_SUPPORTED 588 #ifdef PNG_MNG_FEATURES_SUPPORTED
586 !(png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE) && 589 !(png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE) &&
587 #endif 590 #endif
588 num_pal == 0) || num_pal > 256) 591 num_pal == 0) || num_pal > max_palette_length)
589 { 592 {
590 if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) 593 if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
591 { 594 {
592 png_error(png_ptr, "Invalid number of colors in palette"); 595 png_error(png_ptr, "Invalid number of colors in palette");
593 } 596 }
594 else 597 else
595 { 598 {
596 png_warning(png_ptr, "Invalid number of colors in palette"); 599 png_warning(png_ptr, "Invalid number of colors in palette");
597 return; 600 return;
598 } 601 }
(...skipping 1153 matching lines...) Expand 10 before | Expand all | Expand 10 after
1752 1755
1753 png_write_chunk(png_ptr, (png_bytep)png_tIME, buf, (png_size_t)7); 1756 png_write_chunk(png_ptr, (png_bytep)png_tIME, buf, (png_size_t)7);
1754 } 1757 }
1755 #endif 1758 #endif
1756 1759
1757 /* Initializes the row writing capability of libpng */ 1760 /* Initializes the row writing capability of libpng */
1758 void /* PRIVATE */ 1761 void /* PRIVATE */
1759 png_write_start_row(png_structp png_ptr) 1762 png_write_start_row(png_structp png_ptr)
1760 { 1763 {
1761 #ifdef PNG_WRITE_INTERLACING_SUPPORTED 1764 #ifdef PNG_WRITE_INTERLACING_SUPPORTED
1765 #ifndef PNG_USE_GLOBAL_ARRAYS
1762 /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ 1766 /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
1763 1767
1764 /* Start of interlace block */ 1768 /* Start of interlace block */
1765 int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; 1769 int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};
1766 1770
1767 /* Offset to next interlace block */ 1771 /* Offset to next interlace block */
1768 int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; 1772 int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
1769 1773
1770 /* Start of interlace block in the y direction */ 1774 /* Start of interlace block in the y direction */
1771 int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1}; 1775 int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1};
1772 1776
1773 /* Offset to next interlace block in the y direction */ 1777 /* Offset to next interlace block in the y direction */
1774 int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2}; 1778 int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};
1775 #endif 1779 #endif
1780 #endif
1776 1781
1777 png_size_t buf_size; 1782 png_size_t buf_size;
1778 1783
1779 png_debug(1, "in png_write_start_row"); 1784 png_debug(1, "in png_write_start_row");
1780 1785
1781 buf_size = (png_size_t)(PNG_ROWBYTES( 1786 buf_size = (png_size_t)(PNG_ROWBYTES(
1782 png_ptr->usr_channels*png_ptr->usr_bit_depth, png_ptr->width) + 1); 1787 png_ptr->usr_channels*png_ptr->usr_bit_depth, png_ptr->width) + 1);
1783 1788
1784 /* Set up row buffer */ 1789 /* Set up row buffer */
1785 png_ptr->row_buf = (png_bytep)png_malloc(png_ptr, 1790 png_ptr->row_buf = (png_bytep)png_malloc(png_ptr,
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
1850 } 1855 }
1851 png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; 1856 png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
1852 png_ptr->zstream.next_out = png_ptr->zbuf; 1857 png_ptr->zstream.next_out = png_ptr->zbuf;
1853 } 1858 }
1854 1859
1855 /* Internal use only. Called when finished processing a row of data. */ 1860 /* Internal use only. Called when finished processing a row of data. */
1856 void /* PRIVATE */ 1861 void /* PRIVATE */
1857 png_write_finish_row(png_structp png_ptr) 1862 png_write_finish_row(png_structp png_ptr)
1858 { 1863 {
1859 #ifdef PNG_WRITE_INTERLACING_SUPPORTED 1864 #ifdef PNG_WRITE_INTERLACING_SUPPORTED
1865 #ifndef PNG_USE_GLOBAL_ARRAYS
1860 /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ 1866 /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
1861 1867
1862 /* Start of interlace block */ 1868 /* Start of interlace block */
1863 int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; 1869 int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};
1864 1870
1865 /* Offset to next interlace block */ 1871 /* Offset to next interlace block */
1866 int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; 1872 int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
1867 1873
1868 /* Start of interlace block in the y direction */ 1874 /* Start of interlace block in the y direction */
1869 int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1}; 1875 int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1};
1870 1876
1871 /* Offset to next interlace block in the y direction */ 1877 /* Offset to next interlace block in the y direction */
1872 int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2}; 1878 int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};
1873 #endif 1879 #endif
1880 #endif
1874 1881
1875 int ret; 1882 int ret;
1876 1883
1877 png_debug(1, "in png_write_finish_row"); 1884 png_debug(1, "in png_write_finish_row");
1878 1885
1879 /* Next row */ 1886 /* Next row */
1880 png_ptr->row_number++; 1887 png_ptr->row_number++;
1881 1888
1882 /* See if we are done */ 1889 /* See if we are done */
1883 if (png_ptr->row_number < png_ptr->num_rows) 1890 if (png_ptr->row_number < png_ptr->num_rows)
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
1969 * pointer and a destination pointer (sp and dp), and copy the 1976 * pointer and a destination pointer (sp and dp), and copy the
1970 * correct pixels for the pass. As the row gets compacted, 1977 * correct pixels for the pass. As the row gets compacted,
1971 * sp will always be >= dp, so we should never overwrite anything. 1978 * sp will always be >= dp, so we should never overwrite anything.
1972 * See the default: case for the easiest code to understand. 1979 * See the default: case for the easiest code to understand.
1973 */ 1980 */
1974 void /* PRIVATE */ 1981 void /* PRIVATE */
1975 png_do_write_interlace(png_row_infop row_info, png_bytep row, int pass) 1982 png_do_write_interlace(png_row_infop row_info, png_bytep row, int pass)
1976 { 1983 {
1977 /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ 1984 /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */
1978 1985
1986 #ifndef PNG_USE_GLOBAL_ARRAYS
1979 /* Start of interlace block */ 1987 /* Start of interlace block */
1980 int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; 1988 int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};
1981 1989
1982 /* Offset to next interlace block */ 1990 /* Offset to next interlace block */
1983 int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; 1991 int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
1992 #endif
1984 1993
1985 png_debug(1, "in png_do_write_interlace"); 1994 png_debug(1, "in png_do_write_interlace");
1986 1995
1987 /* We don't have to do anything on the last pass (6) */ 1996 /* We don't have to do anything on the last pass (6) */
1988 #ifdef PNG_USELESS_TESTS_SUPPORTED 1997 #ifdef PNG_USELESS_TESTS_SUPPORTED
1989 if (row != NULL && row_info != NULL && pass < 6) 1998 if (row != NULL && row_info != NULL && pass < 6)
1990 #else 1999 #else
1991 if (pass < 6) 2000 if (pass < 6)
1992 #endif 2001 #endif
1993 { 2002 {
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
2143 #define PNG_HIMASK ((png_uint_32)(~PNG_LOMASK >> PNG_HISHIFT)) 2152 #define PNG_HIMASK ((png_uint_32)(~PNG_LOMASK >> PNG_HISHIFT))
2144 void /* PRIVATE */ 2153 void /* PRIVATE */
2145 png_write_find_filter(png_structp png_ptr, png_row_infop row_info) 2154 png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
2146 { 2155 {
2147 png_bytep best_row; 2156 png_bytep best_row;
2148 #ifdef PNG_WRITE_FILTER_SUPPORTED 2157 #ifdef PNG_WRITE_FILTER_SUPPORTED
2149 png_bytep prev_row, row_buf; 2158 png_bytep prev_row, row_buf;
2150 png_uint_32 mins, bpp; 2159 png_uint_32 mins, bpp;
2151 png_byte filter_to_do = png_ptr->do_filter; 2160 png_byte filter_to_do = png_ptr->do_filter;
2152 png_uint_32 row_bytes = row_info->rowbytes; 2161 png_uint_32 row_bytes = row_info->rowbytes;
2153 #ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
2154 int num_p_filters = (int)png_ptr->num_prev_filters;
2155 #endif
2156 2162
2157 png_debug(1, "in png_write_find_filter"); 2163 png_debug(1, "in png_write_find_filter");
2158 2164
2159 #ifndef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
2160 if (png_ptr->row_number == 0 && filter_to_do == PNG_ALL_FILTERS)
2161 {
2162 /* These will never be selected so we need not test them. */
2163 filter_to_do &= ~(PNG_FILTER_UP | PNG_FILTER_PAETH);
2164 }
2165 #endif
2166
2167 /* Find out how many bytes offset each pixel is */ 2165 /* Find out how many bytes offset each pixel is */
2168 bpp = (row_info->pixel_depth + 7) >> 3; 2166 bpp = (row_info->pixel_depth + 7) >> 3;
2169 2167
2170 prev_row = png_ptr->prev_row; 2168 prev_row = png_ptr->prev_row;
2171 #endif 2169 #endif
2172 best_row = png_ptr->row_buf; 2170 best_row = png_ptr->row_buf;
2173 #ifdef PNG_WRITE_FILTER_SUPPORTED 2171 #ifdef PNG_WRITE_FILTER_SUPPORTED
2174 row_buf = best_row; 2172 row_buf = best_row;
2175 mins = PNG_MAXSUM; 2173 mins = PNG_MAXSUM;
2176 2174
(...skipping 29 matching lines...) Expand all
2206 png_uint_32 sum = 0; 2204 png_uint_32 sum = 0;
2207 png_uint_32 i; 2205 png_uint_32 i;
2208 int v; 2206 int v;
2209 2207
2210 for (i = 0, rp = row_buf + 1; i < row_bytes; i++, rp++) 2208 for (i = 0, rp = row_buf + 1; i < row_bytes; i++, rp++)
2211 { 2209 {
2212 v = *rp; 2210 v = *rp;
2213 sum += (v < 128) ? v : 256 - v; 2211 sum += (v < 128) ? v : 256 - v;
2214 } 2212 }
2215 2213
2216 #ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
2217 if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
2218 {
2219 png_uint_32 sumhi, sumlo;
2220 int j;
2221 sumlo = sum & PNG_LOMASK;
2222 sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; /* Gives us some footroom */
2223
2224 /* Reduce the sum if we match any of the previous rows */
2225 for (j = 0; j < num_p_filters; j++)
2226 {
2227 if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_NONE)
2228 {
2229 sumlo = (sumlo * png_ptr->filter_weights[j]) >>
2230 PNG_WEIGHT_SHIFT;
2231 sumhi = (sumhi * png_ptr->filter_weights[j]) >>
2232 PNG_WEIGHT_SHIFT;
2233 }
2234 }
2235
2236 /* Factor in the cost of this filter (this is here for completeness,
2237 * but it makes no sense to have a "cost" for the NONE filter, as
2238 * it has the minimum possible computational cost - none).
2239 */
2240 sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_NONE]) >>
2241 PNG_COST_SHIFT;
2242 sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_NONE]) >>
2243 PNG_COST_SHIFT;
2244
2245 if (sumhi > PNG_HIMASK)
2246 sum = PNG_MAXSUM;
2247 else
2248 sum = (sumhi << PNG_HISHIFT) + sumlo;
2249 }
2250 #endif
2251 mins = sum; 2214 mins = sum;
2252 } 2215 }
2253 2216
2254 /* Sub filter */ 2217 /* Sub filter */
2255 if (filter_to_do == PNG_FILTER_SUB) 2218 if (filter_to_do == PNG_FILTER_SUB)
2256 /* It's the only filter so no testing is needed */ 2219 /* It's the only filter so no testing is needed */
2257 { 2220 {
2258 png_bytep rp, lp, dp; 2221 png_bytep rp, lp, dp;
2259 png_uint_32 i; 2222 png_uint_32 i;
2260 for (i = 0, rp = row_buf + 1, dp = png_ptr->sub_row + 1; i < bpp; 2223 for (i = 0, rp = row_buf + 1, dp = png_ptr->sub_row + 1; i < bpp;
2261 i++, rp++, dp++) 2224 i++, rp++, dp++)
2262 { 2225 {
2263 *dp = *rp; 2226 *dp = *rp;
2264 } 2227 }
2265 for (lp = row_buf + 1; i < row_bytes; 2228 for (lp = row_buf + 1; i < row_bytes;
2266 i++, rp++, lp++, dp++) 2229 i++, rp++, lp++, dp++)
2267 { 2230 {
2268 *dp = (png_byte)(((int)*rp - (int)*lp) & 0xff); 2231 *dp = (png_byte)(((int)*rp - (int)*lp) & 0xff);
2269 } 2232 }
2270 best_row = png_ptr->sub_row; 2233 best_row = png_ptr->sub_row;
2271 } 2234 }
2272 2235
2273 else if (filter_to_do & PNG_FILTER_SUB) 2236 else if (filter_to_do & PNG_FILTER_SUB)
2274 { 2237 {
2275 png_bytep rp, dp, lp; 2238 png_bytep rp, dp, lp;
2276 png_uint_32 sum = 0, lmins = mins; 2239 png_uint_32 sum = 0, lmins = mins;
2277 png_uint_32 i; 2240 png_uint_32 i;
2278 int v; 2241 int v;
2279 2242
2280 #ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
2281 /* We temporarily increase the "minimum sum" by the factor we
2282 * would reduce the sum of this filter, so that we can do the
2283 * early exit comparison without scaling the sum each time.
2284 */
2285 if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
2286 {
2287 int j;
2288 png_uint_32 lmhi, lmlo;
2289 lmlo = lmins & PNG_LOMASK;
2290 lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK;
2291
2292 for (j = 0; j < num_p_filters; j++)
2293 {
2294 if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_SUB)
2295 {
2296 lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >>
2297 PNG_WEIGHT_SHIFT;
2298 lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >>
2299 PNG_WEIGHT_SHIFT;
2300 }
2301 }
2302
2303 lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >>
2304 PNG_COST_SHIFT;
2305 lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >>
2306 PNG_COST_SHIFT;
2307
2308 if (lmhi > PNG_HIMASK)
2309 lmins = PNG_MAXSUM;
2310 else
2311 lmins = (lmhi << PNG_HISHIFT) + lmlo;
2312 }
2313 #endif
2314
2315 for (i = 0, rp = row_buf + 1, dp = png_ptr->sub_row + 1; i < bpp; 2243 for (i = 0, rp = row_buf + 1, dp = png_ptr->sub_row + 1; i < bpp;
2316 i++, rp++, dp++) 2244 i++, rp++, dp++)
2317 { 2245 {
2318 v = *dp = *rp; 2246 v = *dp = *rp;
2319 2247
2320 sum += (v < 128) ? v : 256 - v; 2248 sum += (v < 128) ? v : 256 - v;
2321 } 2249 }
2322 for (lp = row_buf + 1; i < row_bytes; 2250 for (lp = row_buf + 1; i < row_bytes;
2323 i++, rp++, lp++, dp++) 2251 i++, rp++, lp++, dp++)
2324 { 2252 {
2325 v = *dp = (png_byte)(((int)*rp - (int)*lp) & 0xff); 2253 v = *dp = (png_byte)(((int)*rp - (int)*lp) & 0xff);
2326 2254
2327 sum += (v < 128) ? v : 256 - v; 2255 sum += (v < 128) ? v : 256 - v;
2328 2256
2329 if (sum > lmins) /* We are already worse, don't continue. */ 2257 if (sum > lmins) /* We are already worse, don't continue. */
2330 break; 2258 break;
2331 } 2259 }
2332 2260
2333 #ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
2334 if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
2335 {
2336 int j;
2337 png_uint_32 sumhi, sumlo;
2338 sumlo = sum & PNG_LOMASK;
2339 sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK;
2340
2341 for (j = 0; j < num_p_filters; j++)
2342 {
2343 if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_SUB)
2344 {
2345 sumlo = (sumlo * png_ptr->inv_filter_weights[j]) >>
2346 PNG_WEIGHT_SHIFT;
2347 sumhi = (sumhi * png_ptr->inv_filter_weights[j]) >>
2348 PNG_WEIGHT_SHIFT;
2349 }
2350 }
2351
2352 sumlo = (sumlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >>
2353 PNG_COST_SHIFT;
2354 sumhi = (sumhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >>
2355 PNG_COST_SHIFT;
2356
2357 if (sumhi > PNG_HIMASK)
2358 sum = PNG_MAXSUM;
2359 else
2360 sum = (sumhi << PNG_HISHIFT) + sumlo;
2361 }
2362 #endif
2363
2364 if (sum < mins) 2261 if (sum < mins)
2365 { 2262 {
2366 mins = sum; 2263 mins = sum;
2367 best_row = png_ptr->sub_row; 2264 best_row = png_ptr->sub_row;
2368 } 2265 }
2369 } 2266 }
2370 2267
2371 /* Up filter */ 2268 /* Up filter */
2372 if (filter_to_do == PNG_FILTER_UP) 2269 if (filter_to_do == PNG_FILTER_UP)
2373 { 2270 {
2374 png_bytep rp, dp, pp; 2271 png_bytep rp, dp, pp;
2375 png_uint_32 i; 2272 png_uint_32 i;
2376 2273
2377 for (i = 0, rp = row_buf + 1, dp = png_ptr->up_row + 1, 2274 for (i = 0, rp = row_buf + 1, dp = png_ptr->up_row + 1,
2378 pp = prev_row + 1; i < row_bytes; 2275 pp = prev_row + 1; i < row_bytes;
2379 i++, rp++, pp++, dp++) 2276 i++, rp++, pp++, dp++)
2380 { 2277 {
2381 *dp = (png_byte)(((int)*rp - (int)*pp) & 0xff); 2278 *dp = (png_byte)(((int)*rp - (int)*pp) & 0xff);
2382 } 2279 }
2383 best_row = png_ptr->up_row; 2280 best_row = png_ptr->up_row;
2384 } 2281 }
2385 2282
2386 else if (filter_to_do & PNG_FILTER_UP) 2283 else if (filter_to_do & PNG_FILTER_UP)
2387 { 2284 {
2388 png_bytep rp, dp, pp; 2285 png_bytep rp, dp, pp;
2389 png_uint_32 sum = 0, lmins = mins; 2286 png_uint_32 sum = 0, lmins = mins;
2390 png_uint_32 i; 2287 png_uint_32 i;
2391 int v; 2288 int v;
2392 2289
2393
2394 #ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
2395 if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
2396 {
2397 int j;
2398 png_uint_32 lmhi, lmlo;
2399 lmlo = lmins & PNG_LOMASK;
2400 lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK;
2401
2402 for (j = 0; j < num_p_filters; j++)
2403 {
2404 if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_UP)
2405 {
2406 lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >>
2407 PNG_WEIGHT_SHIFT;
2408 lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >>
2409 PNG_WEIGHT_SHIFT;
2410 }
2411 }
2412
2413 lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_UP]) >>
2414 PNG_COST_SHIFT;
2415 lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_UP]) >>
2416 PNG_COST_SHIFT;
2417
2418 if (lmhi > PNG_HIMASK)
2419 lmins = PNG_MAXSUM;
2420 else
2421 lmins = (lmhi << PNG_HISHIFT) + lmlo;
2422 }
2423 #endif
2424
2425 for (i = 0, rp = row_buf + 1, dp = png_ptr->up_row + 1, 2290 for (i = 0, rp = row_buf + 1, dp = png_ptr->up_row + 1,
2426 pp = prev_row + 1; i < row_bytes; i++) 2291 pp = prev_row + 1; i < row_bytes; i++)
2427 { 2292 {
2428 v = *dp++ = (png_byte)(((int)*rp++ - (int)*pp++) & 0xff); 2293 v = *dp++ = (png_byte)(((int)*rp++ - (int)*pp++) & 0xff);
2429 2294
2430 sum += (v < 128) ? v : 256 - v; 2295 sum += (v < 128) ? v : 256 - v;
2431 2296
2432 if (sum > lmins) /* We are already worse, don't continue. */ 2297 if (sum > lmins) /* We are already worse, don't continue. */
2433 break; 2298 break;
2434 } 2299 }
2435 2300
2436 #ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
2437 if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
2438 {
2439 int j;
2440 png_uint_32 sumhi, sumlo;
2441 sumlo = sum & PNG_LOMASK;
2442 sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK;
2443
2444 for (j = 0; j < num_p_filters; j++)
2445 {
2446 if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_UP)
2447 {
2448 sumlo = (sumlo * png_ptr->filter_weights[j]) >>
2449 PNG_WEIGHT_SHIFT;
2450 sumhi = (sumhi * png_ptr->filter_weights[j]) >>
2451 PNG_WEIGHT_SHIFT;
2452 }
2453 }
2454
2455 sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_UP]) >>
2456 PNG_COST_SHIFT;
2457 sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_UP]) >>
2458 PNG_COST_SHIFT;
2459
2460 if (sumhi > PNG_HIMASK)
2461 sum = PNG_MAXSUM;
2462 else
2463 sum = (sumhi << PNG_HISHIFT) + sumlo;
2464 }
2465 #endif
2466
2467 if (sum < mins) 2301 if (sum < mins)
2468 { 2302 {
2469 mins = sum; 2303 mins = sum;
2470 best_row = png_ptr->up_row; 2304 best_row = png_ptr->up_row;
2471 } 2305 }
2472 } 2306 }
2473 2307
2474 /* Avg filter */ 2308 /* Avg filter */
2475 if (filter_to_do == PNG_FILTER_AVG) 2309 if (filter_to_do == PNG_FILTER_AVG)
2476 { 2310 {
(...skipping 12 matching lines...) Expand all
2489 best_row = png_ptr->avg_row; 2323 best_row = png_ptr->avg_row;
2490 } 2324 }
2491 2325
2492 else if (filter_to_do & PNG_FILTER_AVG) 2326 else if (filter_to_do & PNG_FILTER_AVG)
2493 { 2327 {
2494 png_bytep rp, dp, pp, lp; 2328 png_bytep rp, dp, pp, lp;
2495 png_uint_32 sum = 0, lmins = mins; 2329 png_uint_32 sum = 0, lmins = mins;
2496 png_uint_32 i; 2330 png_uint_32 i;
2497 int v; 2331 int v;
2498 2332
2499 #ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
2500 if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
2501 {
2502 int j;
2503 png_uint_32 lmhi, lmlo;
2504 lmlo = lmins & PNG_LOMASK;
2505 lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK;
2506
2507 for (j = 0; j < num_p_filters; j++)
2508 {
2509 if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_AVG)
2510 {
2511 lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >>
2512 PNG_WEIGHT_SHIFT;
2513 lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >>
2514 PNG_WEIGHT_SHIFT;
2515 }
2516 }
2517
2518 lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_AVG]) >>
2519 PNG_COST_SHIFT;
2520 lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_AVG]) >>
2521 PNG_COST_SHIFT;
2522
2523 if (lmhi > PNG_HIMASK)
2524 lmins = PNG_MAXSUM;
2525 else
2526 lmins = (lmhi << PNG_HISHIFT) + lmlo;
2527 }
2528 #endif
2529
2530 for (i = 0, rp = row_buf + 1, dp = png_ptr->avg_row + 1, 2333 for (i = 0, rp = row_buf + 1, dp = png_ptr->avg_row + 1,
2531 pp = prev_row + 1; i < bpp; i++) 2334 pp = prev_row + 1; i < bpp; i++)
2532 { 2335 {
2533 v = *dp++ = (png_byte)(((int)*rp++ - ((int)*pp++ / 2)) & 0xff); 2336 v = *dp++ = (png_byte)(((int)*rp++ - ((int)*pp++ / 2)) & 0xff);
2534 2337
2535 sum += (v < 128) ? v : 256 - v; 2338 sum += (v < 128) ? v : 256 - v;
2536 } 2339 }
2537 for (lp = row_buf + 1; i < row_bytes; i++) 2340 for (lp = row_buf + 1; i < row_bytes; i++)
2538 { 2341 {
2539 v = *dp++ = 2342 v = *dp++ =
2540 (png_byte)(((int)*rp++ - (((int)*pp++ + (int)*lp++) / 2)) & 0xff); 2343 (png_byte)(((int)*rp++ - (((int)*pp++ + (int)*lp++) / 2)) & 0xff);
2541 2344
2542 sum += (v < 128) ? v : 256 - v; 2345 sum += (v < 128) ? v : 256 - v;
2543 2346
2544 if (sum > lmins) /* We are already worse, don't continue. */ 2347 if (sum > lmins) /* We are already worse, don't continue. */
2545 break; 2348 break;
2546 } 2349 }
2547 2350
2548 #ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
2549 if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
2550 {
2551 int j;
2552 png_uint_32 sumhi, sumlo;
2553 sumlo = sum & PNG_LOMASK;
2554 sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK;
2555
2556 for (j = 0; j < num_p_filters; j++)
2557 {
2558 if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_NONE)
2559 {
2560 sumlo = (sumlo * png_ptr->filter_weights[j]) >>
2561 PNG_WEIGHT_SHIFT;
2562 sumhi = (sumhi * png_ptr->filter_weights[j]) >>
2563 PNG_WEIGHT_SHIFT;
2564 }
2565 }
2566
2567 sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_AVG]) >>
2568 PNG_COST_SHIFT;
2569 sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_AVG]) >>
2570 PNG_COST_SHIFT;
2571
2572 if (sumhi > PNG_HIMASK)
2573 sum = PNG_MAXSUM;
2574 else
2575 sum = (sumhi << PNG_HISHIFT) + sumlo;
2576 }
2577 #endif
2578
2579 if (sum < mins) 2351 if (sum < mins)
2580 { 2352 {
2581 mins = sum; 2353 mins = sum;
2582 best_row = png_ptr->avg_row; 2354 best_row = png_ptr->avg_row;
2583 } 2355 }
2584 } 2356 }
2585 2357
2586 /* Paeth filter */ 2358 /* Paeth filter */
2587 if (filter_to_do == PNG_FILTER_PAETH) 2359 if (filter_to_do == PNG_FILTER_PAETH)
2588 { 2360 {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
2622 best_row = png_ptr->paeth_row; 2394 best_row = png_ptr->paeth_row;
2623 } 2395 }
2624 2396
2625 else if (filter_to_do & PNG_FILTER_PAETH) 2397 else if (filter_to_do & PNG_FILTER_PAETH)
2626 { 2398 {
2627 png_bytep rp, dp, pp, cp, lp; 2399 png_bytep rp, dp, pp, cp, lp;
2628 png_uint_32 sum = 0, lmins = mins; 2400 png_uint_32 sum = 0, lmins = mins;
2629 png_uint_32 i; 2401 png_uint_32 i;
2630 int v; 2402 int v;
2631 2403
2632 #ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
2633 if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
2634 {
2635 int j;
2636 png_uint_32 lmhi, lmlo;
2637 lmlo = lmins & PNG_LOMASK;
2638 lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK;
2639
2640 for (j = 0; j < num_p_filters; j++)
2641 {
2642 if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_PAETH)
2643 {
2644 lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >>
2645 PNG_WEIGHT_SHIFT;
2646 lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >>
2647 PNG_WEIGHT_SHIFT;
2648 }
2649 }
2650
2651 lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_PAETH]) >>
2652 PNG_COST_SHIFT;
2653 lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_PAETH]) >>
2654 PNG_COST_SHIFT;
2655
2656 if (lmhi > PNG_HIMASK)
2657 lmins = PNG_MAXSUM;
2658 else
2659 lmins = (lmhi << PNG_HISHIFT) + lmlo;
2660 }
2661 #endif
2662
2663 for (i = 0, rp = row_buf + 1, dp = png_ptr->paeth_row + 1, 2404 for (i = 0, rp = row_buf + 1, dp = png_ptr->paeth_row + 1,
2664 pp = prev_row + 1; i < bpp; i++) 2405 pp = prev_row + 1; i < bpp; i++)
2665 { 2406 {
2666 v = *dp++ = (png_byte)(((int)*rp++ - (int)*pp++) & 0xff); 2407 v = *dp++ = (png_byte)(((int)*rp++ - (int)*pp++) & 0xff);
2667 2408
2668 sum += (v < 128) ? v : 256 - v; 2409 sum += (v < 128) ? v : 256 - v;
2669 } 2410 }
2670 2411
2671 for (lp = row_buf + 1, cp = prev_row + 1; i < row_bytes; i++) 2412 for (lp = row_buf + 1, cp = prev_row + 1; i < row_bytes; i++)
2672 { 2413 {
(...skipping 30 matching lines...) Expand all
2703 #endif /* PNG_SLOW_PAETH */ 2444 #endif /* PNG_SLOW_PAETH */
2704 2445
2705 v = *dp++ = (png_byte)(((int)*rp++ - p) & 0xff); 2446 v = *dp++ = (png_byte)(((int)*rp++ - p) & 0xff);
2706 2447
2707 sum += (v < 128) ? v : 256 - v; 2448 sum += (v < 128) ? v : 256 - v;
2708 2449
2709 if (sum > lmins) /* We are already worse, don't continue. */ 2450 if (sum > lmins) /* We are already worse, don't continue. */
2710 break; 2451 break;
2711 } 2452 }
2712 2453
2713 #ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
2714 if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
2715 {
2716 int j;
2717 png_uint_32 sumhi, sumlo;
2718 sumlo = sum & PNG_LOMASK;
2719 sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK;
2720
2721 for (j = 0; j < num_p_filters; j++)
2722 {
2723 if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_PAETH)
2724 {
2725 sumlo = (sumlo * png_ptr->filter_weights[j]) >>
2726 PNG_WEIGHT_SHIFT;
2727 sumhi = (sumhi * png_ptr->filter_weights[j]) >>
2728 PNG_WEIGHT_SHIFT;
2729 }
2730 }
2731
2732 sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_PAETH]) >>
2733 PNG_COST_SHIFT;
2734 sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_PAETH]) >>
2735 PNG_COST_SHIFT;
2736
2737 if (sumhi > PNG_HIMASK)
2738 sum = PNG_MAXSUM;
2739 else
2740 sum = (sumhi << PNG_HISHIFT) + sumlo;
2741 }
2742 #endif
2743
2744 if (sum < mins) 2454 if (sum < mins)
2745 { 2455 {
2746 best_row = png_ptr->paeth_row; 2456 best_row = png_ptr->paeth_row;
2747 } 2457 }
2748 } 2458 }
2749 #endif /* PNG_WRITE_FILTER_SUPPORTED */ 2459 #endif /* PNG_WRITE_FILTER_SUPPORTED */
2750 /* Do the actual writing of the filtered row data from the chosen filter. */ 2460 /* Do the actual writing of the filtered row data from the chosen filter. */
2751 2461
2752 png_write_filtered_row(png_ptr, best_row); 2462 png_write_filtered_row(png_ptr, best_row);
2753
2754 #ifdef PNG_WRITE_FILTER_SUPPORTED
2755 #ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
2756 /* Save the type of filter we picked this time for future calculations */
2757 if (png_ptr->num_prev_filters > 0)
2758 {
2759 int j;
2760 for (j = 1; j < num_p_filters; j++)
2761 {
2762 png_ptr->prev_filters[j] = png_ptr->prev_filters[j - 1];
2763 }
2764 png_ptr->prev_filters[j] = best_row[0];
2765 }
2766 #endif
2767 #endif /* PNG_WRITE_FILTER_SUPPORTED */
2768 } 2463 }
2769 2464
2770 2465
2771 /* Do the actual writing of a previously filtered row. */ 2466 /* Do the actual writing of a previously filtered row. */
2772 void /* PRIVATE */ 2467 void /* PRIVATE */
2773 png_write_filtered_row(png_structp png_ptr, png_bytep filtered_row) 2468 png_write_filtered_row(png_structp png_ptr, png_bytep filtered_row)
2774 { 2469 {
2775 png_debug(1, "in png_write_filtered_row"); 2470 png_debug(1, "in png_write_filtered_row");
2776 2471
2777 png_debug1(2, "filter = %d", filtered_row[0]); 2472 png_debug1(2, "filter = %d", filtered_row[0]);
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
2823 png_ptr->flush_rows++; 2518 png_ptr->flush_rows++;
2824 2519
2825 if (png_ptr->flush_dist > 0 && 2520 if (png_ptr->flush_dist > 0 &&
2826 png_ptr->flush_rows >= png_ptr->flush_dist) 2521 png_ptr->flush_rows >= png_ptr->flush_dist)
2827 { 2522 {
2828 png_write_flush(png_ptr); 2523 png_write_flush(png_ptr);
2829 } 2524 }
2830 #endif 2525 #endif
2831 } 2526 }
2832 #endif /* PNG_WRITE_SUPPORTED */ 2527 #endif /* PNG_WRITE_SUPPORTED */
OLDNEW
« third_party/libpng/pngset.c ('K') | « third_party/libpng/pngwrite.c ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698