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