Index: src/utils/SkBitmapHasher.cpp |
=================================================================== |
--- src/utils/SkBitmapHasher.cpp (revision 8777) |
+++ src/utils/SkBitmapHasher.cpp (working copy) |
@@ -1,4 +1,3 @@ |
- |
/* |
* Copyright 2012 Google Inc. |
* |
@@ -8,37 +7,38 @@ |
#include "SkBitmap.h" |
#include "SkBitmapHasher.h" |
-#include "SkBitmapTransformer.h" |
#include "SkCityHash.h" |
#include "SkEndian.h" |
+#include "SkImageEncoder.h" |
+#include "SkStream.h" |
/** |
* Write an integer value into a bytebuffer in little-endian order. |
epoger
2013/04/19 21:13:02
"into a bytebuffer" -> "to a stream"
bungeman-skia
2013/04/22 18:31:14
Done.
|
*/ |
-static void write_int_to_buffer(int val, char* buf) { |
+static void write_int_to_buffer(int val, SkWStream* out) { |
val = SkEndian_SwapLE32(val); |
- for (int byte=0; byte<4; byte++) { |
- *buf++ = (char)(val & 0xff); |
+ for (size_t byte = 0; byte < sizeof(int); ++byte) { |
+ out->write8((uint8_t)(val & 0xff)); |
val = val >> 8; |
} |
} |
-/*static*/ bool SkBitmapHasher::ComputeDigestInternal( |
- const SkBitmap& bitmap, const SkBitmapTransformer& transformer, SkHashDigest *result) { |
- size_t pixelBufferSize = transformer.bytesNeededTotal(); |
- size_t totalBufferSize = pixelBufferSize + 8; // leave room for x/y dimensions |
+/*static*/ bool SkBitmapHasher::ComputeDigestInternal(const SkBitmap& bitmap, |
+ SkHashDigest *result) { |
+ size_t pixelBufferSize = bitmap.width() * bitmap.height() * 4; |
+ size_t totalBufferSize = pixelBufferSize + 2 * sizeof(int); |
SkAutoMalloc bufferManager(totalBufferSize); |
char *bufferStart = static_cast<char *>(bufferManager.get()); |
- char *bufPtr = bufferStart; |
+ SkWStream* out = new SkMemoryWStream(bufferStart, totalBufferSize); |
+ |
// start with the x/y dimensions |
- write_int_to_buffer(bitmap.width(), bufPtr); |
- bufPtr += 4; |
- write_int_to_buffer(bitmap.height(), bufPtr); |
- bufPtr += 4; |
+ write_int_to_buffer(bitmap.width(), out); |
+ write_int_to_buffer(bitmap.height(), out); |
// add all the pixel data |
- if (!transformer.copyBitmapToPixelBuffer(bufPtr, pixelBufferSize)) { |
+ SkAutoTDelete<SkImageEncoder> enc(CreateARGBImageEncoder()); |
epoger
2013/04/19 21:13:02
Is there a significant performance penalty for cre
|
+ if (!enc->encodeStream(out, bitmap, 100)) { |
epoger
2013/04/19 21:13:02
Where does the magic "100" come from? Can we refe
bungeman-skia
2013/04/22 18:31:14
Ah, you need a good editor which will show documen
|
return false; |
} |
*result = SkCityHash::Compute64(bufferStart, totalBufferSize); |
@@ -46,25 +46,13 @@ |
} |
/*static*/ bool SkBitmapHasher::ComputeDigest(const SkBitmap& bitmap, SkHashDigest *result) { |
- const SkBitmapTransformer::PixelFormat kPixelFormat = |
- SkBitmapTransformer::kARGB_8888_Premul_PixelFormat; |
- |
- // First, try to transform the existing bitmap. |
- const SkBitmapTransformer transformer = |
- SkBitmapTransformer(bitmap, kPixelFormat); |
- if (transformer.isValid(false)) { |
- return ComputeDigestInternal(bitmap, transformer, result); |
+ if (ComputeDigestInternal(bitmap, result)) { |
+ return true; |
} |
// Hmm, that didn't work. Maybe if we create a new |
epoger
2013/04/19 21:13:02
I don't know why we would encounter this anymore,
bungeman-skia
2013/04/22 18:31:14
Well, this doesn't support A8 or A1, since I didn'
|
// kARGB_8888_Config version of the bitmap it will work better? |
SkBitmap copyBitmap; |
bitmap.copyTo(©Bitmap, SkBitmap::kARGB_8888_Config); |
- const SkBitmapTransformer copyTransformer = |
- SkBitmapTransformer(copyBitmap, kPixelFormat); |
- if (copyTransformer.isValid(true)) { |
- return ComputeDigestInternal(copyBitmap, copyTransformer, result); |
- } else { |
- return false; |
- } |
+ return ComputeDigestInternal(copyBitmap, result); |
} |