| Index: src/utils/SkBitmapHasher.cpp
|
| ===================================================================
|
| --- src/utils/SkBitmapHasher.cpp (revision 8815)
|
| +++ src/utils/SkBitmapHasher.cpp (working copy)
|
| @@ -1,4 +1,3 @@
|
| -
|
| /*
|
| * Copyright 2012 Google Inc.
|
| *
|
| @@ -8,63 +7,55 @@
|
|
|
| #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.
|
| + * Write an integer value to a stream in little-endian order.
|
| */
|
| -static void write_int_to_buffer(int val, char* buf) {
|
| +static void write_int_to_buffer(uint32_t val, SkWStream* out) {
|
| val = SkEndian_SwapLE32(val);
|
| - for (int byte=0; byte<4; byte++) {
|
| - *buf++ = (char)(val & 0xff);
|
| + for (size_t byte = 0; byte < 4; ++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(uint32_t);
|
|
|
| SkAutoMalloc bufferManager(totalBufferSize);
|
| char *bufferStart = static_cast<char *>(bufferManager.get());
|
| - char *bufPtr = bufferStart;
|
| + SkMemoryWStream out(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(SkToU32(bitmap.width()), &out);
|
| + write_int_to_buffer(SkToU32(bitmap.height()), &out);
|
|
|
| // add all the pixel data
|
| - if (!transformer.copyBitmapToPixelBuffer(bufPtr, pixelBufferSize)) {
|
| + SkAutoTDelete<SkImageEncoder> enc(CreateARGBImageEncoder());
|
| + if (!enc->encodeStream(&out, bitmap, SkImageEncoder::kDefaultQuality)) {
|
| return false;
|
| }
|
| +
|
| *result = SkCityHash::Compute64(bufferStart, totalBufferSize);
|
| return true;
|
| }
|
|
|
| /*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
|
| // 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 {
|
| + if (!bitmap.copyTo(©Bitmap, SkBitmap::kARGB_8888_Config)) {
|
| return false;
|
| }
|
| + return ComputeDigestInternal(copyBitmap, result);
|
| }
|
|
|