Пример #1
0
/*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);
}
Пример #2
0
/*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;
}