1d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com#include "DMUtil.h"
2d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
369031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org#include "SkColorPriv.h"
4192cbf67b281b20477320134962d554ed823c691commit-bot@chromium.org#include "SkPicture.h"
5770963f23f4fc313db0fa3bac18b1b8aafb55f17robertphillips@google.com#include "SkPictureRecorder.h"
6192cbf67b281b20477320134962d554ed823c691commit-bot@chromium.org
7d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.comnamespace DM {
8d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
9192cbf67b281b20477320134962d554ed823c691commit-bot@chromium.orgSkString UnderJoin(const char* a, const char* b) {
10d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com    SkString s;
11d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com    s.appendf("%s_%s", a, b);
12d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com    return s;
13d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com}
14d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
15e4d3e605f74a23d050abad29909af421d8b1cf1amtkleinSkString FileToTaskName(SkString filename) {
16e4d3e605f74a23d050abad29909af421d8b1cf1amtklein    for (size_t i = 0; i < filename.size(); i++) {
17e4d3e605f74a23d050abad29909af421d8b1cf1amtklein        if ('_' == filename[i]) { filename[i] = '-'; }
18e4d3e605f74a23d050abad29909af421d8b1cf1amtklein        if ('.' == filename[i]) { filename[i] = '_'; }
19e4d3e605f74a23d050abad29909af421d8b1cf1amtklein    }
20e4d3e605f74a23d050abad29909af421d8b1cf1amtklein    return filename;
21e4d3e605f74a23d050abad29909af421d8b1cf1amtklein}
22e4d3e605f74a23d050abad29909af421d8b1cf1amtklein
235fb2ce38b3dcb8e60e9e112df23c9d42456d7069commit-bot@chromium.orgSkPicture* RecordPicture(skiagm::GM* gm, uint32_t recordFlags, SkBBHFactory* factory) {
24d6bab0238655dbab24dfe92bd0b16b464310a8c7rmistry@google.com    const SkISize size = gm->getISize();
255fb2ce38b3dcb8e60e9e112df23c9d42456d7069commit-bot@chromium.org    SkPictureRecorder recorder;
265fb2ce38b3dcb8e60e9e112df23c9d42456d7069commit-bot@chromium.org    SkCanvas* canvas = recorder.beginRecording(size.width(), size.height(), factory, recordFlags);
27192cbf67b281b20477320134962d554ed823c691commit-bot@chromium.org    canvas->concat(gm->getInitialTransform());
28192cbf67b281b20477320134962d554ed823c691commit-bot@chromium.org    gm->draw(canvas);
29192cbf67b281b20477320134962d554ed823c691commit-bot@chromium.org    canvas->flush();
3084b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com    return recorder.endRecording();
31192cbf67b281b20477320134962d554ed823c691commit-bot@chromium.org}
32192cbf67b281b20477320134962d554ed823c691commit-bot@chromium.org
33266420722e18dcc8b6d4a7379a42b8591ccd2b6dcommit-bot@chromium.orgvoid AllocatePixels(SkColorType ct, int width, int height, SkBitmap* bitmap) {
3438aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org    bitmap->allocPixels(SkImageInfo::Make(width, height, ct, kPremul_SkAlphaType));
35192cbf67b281b20477320134962d554ed823c691commit-bot@chromium.org    bitmap->eraseColor(0x00000000);
36192cbf67b281b20477320134962d554ed823c691commit-bot@chromium.org}
37192cbf67b281b20477320134962d554ed823c691commit-bot@chromium.org
38266420722e18dcc8b6d4a7379a42b8591ccd2b6dcommit-bot@chromium.orgvoid AllocatePixels(const SkBitmap& reference, SkBitmap* bitmap) {
39266420722e18dcc8b6d4a7379a42b8591ccd2b6dcommit-bot@chromium.org    AllocatePixels(reference.colorType(), reference.width(), reference.height(), bitmap);
4090b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org}
4190b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org
42192cbf67b281b20477320134962d554ed823c691commit-bot@chromium.orgvoid DrawPicture(SkPicture* picture, SkBitmap* bitmap) {
43192cbf67b281b20477320134962d554ed823c691commit-bot@chromium.org    SkASSERT(picture != NULL);
44192cbf67b281b20477320134962d554ed823c691commit-bot@chromium.org    SkASSERT(bitmap != NULL);
45192cbf67b281b20477320134962d554ed823c691commit-bot@chromium.org    SkCanvas canvas(*bitmap);
469b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillips    canvas.drawPicture(picture);
47192cbf67b281b20477320134962d554ed823c691commit-bot@chromium.org    canvas.flush();
48192cbf67b281b20477320134962d554ed823c691commit-bot@chromium.org}
49192cbf67b281b20477320134962d554ed823c691commit-bot@chromium.org
5069031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.orgstatic void unpack_565(uint16_t pixel, unsigned* r, unsigned* g, unsigned* b) {
5169031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org    *r = SkGetPackedR16(pixel);
5269031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org    *g = SkGetPackedG16(pixel);
5369031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org    *b = SkGetPackedB16(pixel);
5469031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org}
5569031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org
5669031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org// Returns |a-b|.
5769031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.orgstatic unsigned abs_diff(unsigned a, unsigned b) {
5869031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org    return a > b ? a - b : b - a;
5969031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org}
6069031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org
6169031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.orgunsigned MaxComponentDifference(const SkBitmap& a, const SkBitmap& b) {
6269031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org    if (a.info() != b.info()) {
6369031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org        SkFAIL("Can't compare bitmaps of different shapes.");
6469031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org    }
6569031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org
6669031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org    unsigned max = 0;
6769031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org
68192cbf67b281b20477320134962d554ed823c691commit-bot@chromium.org    const SkAutoLockPixels lockA(a), lockB(b);
6969031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org    if (a.info().colorType() == kRGB_565_SkColorType) {
7069031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org        // 565 is special/annoying because its 3 components straddle 2 bytes.
7169031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org        const uint16_t* aPixels = (const uint16_t*)a.getPixels();
7269031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org        const uint16_t* bPixels = (const uint16_t*)b.getPixels();
7369031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org        for (size_t i = 0; i < a.getSize() / 2; i++) {
7469031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org            unsigned ar, ag, ab,
7569031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org                     br, bg, bb;
7669031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org            unpack_565(aPixels[i], &ar, &ag, &ab);
7769031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org            unpack_565(bPixels[i], &br, &bg, &bb);
7869031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org            max = SkTMax(max, abs_diff(ar, br));
7969031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org            max = SkTMax(max, abs_diff(ag, bg));
8069031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org            max = SkTMax(max, abs_diff(ab, bb));
8169031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org        }
8269031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org    } else {
8369031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org        // Everything else we produce is byte aligned, so max component diff == max byte diff.
8469031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org        const uint8_t* aBytes = (const uint8_t*)a.getPixels();
8569031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org        const uint8_t* bBytes = (const uint8_t*)b.getPixels();
8669031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org        for (size_t i = 0; i < a.getSize(); i++) {
8769031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org            max = SkTMax(max, abs_diff(aBytes[i], bBytes[i]));
8869031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org        }
8969031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org    }
9069031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org
9169031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org    return max;
9269031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org}
9369031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.org
9469031a44273ccb7656df88c6bcb7b62f4d2731bbcommit-bot@chromium.orgbool BitmapsEqual(const SkBitmap& a, const SkBitmap& b) {
959c4ff80d9b76e1bda532fb9182f66f67cfc95324mtklein    if (a.info() != b.info()) {
969c4ff80d9b76e1bda532fb9182f66f67cfc95324mtklein        return false;
979c4ff80d9b76e1bda532fb9182f66f67cfc95324mtklein    }
989c4ff80d9b76e1bda532fb9182f66f67cfc95324mtklein    const SkAutoLockPixels lockA(a), lockB(b);
999c4ff80d9b76e1bda532fb9182f66f67cfc95324mtklein    return 0 == memcmp(a.getPixels(), b.getPixels(), a.getSize());
100192cbf67b281b20477320134962d554ed823c691commit-bot@chromium.org}
101192cbf67b281b20477320134962d554ed823c691commit-bot@chromium.org
102d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com}  // namespace DM
103