/*static*/ uint64_t SkBitmapChecksummer::Compute64Internal( const SkBitmap& bitmap, const SkBitmapTransformer& transformer) { size_t pixelBufferSize = transformer.bytesNeededTotal(); size_t totalBufferSize = pixelBufferSize + 8; // leave room for x/y dimensions SkAutoMalloc bufferManager(totalBufferSize); char *bufferStart = static_cast<char *>(bufferManager.get()); char *bufPtr = bufferStart; // start with the x/y dimensions write_int_to_buffer(bitmap.width(), bufPtr); bufPtr += 4; write_int_to_buffer(bitmap.height(), bufPtr); bufPtr += 4; // add all the pixel data if (!transformer.copyBitmapToPixelBuffer(bufPtr, pixelBufferSize)) { return 0; } return SkCityHash::Compute64(bufferStart, totalBufferSize); }
/*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()); SkMemoryWStream out(bufferStart, totalBufferSize); // start with the x/y dimensions write_int_to_buffer(SkToU32(bitmap.width()), &out); write_int_to_buffer(SkToU32(bitmap.height()), &out); // add all the pixel data SkAutoTDelete<SkImageEncoder> enc(CreateARGBImageEncoder()); if (!enc->encodeStream(&out, bitmap, SkImageEncoder::kDefaultQuality)) { return false; } *result = SkCityHash::Compute64(bufferStart, totalBufferSize); return true; }