| Index: third_party/libpng/pngrtran.c
|
| diff --git a/third_party/libpng/pngrtran.c b/third_party/libpng/pngrtran.c
|
| index 3138147aff9f73bfe32a0cb767f4a49ee97eba6a..87e7cf5c7a7593aba613fba646e393a142b65c1b 100644
|
| --- a/third_party/libpng/pngrtran.c
|
| +++ b/third_party/libpng/pngrtran.c
|
| @@ -18,6 +18,13 @@
|
|
|
| #include "pngpriv.h"
|
|
|
| +#ifdef PNG_ARM_NEON_IMPLEMENTATION
|
| +#if PNG_ARM_NEON_IMPLEMENTATION == 1
|
| +#define PNG_ARM_NEON_INTRINSICS_AVAILABLE
|
| +#include <arm_neon.h>
|
| +#endif
|
| +#endif
|
| +
|
| #ifdef PNG_READ_SUPPORTED
|
|
|
| /* Set the action on getting a CRC error for an ancillary or critical chunk. */
|
| @@ -4194,8 +4201,9 @@ png_do_encode_alpha(png_row_infop row_info, png_bytep row, png_structrp png_ptr)
|
| * upon whether you supply trans and num_trans.
|
| */
|
| static void
|
| -png_do_expand_palette(png_row_infop row_info, png_bytep row,
|
| - png_const_colorp palette, png_const_bytep trans_alpha, int num_trans)
|
| +png_do_expand_palette(png_structrp png_ptr, png_row_infop row_info,
|
| + png_bytep row, png_const_colorp palette, png_const_bytep trans_alpha,
|
| + int num_trans)
|
| {
|
| int shift, value;
|
| png_bytep sp, dp;
|
| @@ -4299,14 +4307,17 @@ png_do_expand_palette(png_row_infop row_info, png_bytep row,
|
| sp = row + (png_size_t)row_width - 1;
|
| dp = row + (png_size_t)(row_width << 2) - 1;
|
|
|
| - for (i = 0; i < row_width; i++)
|
| + i = 0;
|
| +#ifdef PNG_ARM_NEON_INTRINSICS_AVAILABLE
|
| + i = png_do_expand_palette_neon(png_ptr, row_info, row, &sp, &dp);
|
| +#endif
|
| +
|
| + for (; i < row_width; i++)
|
| {
|
| if ((int)(*sp) >= num_trans)
|
| *dp-- = 0xff;
|
| -
|
| else
|
| *dp-- = trans_alpha[*sp];
|
| -
|
| *dp-- = palette[*sp].blue;
|
| *dp-- = palette[*sp].green;
|
| *dp-- = palette[*sp].red;
|
| @@ -4738,8 +4749,19 @@ png_do_read_transformations(png_structrp png_ptr, png_row_infop row_info)
|
| {
|
| if (row_info->color_type == PNG_COLOR_TYPE_PALETTE)
|
| {
|
| - png_do_expand_palette(row_info, png_ptr->row_buf + 1,
|
| - png_ptr->palette, png_ptr->trans_alpha, png_ptr->num_trans);
|
| +#ifdef PNG_ARM_NEON_INTRINSICS_AVAILABLE
|
| + /* Allocate space for the decompressed full palette. */
|
| + if (png_ptr->row_tmp_palette == NULL) {
|
| + png_ptr->row_tmp_palette = png_calloc(png_ptr, 256*4);
|
| + if (png_ptr->row_tmp_palette == NULL) {
|
| + png_error(png_ptr, "NULL row buffer");
|
| + }
|
| + /* Build the RGBA palette. */
|
| + png_riffle_palette(png_ptr, row_info);
|
| + }
|
| +#endif
|
| + png_do_expand_palette(png_ptr, row_info, png_ptr->row_buf + 1,
|
| + png_ptr->palette, png_ptr->trans_alpha, png_ptr->num_trans);
|
| }
|
|
|
| else
|
|
|