Index: src/utils/SkBitmapHasher.cpp |
=================================================================== |
--- src/utils/SkBitmapHasher.cpp (revision 8985) |
+++ src/utils/SkBitmapHasher.cpp (working copy) |
@@ -7,15 +7,20 @@ |
#include "SkBitmap.h" |
#include "SkBitmapHasher.h" |
-#include "SkCityHash.h" |
#include "SkEndian.h" |
#include "SkImageEncoder.h" |
+ |
+#ifdef BITMAPHASHER_USES_TRUNCATED_MD5 |
+#include "SkMD5.h" |
+#else |
+#include "SkCityHash.h" |
#include "SkStream.h" |
+#endif |
/** |
- * Write an integer value to a stream in little-endian order. |
+ * Write an int32 value to a stream in little-endian order. |
*/ |
-static void write_int_to_buffer(uint32_t val, SkWStream* out) { |
+static void write_int32_to_buffer(uint32_t val, SkWStream* out) { |
val = SkEndian_SwapLE32(val); |
for (size_t byte = 0; byte < 4; ++byte) { |
out->write8((uint8_t)(val & 0xff)); |
@@ -23,18 +28,29 @@ |
} |
} |
+/** |
+ * Return the first 8 bytes of a bytearray, encoded as a little-endian uint64. |
+ */ |
+static inline uint64_t first_8_bytes_as_uint64(const uint8_t *bytearray) { |
+ return SkEndian_SwapLE64(*(reinterpret_cast<const uint64_t *>(bytearray))); |
+} |
+ |
/*static*/ bool SkBitmapHasher::ComputeDigestInternal(const SkBitmap& bitmap, |
SkHashDigest *result) { |
+#ifdef BITMAPHASHER_USES_TRUNCATED_MD5 |
+ SkMD5 out; |
+#else |
size_t pixelBufferSize = bitmap.width() * bitmap.height() * 4; |
size_t totalBufferSize = pixelBufferSize + 2 * sizeof(uint32_t); |
SkAutoMalloc bufferManager(totalBufferSize); |
char *bufferStart = static_cast<char *>(bufferManager.get()); |
SkMemoryWStream out(bufferStart, totalBufferSize); |
+#endif |
// start with the x/y dimensions |
- write_int_to_buffer(SkToU32(bitmap.width()), &out); |
- write_int_to_buffer(SkToU32(bitmap.height()), &out); |
+ write_int32_to_buffer(SkToU32(bitmap.width()), &out); |
+ write_int32_to_buffer(SkToU32(bitmap.height()), &out); |
// add all the pixel data |
SkAutoTDelete<SkImageEncoder> enc(CreateARGBImageEncoder()); |
@@ -42,7 +58,13 @@ |
return false; |
} |
+#ifdef BITMAPHASHER_USES_TRUNCATED_MD5 |
+ SkMD5::Digest digest; |
+ out.finish(digest); |
+ *result = first_8_bytes_as_uint64(digest.data); |
+#else |
*result = SkCityHash::Compute64(bufferStart, totalBufferSize); |
+#endif |
return true; |
} |