OLD | NEW |
| (Empty) |
1 | |
2 /* | |
3 * Copyright 2012 Google Inc. | |
4 * | |
5 * Use of this source code is governed by a BSD-style license that can be | |
6 * found in the LICENSE file. | |
7 */ | |
8 | |
9 #include "SkBitmap.h" | |
10 #include "SkBitmapChecksummer.h" | |
11 #include "SkBitmapTransformer.h" | |
12 #include "SkCityHash.h" | |
13 #include "SkEndian.h" | |
14 | |
15 /** | |
16 * Write an integer value into a bytebuffer in little-endian order. | |
17 */ | |
18 static void write_int_to_buffer(int val, char* buf) { | |
19 val = SkEndian_SwapLE32(val); | |
20 for (int byte=0; byte<4; byte++) { | |
21 *buf++ = (char)(val & 0xff); | |
22 val = val >> 8; | |
23 } | |
24 } | |
25 | |
26 /*static*/ uint64_t SkBitmapChecksummer::Compute64Internal( | |
27 const SkBitmap& bitmap, const SkBitmapTransformer& transformer) { | |
28 size_t pixelBufferSize = transformer.bytesNeededTotal(); | |
29 size_t totalBufferSize = pixelBufferSize + 8; // leave room for x/y dimensio
ns | |
30 | |
31 SkAutoMalloc bufferManager(totalBufferSize); | |
32 char *bufferStart = static_cast<char *>(bufferManager.get()); | |
33 char *bufPtr = bufferStart; | |
34 // start with the x/y dimensions | |
35 write_int_to_buffer(bitmap.width(), bufPtr); | |
36 bufPtr += 4; | |
37 write_int_to_buffer(bitmap.height(), bufPtr); | |
38 bufPtr += 4; | |
39 | |
40 // add all the pixel data | |
41 if (!transformer.copyBitmapToPixelBuffer(bufPtr, pixelBufferSize)) { | |
42 return 0; | |
43 } | |
44 return SkCityHash::Compute64(bufferStart, totalBufferSize); | |
45 } | |
46 | |
47 /*static*/ uint64_t SkBitmapChecksummer::Compute64(const SkBitmap& bitmap) { | |
48 const SkBitmapTransformer::PixelFormat kPixelFormat = | |
49 SkBitmapTransformer::kARGB_8888_Premul_PixelFormat; | |
50 | |
51 // First, try to transform the existing bitmap. | |
52 const SkBitmapTransformer transformer = | |
53 SkBitmapTransformer(bitmap, kPixelFormat); | |
54 if (transformer.isValid(false)) { | |
55 return Compute64Internal(bitmap, transformer); | |
56 } | |
57 | |
58 // Hmm, that didn't work. Maybe if we create a new | |
59 // kARGB_8888_Config version of the bitmap it will work better? | |
60 SkBitmap copyBitmap; | |
61 bitmap.copyTo(©Bitmap, SkBitmap::kARGB_8888_Config); | |
62 const SkBitmapTransformer copyTransformer = | |
63 SkBitmapTransformer(copyBitmap, kPixelFormat); | |
64 if (copyTransformer.isValid(true)) { | |
65 return Compute64Internal(copyBitmap, copyTransformer); | |
66 } else { | |
67 return 0; | |
68 } | |
69 } | |
OLD | NEW |