Index: third_party/libwebp/dsp/upsampling.c |
diff --git a/third_party/libwebp/dsp/upsampling.c b/third_party/libwebp/dsp/upsampling.c |
index 9ca04927b9b639c5e31acd6360647179afe5b52c..91d939cdcad657a3978c9619ea5ee610c083392d 100644 |
--- a/third_party/libwebp/dsp/upsampling.c |
+++ b/third_party/libwebp/dsp/upsampling.c |
@@ -271,8 +271,7 @@ static void ApplyAlphaMultiply(uint8_t* rgba, int alpha_first, |
// rgbA4444 |
-#define MULTIPLIER(a) ((a) * 0x11) |
-#define PREMULTIPLY(x, m) (((x) * (m)) >> 12) |
+#define MULTIPLIER(a) ((a) * 0x1111) // 0x1111 ~= (1 << 16) / 15 |
static WEBP_INLINE uint8_t dither_hi(uint8_t x) { |
return (x & 0xf0) | (x >> 4); |
@@ -282,24 +281,27 @@ static WEBP_INLINE uint8_t dither_lo(uint8_t x) { |
return (x & 0x0f) | (x << 4); |
} |
+static WEBP_INLINE uint8_t multiply(uint8_t x, uint32_t m) { |
+ return (x * m) >> 16; |
+} |
+ |
static void ApplyAlphaMultiply4444(uint8_t* rgba4444, |
int w, int h, int stride) { |
while (h-- > 0) { |
int i; |
for (i = 0; i < w; ++i) { |
- const uint8_t a = dither_lo(rgba4444[2 * i + 1]); |
+ const uint8_t a = (rgba4444[2 * i + 1] & 0x0f); |
const uint32_t mult = MULTIPLIER(a); |
- const uint8_t r = PREMULTIPLY(dither_hi(rgba4444[2 * i + 0]), mult); |
- const uint8_t g = PREMULTIPLY(dither_lo(rgba4444[2 * i + 0]), mult); |
- const uint8_t b = PREMULTIPLY(dither_hi(rgba4444[2 * i + 1]), mult); |
- rgba4444[2 * i + 0] = (r & 0xf0) | (g & 0x0f); |
+ const uint8_t r = multiply(dither_hi(rgba4444[2 * i + 0]), mult); |
+ const uint8_t g = multiply(dither_lo(rgba4444[2 * i + 0]), mult); |
+ const uint8_t b = multiply(dither_hi(rgba4444[2 * i + 1]), mult); |
+ rgba4444[2 * i + 0] = (r & 0xf0) | ((g >> 4) & 0x0f); |
rgba4444[2 * i + 1] = (b & 0xf0) | a; |
} |
rgba4444 += stride; |
} |
} |
#undef MULTIPLIER |
-#undef PREMULTIPLY |
void (*WebPApplyAlphaMultiply)(uint8_t*, int, int, int, int) |
= ApplyAlphaMultiply; |
@@ -326,6 +328,11 @@ void WebPInitUpsamplers(void) { |
WebPInitUpsamplersSSE2(); |
} |
#endif |
+#if defined(WEBP_USE_NEON) |
+ if (VP8GetCPUInfo(kNEON)) { |
+ WebPInitUpsamplersNEON(); |
+ } |
+#endif |
} |
#endif // FANCY_UPSAMPLING |
} |
@@ -346,6 +353,11 @@ void WebPInitPremultiply(void) { |
WebPInitPremultiplySSE2(); |
} |
#endif |
+#if defined(WEBP_USE_NEON) |
+ if (VP8GetCPUInfo(kNEON)) { |
+ WebPInitPremultiplyNEON(); |
+ } |
+#endif |
} |
#endif // FANCY_UPSAMPLING |
} |