1580a17241c51712f26441c6551c773e3769738e9sugoi@google.com/* 2580a17241c51712f26441c6551c773e3769738e9sugoi@google.com * Copyright 2013 Google Inc. 3580a17241c51712f26441c6551c773e3769738e9sugoi@google.com * 4580a17241c51712f26441c6551c773e3769738e9sugoi@google.com * Use of this source code is governed by a BSD-style license that can be 5580a17241c51712f26441c6551c773e3769738e9sugoi@google.com * found in the LICENSE file. 6580a17241c51712f26441c6551c773e3769738e9sugoi@google.com */ 78c0c7b0bcdf17ff672a972748f692a41c22aa0a1reed 8f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h" 9580a17241c51712f26441c6551c773e3769738e9sugoi@google.com#include "SkBitmapSource.h" 10580a17241c51712f26441c6551c773e3769738e9sugoi@google.com#include "SkCanvas.h" 11580a17241c51712f26441c6551c773e3769738e9sugoi@google.com#include "SkMergeImageFilter.h" 12580a17241c51712f26441c6551c773e3769738e9sugoi@google.com 13580a17241c51712f26441c6551c773e3769738e9sugoi@google.com#define FILTER_WIDTH_SMALL SkIntToScalar(32) 14580a17241c51712f26441c6551c773e3769738e9sugoi@google.com#define FILTER_HEIGHT_SMALL SkIntToScalar(32) 15580a17241c51712f26441c6551c773e3769738e9sugoi@google.com#define FILTER_WIDTH_LARGE SkIntToScalar(256) 16580a17241c51712f26441c6551c773e3769738e9sugoi@google.com#define FILTER_HEIGHT_LARGE SkIntToScalar(256) 17580a17241c51712f26441c6551c773e3769738e9sugoi@google.com 18f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass MergeBench : public Benchmark { 19580a17241c51712f26441c6551c773e3769738e9sugoi@google.compublic: 20410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com MergeBench(bool small) : fIsSmall(small), fInitialized(false) { } 21580a17241c51712f26441c6551c773e3769738e9sugoi@google.com 22580a17241c51712f26441c6551c773e3769738e9sugoi@google.comprotected: 2336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* onGetName() override { 24580a17241c51712f26441c6551c773e3769738e9sugoi@google.com return fIsSmall ? "merge_small" : "merge_large"; 25580a17241c51712f26441c6551c773e3769738e9sugoi@google.com } 26580a17241c51712f26441c6551c773e3769738e9sugoi@google.com 2736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onPreDraw() override { 28580a17241c51712f26441c6551c773e3769738e9sugoi@google.com if (!fInitialized) { 29580a17241c51712f26441c6551c773e3769738e9sugoi@google.com make_bitmap(); 30580a17241c51712f26441c6551c773e3769738e9sugoi@google.com make_checkerboard(); 31580a17241c51712f26441c6551c773e3769738e9sugoi@google.com fInitialized = true; 32580a17241c51712f26441c6551c773e3769738e9sugoi@google.com } 33580a17241c51712f26441c6551c773e3769738e9sugoi@google.com } 34580a17241c51712f26441c6551c773e3769738e9sugoi@google.com 3536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDraw(const int loops, SkCanvas* canvas) override { 36580a17241c51712f26441c6551c773e3769738e9sugoi@google.com SkRect r = fIsSmall ? SkRect::MakeWH(FILTER_WIDTH_SMALL, FILTER_HEIGHT_SMALL) : 37580a17241c51712f26441c6551c773e3769738e9sugoi@google.com SkRect::MakeWH(FILTER_WIDTH_LARGE, FILTER_HEIGHT_LARGE); 38580a17241c51712f26441c6551c773e3769738e9sugoi@google.com SkPaint paint; 39580a17241c51712f26441c6551c773e3769738e9sugoi@google.com paint.setImageFilter(mergeBitmaps())->unref(); 403361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; i++) { 41c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com canvas->drawRect(r, paint); 42c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com } 43580a17241c51712f26441c6551c773e3769738e9sugoi@google.com } 44580a17241c51712f26441c6551c773e3769738e9sugoi@google.com 45580a17241c51712f26441c6551c773e3769738e9sugoi@google.comprivate: 46580a17241c51712f26441c6551c773e3769738e9sugoi@google.com SkImageFilter* mergeBitmaps() { 47cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org SkImageFilter* first = SkBitmapSource::Create(fCheckerboard); 48cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org SkImageFilter* second = SkBitmapSource::Create(fBitmap); 49580a17241c51712f26441c6551c773e3769738e9sugoi@google.com SkAutoUnref aur0(first); 50580a17241c51712f26441c6551c773e3769738e9sugoi@google.com SkAutoUnref aur1(second); 51cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org return SkMergeImageFilter::Create(first, second); 52580a17241c51712f26441c6551c773e3769738e9sugoi@google.com } 53580a17241c51712f26441c6551c773e3769738e9sugoi@google.com 54580a17241c51712f26441c6551c773e3769738e9sugoi@google.com void make_bitmap() { 556c22573edb234ad14df947278cfed010669a39a7reed fBitmap.allocN32Pixels(80, 80); 566c22573edb234ad14df947278cfed010669a39a7reed SkCanvas canvas(fBitmap); 57580a17241c51712f26441c6551c773e3769738e9sugoi@google.com canvas.clear(0x00000000); 58580a17241c51712f26441c6551c773e3769738e9sugoi@google.com SkPaint paint; 59580a17241c51712f26441c6551c773e3769738e9sugoi@google.com paint.setAntiAlias(true); 60580a17241c51712f26441c6551c773e3769738e9sugoi@google.com paint.setColor(0xFF884422); 61580a17241c51712f26441c6551c773e3769738e9sugoi@google.com paint.setTextSize(SkIntToScalar(96)); 62580a17241c51712f26441c6551c773e3769738e9sugoi@google.com const char* str = "g"; 63580a17241c51712f26441c6551c773e3769738e9sugoi@google.com canvas.drawText(str, strlen(str), SkIntToScalar(15), SkIntToScalar(55), paint); 64580a17241c51712f26441c6551c773e3769738e9sugoi@google.com } 65580a17241c51712f26441c6551c773e3769738e9sugoi@google.com 66580a17241c51712f26441c6551c773e3769738e9sugoi@google.com void make_checkerboard() { 676c22573edb234ad14df947278cfed010669a39a7reed fCheckerboard.allocN32Pixels(80, 80); 686c22573edb234ad14df947278cfed010669a39a7reed SkCanvas canvas(fCheckerboard); 69580a17241c51712f26441c6551c773e3769738e9sugoi@google.com canvas.clear(0x00000000); 70580a17241c51712f26441c6551c773e3769738e9sugoi@google.com SkPaint darkPaint; 71580a17241c51712f26441c6551c773e3769738e9sugoi@google.com darkPaint.setColor(0xFF804020); 72580a17241c51712f26441c6551c773e3769738e9sugoi@google.com SkPaint lightPaint; 73580a17241c51712f26441c6551c773e3769738e9sugoi@google.com lightPaint.setColor(0xFF244484); 74580a17241c51712f26441c6551c773e3769738e9sugoi@google.com for (int y = 0; y < 80; y += 16) { 75580a17241c51712f26441c6551c773e3769738e9sugoi@google.com for (int x = 0; x < 80; x += 16) { 76580a17241c51712f26441c6551c773e3769738e9sugoi@google.com canvas.save(); 77580a17241c51712f26441c6551c773e3769738e9sugoi@google.com canvas.translate(SkIntToScalar(x), SkIntToScalar(y)); 78580a17241c51712f26441c6551c773e3769738e9sugoi@google.com canvas.drawRect(SkRect::MakeXYWH(0, 0, 8, 8), darkPaint); 79580a17241c51712f26441c6551c773e3769738e9sugoi@google.com canvas.drawRect(SkRect::MakeXYWH(8, 0, 8, 8), lightPaint); 80580a17241c51712f26441c6551c773e3769738e9sugoi@google.com canvas.drawRect(SkRect::MakeXYWH(0, 8, 8, 8), lightPaint); 81580a17241c51712f26441c6551c773e3769738e9sugoi@google.com canvas.drawRect(SkRect::MakeXYWH(8, 8, 8, 8), darkPaint); 82580a17241c51712f26441c6551c773e3769738e9sugoi@google.com canvas.restore(); 83580a17241c51712f26441c6551c773e3769738e9sugoi@google.com } 84580a17241c51712f26441c6551c773e3769738e9sugoi@google.com } 85580a17241c51712f26441c6551c773e3769738e9sugoi@google.com } 86580a17241c51712f26441c6551c773e3769738e9sugoi@google.com 87580a17241c51712f26441c6551c773e3769738e9sugoi@google.com bool fIsSmall; 88580a17241c51712f26441c6551c773e3769738e9sugoi@google.com bool fInitialized; 89580a17241c51712f26441c6551c773e3769738e9sugoi@google.com SkBitmap fBitmap, fCheckerboard; 90580a17241c51712f26441c6551c773e3769738e9sugoi@google.com 91f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina typedef Benchmark INHERITED; 92580a17241c51712f26441c6551c773e3769738e9sugoi@google.com}; 93580a17241c51712f26441c6551c773e3769738e9sugoi@google.com 94580a17241c51712f26441c6551c773e3769738e9sugoi@google.com/////////////////////////////////////////////////////////////////////////////// 95580a17241c51712f26441c6551c773e3769738e9sugoi@google.com 96410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new MergeBench(true); ) 97410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new MergeBench(false); ) 98