diff options
author | 2013-05-03 17:35:39 +0000 | |
---|---|---|
committer | 2013-05-03 17:35:39 +0000 | |
commit | b4ca46d748364236e82fdaccc08022dd89e29d40 (patch) | |
tree | 1bb565bddd409b6e82e6dd5af39f39f80788438c /include/core | |
parent | 25720b4d7e6f86043997c040315f2874aa2c8c9a (diff) |
SkBitmapHasher: use 64-bit-truncated MD5 instead of 64-bit CityHash
BUG=https://code.google.com/p/skia/issues/detail?id=1257
(if we change our mind within the next few days, we can toggle the
BITMAPHASHER_USES_TRUNCATED_MD5 #ifdef ; at some point, we'll remove that
option so we can delete our CityHash implementation entirely)
R=bungeman@google.com
Review URL: https://codereview.chromium.org/14054012
git-svn-id: http://skia.googlecode.com/svn/trunk@8992 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'include/core')
-rw-r--r-- | include/core/SkEndian.h | 46 |
1 files changed, 45 insertions, 1 deletions
diff --git a/include/core/SkEndian.h b/include/core/SkEndian.h index 01d21951da..6eba297548 100644 --- a/include/core/SkEndian.h +++ b/include/core/SkEndian.h @@ -65,7 +65,7 @@ template<uint32_t N> struct SkTEndianSwap32 { (N >> 24); }; -/** Vector version of SkEndianSwap16(), which swaps the +/** Vector version of SkEndianSwap32(), which swaps the bytes of each value in the array. */ static inline void SkEndianSwap32s(uint32_t array[], int count) { @@ -77,26 +77,70 @@ static inline void SkEndianSwap32s(uint32_t array[], int count) { } } +/** Reverse all 8 bytes in a 64bit value. + e.g. 0x1122334455667788 -> 0x8877665544332211 +*/ +static inline uint64_t SkEndianSwap64(uint64_t value) { + return (((value & 0x00000000000000FFULL) << (8*7)) | + ((value & 0x000000000000FF00ULL) << (8*5)) | + ((value & 0x0000000000FF0000ULL) << (8*3)) | + ((value & 0x00000000FF000000ULL) << (8*1)) | + ((value & 0x000000FF00000000ULL) >> (8*1)) | + ((value & 0x0000FF0000000000ULL) >> (8*3)) | + ((value & 0x00FF000000000000ULL) >> (8*5)) | + ((value) >> (8*7))); +} +template<uint64_t N> struct SkTEndianSwap64 { + static const uint64_t value = (((N & 0x00000000000000FFULL) << (8*7)) | + ((N & 0x000000000000FF00ULL) << (8*5)) | + ((N & 0x0000000000FF0000ULL) << (8*3)) | + ((N & 0x00000000FF000000ULL) << (8*1)) | + ((N & 0x000000FF00000000ULL) >> (8*1)) | + ((N & 0x0000FF0000000000ULL) >> (8*3)) | + ((N & 0x00FF000000000000ULL) >> (8*5)) | + ((N) >> (8*7))); +}; + +/** Vector version of SkEndianSwap64(), which swaps the + bytes of each value in the array. +*/ +static inline void SkEndianSwap64s(uint64_t array[], int count) { + SkASSERT(count == 0 || array != NULL); + + while (--count >= 0) { + *array = SkEndianSwap64(*array); + array += 1; + } +} + #ifdef SK_CPU_LENDIAN #define SkEndian_SwapBE16(n) SkEndianSwap16(n) #define SkEndian_SwapBE32(n) SkEndianSwap32(n) + #define SkEndian_SwapBE64(n) SkEndianSwap64(n) #define SkEndian_SwapLE16(n) (n) #define SkEndian_SwapLE32(n) (n) + #define SkEndian_SwapLE64(n) (n) #define SkTEndian_SwapBE16(n) SkTEndianSwap16<n>::value #define SkTEndian_SwapBE32(n) SkTEndianSwap32<n>::value + #define SkTEndian_SwapBE64(n) SkTEndianSwap64<n>::value #define SkTEndian_SwapLE16(n) (n) #define SkTEndian_SwapLE32(n) (n) + #define SkTEndian_SwapLE64(n) (n) #else // SK_CPU_BENDIAN #define SkEndian_SwapBE16(n) (n) #define SkEndian_SwapBE32(n) (n) + #define SkEndian_SwapBE64(n) (n) #define SkEndian_SwapLE16(n) SkEndianSwap16(n) #define SkEndian_SwapLE32(n) SkEndianSwap32(n) + #define SkEndian_SwapLE64(n) SkEndianSwap64(n) #define SkTEndian_SwapBE16(n) (n) #define SkTEndian_SwapBE32(n) (n) + #define SkTEndian_SwapBE64(n) (n) #define SkTEndian_SwapLE16(n) SkTEndianSwap16<n>::value #define SkTEndian_SwapLE32(n) SkTEndianSwap32<n>::value + #define SkTEndian_SwapLE64(n) SkTEndianSwap64<n>::value #endif // When a bytestream is embedded in a 32-bit word, how far we need to |