| Index: third_party/libwebp/enc/backward_references.h
|
| diff --git a/third_party/libwebp/enc/backward_references.h b/third_party/libwebp/enc/backward_references.h
|
| index 91c03361ed4a2b677759a94909b906a8bc3b59d1..8cb1a7a6d36473ecd34a3692d3741e2a87d4af68 100644
|
| --- a/third_party/libwebp/enc/backward_references.h
|
| +++ b/third_party/libwebp/enc/backward_references.h
|
| @@ -35,7 +35,8 @@ extern "C" {
|
| #if defined(__GNUC__) && \
|
| ((__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || __GNUC__ >= 4)
|
| static WEBP_INLINE int BitsLog2Floor(uint32_t n) {
|
| - return n == 0 ? -1 : 31 ^ __builtin_clz(n);
|
| + assert(n != 0);
|
| + return 31 ^ __builtin_clz(n);
|
| }
|
| #elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86))
|
| #include <intrin.h>
|
| @@ -43,15 +44,18 @@ static WEBP_INLINE int BitsLog2Floor(uint32_t n) {
|
|
|
| static WEBP_INLINE int BitsLog2Floor(uint32_t n) {
|
| unsigned long first_set_bit;
|
| - return _BitScanReverse(&first_set_bit, n) ? first_set_bit : -1;
|
| + assert(n != 0);
|
| + _BitScanReverse(&first_set_bit, n);
|
| + return first_set_bit;
|
| }
|
| #else
|
| +// Returns (int)floor(log2(n)). n must be > 0.
|
| static WEBP_INLINE int BitsLog2Floor(uint32_t n) {
|
| int log = 0;
|
| uint32_t value = n;
|
| int i;
|
|
|
| - if (value == 0) return -1;
|
| + assert(n != 0);
|
| for (i = 4; i >= 0; --i) {
|
| const int shift = (1 << i);
|
| const uint32_t x = value >> shift;
|
| @@ -65,11 +69,11 @@ static WEBP_INLINE int BitsLog2Floor(uint32_t n) {
|
| #endif
|
|
|
| static WEBP_INLINE int VP8LBitsLog2Ceiling(uint32_t n) {
|
| - const int floor = BitsLog2Floor(n);
|
| + const int log_floor = BitsLog2Floor(n);
|
| if (n == (n & ~(n - 1))) // zero or a power of two.
|
| - return floor;
|
| + return log_floor;
|
| else
|
| - return floor + 1;
|
| + return log_floor + 1;
|
| }
|
|
|
| // Splitting of distance and length codes into prefixes and
|
| @@ -78,16 +82,17 @@ static WEBP_INLINE int VP8LBitsLog2Ceiling(uint32_t n) {
|
| static WEBP_INLINE void PrefixEncode(int distance, int* const code,
|
| int* const extra_bits_count,
|
| int* const extra_bits_value) {
|
| - // Collect the two most significant bits where the highest bit is 1.
|
| - const int highest_bit = BitsLog2Floor(--distance);
|
| - // & 0x3f is to make behavior well defined when highest_bit
|
| - // does not exist or is the least significant bit.
|
| - const int second_highest_bit =
|
| - (distance >> ((highest_bit - 1) & 0x3f)) & 1;
|
| - *extra_bits_count = (highest_bit > 0) ? (highest_bit - 1) : 0;
|
| - *extra_bits_value = distance & ((1 << *extra_bits_count) - 1);
|
| - *code = (highest_bit > 0) ? (2 * highest_bit + second_highest_bit)
|
| - : (highest_bit == 0) ? 1 : 0;
|
| + if (distance > 2) { // Collect the two most significant bits.
|
| + const int highest_bit = BitsLog2Floor(--distance);
|
| + const int second_highest_bit = (distance >> (highest_bit - 1)) & 1;
|
| + *extra_bits_count = highest_bit - 1;
|
| + *extra_bits_value = distance & ((1 << *extra_bits_count) - 1);
|
| + *code = 2 * highest_bit + second_highest_bit;
|
| + } else {
|
| + *extra_bits_count = 0;
|
| + *extra_bits_value = 0;
|
| + *code = (distance == 2) ? 1 : 0;
|
| + }
|
| }
|
|
|
| // -----------------------------------------------------------------------------
|
|
|