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