17839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger/*
27839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * Copyright 2013 Google Inc.
37839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger *
47839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * Use of this source code is governed by a BSD-style license that can be
57839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * found in the LICENSE file.
67839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger */
77839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkBenchmark.h"
87839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkCanvas.h"
97839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkColorFilterImageFilter.h"
107839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkColorMatrixFilter.h"
110a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include "SkLumaColorFilter.h"
127839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkTableColorFilter.h"
137839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
147839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define FILTER_WIDTH_SMALL  SkIntToScalar(32)
157839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define FILTER_HEIGHT_SMALL SkIntToScalar(32)
167839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define FILTER_WIDTH_LARGE  SkIntToScalar(256)
177839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#define FILTER_HEIGHT_LARGE SkIntToScalar(256)
187839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
197839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerclass ColorFilterBaseBench : public SkBenchmark {
207839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
217839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerpublic:
220a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    ColorFilterBaseBench(bool small) : fIsSmall(small) { }
237839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
247839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerprotected:
257839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    SkRect getFilterRect() const {
267839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        return isSmall() ? SkRect::MakeWH(FILTER_WIDTH_SMALL, FILTER_HEIGHT_SMALL) :
277839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                           SkRect::MakeWH(FILTER_WIDTH_LARGE, FILTER_HEIGHT_LARGE);
287839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
297839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
307839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    static SkImageFilter* make_brightness(float amount, SkImageFilter* input = NULL) {
31910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger        SkScalar amount255 = SkScalarMul(amount, SkIntToScalar(255));
327839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkScalar matrix[20] = { 1, 0, 0, 0, amount255,
337839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                                0, 1, 0, 0, amount255,
347839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                                0, 0, 1, 0, amount255,
357839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                                0, 0, 0, 1, 0 };
367839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkAutoTUnref<SkColorFilter> filter(new SkColorMatrixFilter(matrix));
377839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        return SkColorFilterImageFilter::Create(filter, input);
387839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
397839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
407839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    static SkImageFilter* make_grayscale(SkImageFilter* input = NULL) {
417839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkScalar matrix[20];
427839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        memset(matrix, 0, 20 * sizeof(SkScalar));
43910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger        matrix[0] = matrix[5] = matrix[10] = 0.2126f;
44910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger        matrix[1] = matrix[6] = matrix[11] = 0.7152f;
45910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger        matrix[2] = matrix[7] = matrix[12] = 0.0722f;
46910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger        matrix[18] = 1.0f;
477839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkAutoTUnref<SkColorFilter> filter(new SkColorMatrixFilter(matrix));
487839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        return SkColorFilterImageFilter::Create(filter, input);
497839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
507839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
517839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    static SkImageFilter* make_mode_blue(SkImageFilter* input = NULL) {
527839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkAutoTUnref<SkColorFilter> filter(
537839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            SkColorFilter::CreateModeFilter(SK_ColorBLUE, SkXfermode::kSrcIn_Mode));
547839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        return SkColorFilterImageFilter::Create(filter, input);
557839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
567839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
577839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    inline bool isSmall() const { return fIsSmall; }
587839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerprivate:
597839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    bool fIsSmall;
607839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
617839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    typedef SkBenchmark INHERITED;
627839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger};
637839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
647839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerclass ColorFilterDimBrightBench : public ColorFilterBaseBench {
657839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
667839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerpublic:
670a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    ColorFilterDimBrightBench(bool small) : INHERITED(small) {
687839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
697839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
707839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerprotected:
717839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    virtual const char* onGetName() SK_OVERRIDE {
727839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        return isSmall() ? "colorfilter_dim_bright_small" : "colorfilter_dim_bright_large";
737839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
747839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
75910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
767839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkRect r = getFilterRect();
777839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkPaint paint;
787839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        paint.setColor(SK_ColorRED);
790a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
80910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger        for (int i = 0; i < loops; i++) {
810a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger            for (float brightness = -1.0f; brightness <= 1.0f; brightness += 0.4f) {
820a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                SkAutoTUnref<SkImageFilter> dim(make_brightness(-brightness));
830a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                SkAutoTUnref<SkImageFilter> bright(make_brightness(brightness, dim));
840a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                paint.setImageFilter(bright);
850a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                canvas->drawRect(r, paint);
860a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger            }
877839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
887839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
897839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
907839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerprivate:
917839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    typedef ColorFilterBaseBench INHERITED;
927839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger};
937839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
947839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerclass ColorFilterBrightGrayBench : public ColorFilterBaseBench {
957839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
967839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerpublic:
970a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    ColorFilterBrightGrayBench(bool small) : INHERITED(small) {
987839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
997839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1007839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerprotected:
1017839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    virtual const char* onGetName() SK_OVERRIDE {
1027839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        return isSmall() ? "colorfilter_bright_gray_small" : "colorfilter_bright_gray_large";
1037839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
1047839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
105910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
1067839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkRect r = getFilterRect();
1077839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkPaint paint;
1087839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        paint.setColor(SK_ColorRED);
109910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger        for (int i = 0; i < loops; i++) {
1107839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            SkAutoTUnref<SkImageFilter> brightness(make_brightness(0.9f));
1117839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            SkAutoTUnref<SkImageFilter> grayscale(make_grayscale(brightness));
1127839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            paint.setImageFilter(grayscale);
1137839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->drawRect(r, paint);
1147839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
1157839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
1167839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1177839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerprivate:
1187839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    typedef ColorFilterBaseBench INHERITED;
1197839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger};
1207839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1217839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerclass ColorFilterGrayBrightBench : public ColorFilterBaseBench {
1227839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1237839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerpublic:
1240a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    ColorFilterGrayBrightBench(bool small) : INHERITED(small) {
1257839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
1267839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1277839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerprotected:
1287839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    virtual const char* onGetName() SK_OVERRIDE {
1297839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        return isSmall() ? "colorfilter_gray_bright_small" : "colorfilter_gray_bright_large";
1307839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
1317839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
132910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
1337839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkRect r = getFilterRect();
1347839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkPaint paint;
1357839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        paint.setColor(SK_ColorRED);
136910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger        for (int i = 0; i < loops; i++) {
1377839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            SkAutoTUnref<SkImageFilter> grayscale(make_grayscale());
1387839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            SkAutoTUnref<SkImageFilter> brightness(make_brightness(0.9f, grayscale));
1397839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            paint.setImageFilter(brightness);
1407839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->drawRect(r, paint);
1417839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
1427839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
1437839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1447839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerprivate:
1457839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    typedef ColorFilterBaseBench INHERITED;
1467839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger};
1477839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1487839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerclass ColorFilterBlueBrightBench : public ColorFilterBaseBench {
1497839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1507839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerpublic:
1510a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    ColorFilterBlueBrightBench(bool small) : INHERITED(small) {
1527839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
1537839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1547839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerprotected:
1557839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    virtual const char* onGetName() SK_OVERRIDE {
1567839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        return isSmall() ? "colorfilter_blue_bright_small" : "colorfilter_blue_bright_large";
1577839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
1587839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
159910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
1607839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkRect r = getFilterRect();
1617839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkPaint paint;
1627839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        paint.setColor(SK_ColorRED);
163910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger        for (int i = 0; i < loops; i++) {
1647839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            SkAutoTUnref<SkImageFilter> blue(make_mode_blue());
1657839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            SkAutoTUnref<SkImageFilter> brightness(make_brightness(1.0f, blue));
1667839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            paint.setImageFilter(brightness);
1677839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->drawRect(r, paint);
1687839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
1697839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
1707839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1717839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerprivate:
1727839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    typedef ColorFilterBaseBench INHERITED;
1737839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger};
1747839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1757839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerclass ColorFilterBrightBlueBench : public ColorFilterBaseBench {
1767839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1777839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerpublic:
1780a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    ColorFilterBrightBlueBench(bool small) : INHERITED(small) {
1797839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
1807839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1817839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerprotected:
1827839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    virtual const char* onGetName() SK_OVERRIDE {
1837839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        return isSmall() ? "colorfilter_bright_blue_small" : "colorfilter_bright_blue_large";
1847839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
1857839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
186910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
1877839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkRect r = getFilterRect();
1887839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkPaint paint;
1897839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        paint.setColor(SK_ColorRED);
190910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger        for (int i = 0; i < loops; i++) {
1917839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            SkAutoTUnref<SkImageFilter> brightness(make_brightness(1.0f));
1927839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            SkAutoTUnref<SkImageFilter> blue(make_mode_blue(brightness));
1937839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            paint.setImageFilter(blue);
1947839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->drawRect(r, paint);
1957839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
1967839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
1977839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1987839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerprivate:
1997839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    typedef ColorFilterBaseBench INHERITED;
2007839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger};
2017839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
2027839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerclass ColorFilterBrightBench : public ColorFilterBaseBench {
2037839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
2047839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerpublic:
2050a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    ColorFilterBrightBench(bool small) : INHERITED(small) {
2067839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
2077839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
2087839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerprotected:
2097839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    virtual const char* onGetName() SK_OVERRIDE {
2107839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        return isSmall() ? "colorfilter_bright_small" : "colorfilter_bright_large";
2117839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
2127839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
213910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
2147839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkRect r = getFilterRect();
2157839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkPaint paint;
2167839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        paint.setColor(SK_ColorRED);
217910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger        for (int i = 0; i < loops; i++) {
2187839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            SkAutoTUnref<SkImageFilter> brightness(make_brightness(1.0f));
2197839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            paint.setImageFilter(brightness);
2207839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->drawRect(r, paint);
2217839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
2227839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
2237839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
2247839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerprivate:
2257839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    typedef ColorFilterBaseBench INHERITED;
2267839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger};
2277839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
2287839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerclass ColorFilterBlueBench : public ColorFilterBaseBench {
2297839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
2307839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerpublic:
2310a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    ColorFilterBlueBench(bool small) : INHERITED(small) {
2327839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
2337839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
2347839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerprotected:
2357839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    virtual const char* onGetName() SK_OVERRIDE {
2367839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        return isSmall() ? "colorfilter_blue_small" : "colorfilter_blue_large";
2377839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
2387839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
239910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
2407839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkRect r = getFilterRect();
2417839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkPaint paint;
2427839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        paint.setColor(SK_ColorRED);
243910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger        for (int i = 0; i < loops; i++) {
2447839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            SkAutoTUnref<SkImageFilter> blue(make_mode_blue());
2457839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            paint.setImageFilter(blue);
2467839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->drawRect(r, paint);
2477839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
2487839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
2497839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
2507839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerprivate:
2517839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    typedef ColorFilterBaseBench INHERITED;
2527839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger};
2537839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
2547839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerclass ColorFilterGrayBench : public ColorFilterBaseBench {
2557839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
2567839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerpublic:
2570a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    ColorFilterGrayBench(bool small) : INHERITED(small) {
2587839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
2597839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
2607839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerprotected:
2617839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    virtual const char* onGetName() SK_OVERRIDE {
2627839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        return isSmall() ? "colorfilter_gray_small" : "colorfilter_gray_large";
2637839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
2647839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
265910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
2667839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkRect r = getFilterRect();
2677839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkPaint paint;
2687839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        paint.setColor(SK_ColorRED);
269910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger        for (int i = 0; i < loops; i++) {
2707839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            SkAutoTUnref<SkImageFilter> grayscale(make_grayscale());
2717839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            paint.setImageFilter(grayscale);
2727839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->drawRect(r, paint);
2737839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
2747839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
2757839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
2767839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerprivate:
2777839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    typedef ColorFilterBaseBench INHERITED;
2787839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger};
2797839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
2807839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerclass TableColorFilterBench : public ColorFilterBaseBench {
2817839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
2827839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerpublic:
2830a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    TableColorFilterBench(bool small) : INHERITED(small) {
2847839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
2857839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
2867839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerprotected:
2877839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    virtual const char* onGetName() SK_OVERRIDE {
2887839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        return isSmall() ? "table_colorfilter_small" : "table_colorfilter_large";
2897839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
2907839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
291910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
2927839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkRect r = getFilterRect();
2937839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkPaint paint;
2947839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        paint.setColor(SK_ColorRED);
295910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger        for (int i = 0; i < loops; i++) {
2967839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            SkAutoTUnref<SkColorFilter> table_filter(make_table_filter());
2977839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            paint.setColorFilter(table_filter);
2987839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->drawRect(r, paint);
2997839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
3007839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
3017839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
3027839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerprivate:
3037839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    static void fill_table_data(uint8_t table[]) {
3047839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        for (int i = 0; i < 256; ++i) {
3057839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            int n = i >> 5;
3067839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            table[i] = (n << 5) | (n << 2) | (n >> 1);
3077839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
3087839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
3097839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
3107839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    static SkColorFilter* make_table_filter() {
3117839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        uint8_t table[256]; fill_table_data(table);
3127839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        return SkTableColorFilter::Create(table);
3137839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
3147839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
3157839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    typedef ColorFilterBaseBench INHERITED;
3167839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger};
3177839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
3180a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenbergerclass LumaColorFilterBench : public ColorFilterBaseBench {
3190a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
3200a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenbergerpublic:
3210a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    LumaColorFilterBench(bool small) : INHERITED(small) {
3220a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    }
3230a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
3240a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenbergerprotected:
3250a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    virtual const char* onGetName() SK_OVERRIDE {
3260a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        return isSmall() ? "luma_colorfilter_small" : "luma_colorfilter_large";
3270a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    }
3280a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
329910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
3300a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        SkRect r = getFilterRect();
3310a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        SkPaint paint;
3320a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        paint.setColor(SK_ColorRED);
3330a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
334910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger        for (int i = 0; i < loops; i++) {
3350a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger            SkAutoTUnref<SkColorFilter> luma_filter(SkLumaColorFilter::Create());
3360a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger            paint.setColorFilter(luma_filter);
3370a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger            canvas->drawRect(r, paint);
3380a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        }
3390a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    }
3400a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
3410a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenbergerprivate:
3420a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    typedef ColorFilterBaseBench INHERITED;
3430a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger};
3440a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
3457839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger///////////////////////////////////////////////////////////////////////////////
3467839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
3470a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new ColorFilterDimBrightBench(true); )
3480a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new ColorFilterBrightGrayBench(true); )
3490a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new ColorFilterGrayBrightBench(true); )
3500a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new ColorFilterBlueBrightBench(true); )
3510a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new ColorFilterBrightBlueBench(true); )
3520a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new ColorFilterBrightBench(true); )
3530a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new ColorFilterBlueBench(true); )
3540a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new ColorFilterGrayBench(true); )
3550a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new TableColorFilterBench(true); )
3560a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new LumaColorFilterBench(true); )
3570a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
3580a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new ColorFilterDimBrightBench(false); )
3590a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new ColorFilterBrightGrayBench(false); )
3600a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new ColorFilterGrayBrightBench(false); )
3610a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new ColorFilterBlueBrightBench(false); )
3620a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new ColorFilterBrightBlueBench(false); )
3630a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new ColorFilterBrightBench(false); )
3640a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new ColorFilterBlueBench(false); )
3650a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new ColorFilterGrayBench(false); )
3660a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new TableColorFilterBench(false); )
3670a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new LumaColorFilterBench(false); )
368