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 */
7f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h"
8580a17241c51712f26441c6551c773e3769738e9sugoi@google.com#include "SkCanvas.h"
9580a17241c51712f26441c6551c773e3769738e9sugoi@google.com#include "SkColorFilterImageFilter.h"
10580a17241c51712f26441c6551c773e3769738e9sugoi@google.com#include "SkColorMatrixFilter.h"
116c1ee2d4e727357451c8a6fcf4a08e75890b5d6dcommit-bot@chromium.org#include "SkLumaColorFilter.h"
12580a17241c51712f26441c6551c773e3769738e9sugoi@google.com#include "SkTableColorFilter.h"
13580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
14580a17241c51712f26441c6551c773e3769738e9sugoi@google.com#define FILTER_WIDTH_SMALL  SkIntToScalar(32)
15580a17241c51712f26441c6551c773e3769738e9sugoi@google.com#define FILTER_HEIGHT_SMALL SkIntToScalar(32)
16580a17241c51712f26441c6551c773e3769738e9sugoi@google.com#define FILTER_WIDTH_LARGE  SkIntToScalar(256)
17580a17241c51712f26441c6551c773e3769738e9sugoi@google.com#define FILTER_HEIGHT_LARGE SkIntToScalar(256)
18580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
19f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass ColorFilterBaseBench : public Benchmark {
20580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
21580a17241c51712f26441c6551c773e3769738e9sugoi@google.compublic:
22410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    ColorFilterBaseBench(bool small) : fIsSmall(small) { }
23580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
24580a17241c51712f26441c6551c773e3769738e9sugoi@google.comprotected:
25580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    SkRect getFilterRect() const {
26580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        return isSmall() ? SkRect::MakeWH(FILTER_WIDTH_SMALL, FILTER_HEIGHT_SMALL) :
27580a17241c51712f26441c6551c773e3769738e9sugoi@google.com                           SkRect::MakeWH(FILTER_WIDTH_LARGE, FILTER_HEIGHT_LARGE);
28580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    }
29580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
30580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    static SkImageFilter* make_brightness(float amount, SkImageFilter* input = NULL) {
314b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org        SkScalar amount255 = SkScalarMul(amount, SkIntToScalar(255));
32580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        SkScalar matrix[20] = { 1, 0, 0, 0, amount255,
33580a17241c51712f26441c6551c773e3769738e9sugoi@google.com                                0, 1, 0, 0, amount255,
34580a17241c51712f26441c6551c773e3769738e9sugoi@google.com                                0, 0, 1, 0, amount255,
35580a17241c51712f26441c6551c773e3769738e9sugoi@google.com                                0, 0, 0, 1, 0 };
36727a352f7412753d2a3e4d30eab6500a1a4de135commit-bot@chromium.org        SkAutoTUnref<SkColorFilter> filter(SkColorMatrixFilter::Create(matrix));
37580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        return SkColorFilterImageFilter::Create(filter, input);
38580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    }
39580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
40580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    static SkImageFilter* make_grayscale(SkImageFilter* input = NULL) {
41580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        SkScalar matrix[20];
42580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        memset(matrix, 0, 20 * sizeof(SkScalar));
434b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org        matrix[0] = matrix[5] = matrix[10] = 0.2126f;
444b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org        matrix[1] = matrix[6] = matrix[11] = 0.7152f;
454b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org        matrix[2] = matrix[7] = matrix[12] = 0.0722f;
464b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org        matrix[18] = 1.0f;
47727a352f7412753d2a3e4d30eab6500a1a4de135commit-bot@chromium.org        SkAutoTUnref<SkColorFilter> filter(SkColorMatrixFilter::Create(matrix));
48580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        return SkColorFilterImageFilter::Create(filter, input);
49580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    }
50580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
51580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    static SkImageFilter* make_mode_blue(SkImageFilter* input = NULL) {
52580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        SkAutoTUnref<SkColorFilter> filter(
53580a17241c51712f26441c6551c773e3769738e9sugoi@google.com            SkColorFilter::CreateModeFilter(SK_ColorBLUE, SkXfermode::kSrcIn_Mode));
54580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        return SkColorFilterImageFilter::Create(filter, input);
55580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    }
56580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
57580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    inline bool isSmall() const { return fIsSmall; }
58580a17241c51712f26441c6551c773e3769738e9sugoi@google.comprivate:
59580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    bool fIsSmall;
60580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
61f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
62580a17241c51712f26441c6551c773e3769738e9sugoi@google.com};
63580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
64580a17241c51712f26441c6551c773e3769738e9sugoi@google.comclass ColorFilterDimBrightBench : public ColorFilterBaseBench {
65580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
66580a17241c51712f26441c6551c773e3769738e9sugoi@google.compublic:
67410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    ColorFilterDimBrightBench(bool small) : INHERITED(small) {
68580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    }
69580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
70580a17241c51712f26441c6551c773e3769738e9sugoi@google.comprotected:
71580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    virtual const char* onGetName() SK_OVERRIDE {
72580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        return isSmall() ? "colorfilter_dim_bright_small" : "colorfilter_dim_bright_large";
73580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    }
74580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
753361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
76580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        SkRect r = getFilterRect();
77580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        SkPaint paint;
78580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        paint.setColor(SK_ColorRED);
79c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com
803361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; i++) {
81c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com            for (float brightness = -1.0f; brightness <= 1.0f; brightness += 0.4f) {
82c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                SkAutoTUnref<SkImageFilter> dim(make_brightness(-brightness));
83c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                SkAutoTUnref<SkImageFilter> bright(make_brightness(brightness, dim));
84c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                paint.setImageFilter(bright);
85c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com                canvas->drawRect(r, paint);
86c289743864e2ab926a95e617a5cd1d29b26d1825mtklein@google.com            }
87580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        }
88580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    }
89580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
90580a17241c51712f26441c6551c773e3769738e9sugoi@google.comprivate:
91580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    typedef ColorFilterBaseBench INHERITED;
92580a17241c51712f26441c6551c773e3769738e9sugoi@google.com};
93580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
94580a17241c51712f26441c6551c773e3769738e9sugoi@google.comclass ColorFilterBrightGrayBench : public ColorFilterBaseBench {
95580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
96580a17241c51712f26441c6551c773e3769738e9sugoi@google.compublic:
97410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    ColorFilterBrightGrayBench(bool small) : INHERITED(small) {
98580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    }
99580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
100580a17241c51712f26441c6551c773e3769738e9sugoi@google.comprotected:
101580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    virtual const char* onGetName() SK_OVERRIDE {
102580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        return isSmall() ? "colorfilter_bright_gray_small" : "colorfilter_bright_gray_large";
103580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    }
104580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
1053361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
106580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        SkRect r = getFilterRect();
107580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        SkPaint paint;
108580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        paint.setColor(SK_ColorRED);
1093361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; i++) {
110580a17241c51712f26441c6551c773e3769738e9sugoi@google.com            SkAutoTUnref<SkImageFilter> brightness(make_brightness(0.9f));
111580a17241c51712f26441c6551c773e3769738e9sugoi@google.com            SkAutoTUnref<SkImageFilter> grayscale(make_grayscale(brightness));
112580a17241c51712f26441c6551c773e3769738e9sugoi@google.com            paint.setImageFilter(grayscale);
113580a17241c51712f26441c6551c773e3769738e9sugoi@google.com            canvas->drawRect(r, paint);
114580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        }
115580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    }
116580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
117580a17241c51712f26441c6551c773e3769738e9sugoi@google.comprivate:
118580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    typedef ColorFilterBaseBench INHERITED;
119580a17241c51712f26441c6551c773e3769738e9sugoi@google.com};
120580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
121580a17241c51712f26441c6551c773e3769738e9sugoi@google.comclass ColorFilterGrayBrightBench : public ColorFilterBaseBench {
122580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
123580a17241c51712f26441c6551c773e3769738e9sugoi@google.compublic:
124410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    ColorFilterGrayBrightBench(bool small) : INHERITED(small) {
125580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    }
126580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
127580a17241c51712f26441c6551c773e3769738e9sugoi@google.comprotected:
128580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    virtual const char* onGetName() SK_OVERRIDE {
129580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        return isSmall() ? "colorfilter_gray_bright_small" : "colorfilter_gray_bright_large";
130580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    }
131580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
1323361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
133580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        SkRect r = getFilterRect();
134580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        SkPaint paint;
135580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        paint.setColor(SK_ColorRED);
1363361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; i++) {
137580a17241c51712f26441c6551c773e3769738e9sugoi@google.com            SkAutoTUnref<SkImageFilter> grayscale(make_grayscale());
138580a17241c51712f26441c6551c773e3769738e9sugoi@google.com            SkAutoTUnref<SkImageFilter> brightness(make_brightness(0.9f, grayscale));
139580a17241c51712f26441c6551c773e3769738e9sugoi@google.com            paint.setImageFilter(brightness);
140580a17241c51712f26441c6551c773e3769738e9sugoi@google.com            canvas->drawRect(r, paint);
141580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        }
142580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    }
143580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
144580a17241c51712f26441c6551c773e3769738e9sugoi@google.comprivate:
145580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    typedef ColorFilterBaseBench INHERITED;
146580a17241c51712f26441c6551c773e3769738e9sugoi@google.com};
147580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
148580a17241c51712f26441c6551c773e3769738e9sugoi@google.comclass ColorFilterBlueBrightBench : public ColorFilterBaseBench {
149580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
150580a17241c51712f26441c6551c773e3769738e9sugoi@google.compublic:
151410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    ColorFilterBlueBrightBench(bool small) : INHERITED(small) {
152580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    }
153580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
154580a17241c51712f26441c6551c773e3769738e9sugoi@google.comprotected:
155580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    virtual const char* onGetName() SK_OVERRIDE {
156580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        return isSmall() ? "colorfilter_blue_bright_small" : "colorfilter_blue_bright_large";
157580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    }
158580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
1593361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
160580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        SkRect r = getFilterRect();
161580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        SkPaint paint;
162580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        paint.setColor(SK_ColorRED);
1633361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; i++) {
164580a17241c51712f26441c6551c773e3769738e9sugoi@google.com            SkAutoTUnref<SkImageFilter> blue(make_mode_blue());
165580a17241c51712f26441c6551c773e3769738e9sugoi@google.com            SkAutoTUnref<SkImageFilter> brightness(make_brightness(1.0f, blue));
166580a17241c51712f26441c6551c773e3769738e9sugoi@google.com            paint.setImageFilter(brightness);
167580a17241c51712f26441c6551c773e3769738e9sugoi@google.com            canvas->drawRect(r, paint);
168580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        }
169580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    }
170580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
171580a17241c51712f26441c6551c773e3769738e9sugoi@google.comprivate:
172580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    typedef ColorFilterBaseBench INHERITED;
173580a17241c51712f26441c6551c773e3769738e9sugoi@google.com};
174580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
175580a17241c51712f26441c6551c773e3769738e9sugoi@google.comclass ColorFilterBrightBlueBench : public ColorFilterBaseBench {
176580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
177580a17241c51712f26441c6551c773e3769738e9sugoi@google.compublic:
178410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    ColorFilterBrightBlueBench(bool small) : INHERITED(small) {
179580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    }
180580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
181580a17241c51712f26441c6551c773e3769738e9sugoi@google.comprotected:
182580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    virtual const char* onGetName() SK_OVERRIDE {
183580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        return isSmall() ? "colorfilter_bright_blue_small" : "colorfilter_bright_blue_large";
184580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    }
185580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
1863361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
187580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        SkRect r = getFilterRect();
188580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        SkPaint paint;
189580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        paint.setColor(SK_ColorRED);
1903361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; i++) {
191580a17241c51712f26441c6551c773e3769738e9sugoi@google.com            SkAutoTUnref<SkImageFilter> brightness(make_brightness(1.0f));
192580a17241c51712f26441c6551c773e3769738e9sugoi@google.com            SkAutoTUnref<SkImageFilter> blue(make_mode_blue(brightness));
193580a17241c51712f26441c6551c773e3769738e9sugoi@google.com            paint.setImageFilter(blue);
194580a17241c51712f26441c6551c773e3769738e9sugoi@google.com            canvas->drawRect(r, paint);
195580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        }
196580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    }
197580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
198580a17241c51712f26441c6551c773e3769738e9sugoi@google.comprivate:
199580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    typedef ColorFilterBaseBench INHERITED;
200580a17241c51712f26441c6551c773e3769738e9sugoi@google.com};
201580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
202580a17241c51712f26441c6551c773e3769738e9sugoi@google.comclass ColorFilterBrightBench : public ColorFilterBaseBench {
203580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
204580a17241c51712f26441c6551c773e3769738e9sugoi@google.compublic:
205410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    ColorFilterBrightBench(bool small) : INHERITED(small) {
206580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    }
207580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
208580a17241c51712f26441c6551c773e3769738e9sugoi@google.comprotected:
209580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    virtual const char* onGetName() SK_OVERRIDE {
210580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        return isSmall() ? "colorfilter_bright_small" : "colorfilter_bright_large";
211580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    }
212580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
2133361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
214580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        SkRect r = getFilterRect();
215580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        SkPaint paint;
216580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        paint.setColor(SK_ColorRED);
2173361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; i++) {
218580a17241c51712f26441c6551c773e3769738e9sugoi@google.com            SkAutoTUnref<SkImageFilter> brightness(make_brightness(1.0f));
219580a17241c51712f26441c6551c773e3769738e9sugoi@google.com            paint.setImageFilter(brightness);
220580a17241c51712f26441c6551c773e3769738e9sugoi@google.com            canvas->drawRect(r, paint);
221580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        }
222580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    }
223580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
224580a17241c51712f26441c6551c773e3769738e9sugoi@google.comprivate:
225580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    typedef ColorFilterBaseBench INHERITED;
226580a17241c51712f26441c6551c773e3769738e9sugoi@google.com};
227580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
228580a17241c51712f26441c6551c773e3769738e9sugoi@google.comclass ColorFilterBlueBench : public ColorFilterBaseBench {
229580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
230580a17241c51712f26441c6551c773e3769738e9sugoi@google.compublic:
231410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    ColorFilterBlueBench(bool small) : INHERITED(small) {
232580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    }
233580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
234580a17241c51712f26441c6551c773e3769738e9sugoi@google.comprotected:
235580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    virtual const char* onGetName() SK_OVERRIDE {
236580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        return isSmall() ? "colorfilter_blue_small" : "colorfilter_blue_large";
237580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    }
238580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
2393361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
240580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        SkRect r = getFilterRect();
241580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        SkPaint paint;
242580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        paint.setColor(SK_ColorRED);
2433361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; i++) {
244580a17241c51712f26441c6551c773e3769738e9sugoi@google.com            SkAutoTUnref<SkImageFilter> blue(make_mode_blue());
245580a17241c51712f26441c6551c773e3769738e9sugoi@google.com            paint.setImageFilter(blue);
246580a17241c51712f26441c6551c773e3769738e9sugoi@google.com            canvas->drawRect(r, paint);
247580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        }
248580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    }
249580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
250580a17241c51712f26441c6551c773e3769738e9sugoi@google.comprivate:
251580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    typedef ColorFilterBaseBench INHERITED;
252580a17241c51712f26441c6551c773e3769738e9sugoi@google.com};
253580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
254580a17241c51712f26441c6551c773e3769738e9sugoi@google.comclass ColorFilterGrayBench : public ColorFilterBaseBench {
255580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
256580a17241c51712f26441c6551c773e3769738e9sugoi@google.compublic:
257410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    ColorFilterGrayBench(bool small) : INHERITED(small) {
258580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    }
259580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
260580a17241c51712f26441c6551c773e3769738e9sugoi@google.comprotected:
261580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    virtual const char* onGetName() SK_OVERRIDE {
262580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        return isSmall() ? "colorfilter_gray_small" : "colorfilter_gray_large";
263580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    }
264580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
2653361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
266580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        SkRect r = getFilterRect();
267580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        SkPaint paint;
268580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        paint.setColor(SK_ColorRED);
2693361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; i++) {
270580a17241c51712f26441c6551c773e3769738e9sugoi@google.com            SkAutoTUnref<SkImageFilter> grayscale(make_grayscale());
271580a17241c51712f26441c6551c773e3769738e9sugoi@google.com            paint.setImageFilter(grayscale);
272580a17241c51712f26441c6551c773e3769738e9sugoi@google.com            canvas->drawRect(r, paint);
273580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        }
274580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    }
275580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
276580a17241c51712f26441c6551c773e3769738e9sugoi@google.comprivate:
277580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    typedef ColorFilterBaseBench INHERITED;
278580a17241c51712f26441c6551c773e3769738e9sugoi@google.com};
279580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
280580a17241c51712f26441c6551c773e3769738e9sugoi@google.comclass TableColorFilterBench : public ColorFilterBaseBench {
281580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
282580a17241c51712f26441c6551c773e3769738e9sugoi@google.compublic:
283410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    TableColorFilterBench(bool small) : INHERITED(small) {
284580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    }
285580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
286580a17241c51712f26441c6551c773e3769738e9sugoi@google.comprotected:
287580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    virtual const char* onGetName() SK_OVERRIDE {
288580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        return isSmall() ? "table_colorfilter_small" : "table_colorfilter_large";
289580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    }
290580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
2913361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
292580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        SkRect r = getFilterRect();
293580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        SkPaint paint;
294580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        paint.setColor(SK_ColorRED);
2953361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; i++) {
296580a17241c51712f26441c6551c773e3769738e9sugoi@google.com            SkAutoTUnref<SkColorFilter> table_filter(make_table_filter());
297580a17241c51712f26441c6551c773e3769738e9sugoi@google.com            paint.setColorFilter(table_filter);
298580a17241c51712f26441c6551c773e3769738e9sugoi@google.com            canvas->drawRect(r, paint);
299580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        }
300580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    }
301580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
302580a17241c51712f26441c6551c773e3769738e9sugoi@google.comprivate:
303580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    static void fill_table_data(uint8_t table[]) {
304580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        for (int i = 0; i < 256; ++i) {
305580a17241c51712f26441c6551c773e3769738e9sugoi@google.com            int n = i >> 5;
306580a17241c51712f26441c6551c773e3769738e9sugoi@google.com            table[i] = (n << 5) | (n << 2) | (n >> 1);
307580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        }
308580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    }
309580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
310580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    static SkColorFilter* make_table_filter() {
311580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        uint8_t table[256]; fill_table_data(table);
312580a17241c51712f26441c6551c773e3769738e9sugoi@google.com        return SkTableColorFilter::Create(table);
313580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    }
314580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
315580a17241c51712f26441c6551c773e3769738e9sugoi@google.com    typedef ColorFilterBaseBench INHERITED;
316580a17241c51712f26441c6551c773e3769738e9sugoi@google.com};
317580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
3186c1ee2d4e727357451c8a6fcf4a08e75890b5d6dcommit-bot@chromium.orgclass LumaColorFilterBench : public ColorFilterBaseBench {
3196c1ee2d4e727357451c8a6fcf4a08e75890b5d6dcommit-bot@chromium.org
3206c1ee2d4e727357451c8a6fcf4a08e75890b5d6dcommit-bot@chromium.orgpublic:
3216c1ee2d4e727357451c8a6fcf4a08e75890b5d6dcommit-bot@chromium.org    LumaColorFilterBench(bool small) : INHERITED(small) {
3226c1ee2d4e727357451c8a6fcf4a08e75890b5d6dcommit-bot@chromium.org    }
3236c1ee2d4e727357451c8a6fcf4a08e75890b5d6dcommit-bot@chromium.org
3246c1ee2d4e727357451c8a6fcf4a08e75890b5d6dcommit-bot@chromium.orgprotected:
3256c1ee2d4e727357451c8a6fcf4a08e75890b5d6dcommit-bot@chromium.org    virtual const char* onGetName() SK_OVERRIDE {
3266c1ee2d4e727357451c8a6fcf4a08e75890b5d6dcommit-bot@chromium.org        return isSmall() ? "luma_colorfilter_small" : "luma_colorfilter_large";
3276c1ee2d4e727357451c8a6fcf4a08e75890b5d6dcommit-bot@chromium.org    }
3286c1ee2d4e727357451c8a6fcf4a08e75890b5d6dcommit-bot@chromium.org
3293361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
3306c1ee2d4e727357451c8a6fcf4a08e75890b5d6dcommit-bot@chromium.org        SkRect r = getFilterRect();
3316c1ee2d4e727357451c8a6fcf4a08e75890b5d6dcommit-bot@chromium.org        SkPaint paint;
3326c1ee2d4e727357451c8a6fcf4a08e75890b5d6dcommit-bot@chromium.org        paint.setColor(SK_ColorRED);
3336c1ee2d4e727357451c8a6fcf4a08e75890b5d6dcommit-bot@chromium.org
3343361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; i++) {
3356c1ee2d4e727357451c8a6fcf4a08e75890b5d6dcommit-bot@chromium.org            SkAutoTUnref<SkColorFilter> luma_filter(SkLumaColorFilter::Create());
3366c1ee2d4e727357451c8a6fcf4a08e75890b5d6dcommit-bot@chromium.org            paint.setColorFilter(luma_filter);
3376c1ee2d4e727357451c8a6fcf4a08e75890b5d6dcommit-bot@chromium.org            canvas->drawRect(r, paint);
3386c1ee2d4e727357451c8a6fcf4a08e75890b5d6dcommit-bot@chromium.org        }
3396c1ee2d4e727357451c8a6fcf4a08e75890b5d6dcommit-bot@chromium.org    }
3406c1ee2d4e727357451c8a6fcf4a08e75890b5d6dcommit-bot@chromium.org
3416c1ee2d4e727357451c8a6fcf4a08e75890b5d6dcommit-bot@chromium.orgprivate:
3426c1ee2d4e727357451c8a6fcf4a08e75890b5d6dcommit-bot@chromium.org    typedef ColorFilterBaseBench INHERITED;
3436c1ee2d4e727357451c8a6fcf4a08e75890b5d6dcommit-bot@chromium.org};
3446c1ee2d4e727357451c8a6fcf4a08e75890b5d6dcommit-bot@chromium.org
345580a17241c51712f26441c6551c773e3769738e9sugoi@google.com///////////////////////////////////////////////////////////////////////////////
346580a17241c51712f26441c6551c773e3769738e9sugoi@google.com
347410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ColorFilterDimBrightBench(true); )
348410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ColorFilterBrightGrayBench(true); )
349410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ColorFilterGrayBrightBench(true); )
350410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ColorFilterBlueBrightBench(true); )
351410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ColorFilterBrightBlueBench(true); )
352410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ColorFilterBrightBench(true); )
353410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ColorFilterBlueBench(true); )
354410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ColorFilterGrayBench(true); )
355410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new TableColorFilterBench(true); )
3566c1ee2d4e727357451c8a6fcf4a08e75890b5d6dcommit-bot@chromium.orgDEF_BENCH( return new LumaColorFilterBench(true); )
357410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com
358410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ColorFilterDimBrightBench(false); )
359410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ColorFilterBrightGrayBench(false); )
360410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ColorFilterGrayBrightBench(false); )
361410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ColorFilterBlueBrightBench(false); )
362410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ColorFilterBrightBlueBench(false); )
363410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ColorFilterBrightBench(false); )
364410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ColorFilterBlueBench(false); )
365410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ColorFilterGrayBench(false); )
366410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new TableColorFilterBench(false); )
3676c1ee2d4e727357451c8a6fcf4a08e75890b5d6dcommit-bot@chromium.orgDEF_BENCH( return new LumaColorFilterBench(false); )
368