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