Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(169)

Unified Diff: src/utils/SkBitmapHasher.cpp

Issue 14265010: Make SkSHA1 and SkM5 use common SkDigestHash result type (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: sync_to_r8826 Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/utils/SkBitmapHasher.h ('k') | src/utils/SkBitmapTransformer.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/utils/SkBitmapHasher.cpp
===================================================================
--- src/utils/SkBitmapHasher.cpp (revision 8826)
+++ src/utils/SkBitmapHasher.cpp (working copy)
@@ -11,20 +11,50 @@
#include "SkBitmapTransformer.h"
#include "SkCityHash.h"
#include "SkEndian.h"
+#include "SkMD5.h"
/**
- * Write an integer value into a bytebuffer in little-endian order.
+ * Write an int32_t value into a bytebuffer in little-endian order.
*/
-static void write_int_to_buffer(int val, char* buf) {
- val = SkEndian_SwapLE32(val);
+static void write_int32_to_buffer(int32_t val, char* buf) {
for (int byte=0; byte<4; byte++) {
*buf++ = (char)(val & 0xff);
val = val >> 8;
}
}
+#ifdef BITMAP_HASH_TYPE_SkHashDigest
/*static*/ bool SkBitmapHasher::ComputeDigestInternal(
- const SkBitmap& bitmap, const SkBitmapTransformer& transformer, SkHashDigest *result) {
+ const SkBitmap& bitmap, const SkBitmapTransformer& transformer, BITMAP_HASH_TYPE *result) {
+ SkMD5 hasher;
+
+ // Start with x/y dimensions.
+ uint8_t dimensions[8];
+ char *bufPtr = reinterpret_cast<char *>(dimensions);
+ write_int32_to_buffer(bitmap.width(), bufPtr);
+ write_int32_to_buffer(bitmap.height(), bufPtr + 4);
+ hasher.update(dimensions, sizeof(dimensions));
+
+ // Add all the pixel data, one transformed row at a time.
+ size_t rowBufferSize = transformer.bytesNeededPerRow();
+ SkAutoMalloc bufferManager(rowBufferSize);
+ char *buffer = static_cast<char *>(bufferManager.get());
+ for (int row = 0; row < transformer.numRows(); row++) {
+ if (!transformer.copyRowToPixelBuffer(row, buffer, rowBufferSize)) {
+ return false;
+ }
+ hasher.update(reinterpret_cast<const uint8_t*>(buffer), rowBufferSize);
+ }
+
+ SkMD5::Digest digest;
+ hasher.finish(digest);
+ // EPOGER: instead of creating the extra copy on the stack and running copyFrom, use malloc and then just make the SkHashDigest hold a reference to it?
+ result->copyFrom(&digest, sizeof(digest));
+ return true;
+}
+#else
+/*static*/ bool SkBitmapHasher::ComputeDigestInternal(
+ const SkBitmap& bitmap, const SkBitmapTransformer& transformer, BITMAP_HASH_TYPE *result) {
size_t pixelBufferSize = transformer.bytesNeededTotal();
size_t totalBufferSize = pixelBufferSize + 8; // leave room for x/y dimensions
@@ -32,9 +62,9 @@
char *bufferStart = static_cast<char *>(bufferManager.get());
char *bufPtr = bufferStart;
// start with the x/y dimensions
- write_int_to_buffer(bitmap.width(), bufPtr);
+ write_int32_to_buffer(bitmap.width(), bufPtr);
bufPtr += 4;
- write_int_to_buffer(bitmap.height(), bufPtr);
+ write_int32_to_buffer(bitmap.height(), bufPtr);
bufPtr += 4;
// add all the pixel data
@@ -44,8 +74,9 @@
*result = SkCityHash::Compute64(bufferStart, totalBufferSize);
return true;
}
+#endif
-/*static*/ bool SkBitmapHasher::ComputeDigest(const SkBitmap& bitmap, SkHashDigest *result) {
+/*static*/ bool SkBitmapHasher::ComputeDigest(const SkBitmap& bitmap, BITMAP_HASH_TYPE *result) {
const SkBitmapTransformer::PixelFormat kPixelFormat =
SkBitmapTransformer::kARGB_8888_Premul_PixelFormat;
« no previous file with comments | « src/utils/SkBitmapHasher.h ('k') | src/utils/SkBitmapTransformer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698