1 /* 2 * Copyright 2013 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "Benchmark.h" 9 #include "SkCanvas.h" 10 #include "SkColorFilterImageFilter.h" 11 #include "SkColorMatrixFilter.h" 12 13 #define FILTER_WIDTH_SMALL SkIntToScalar(32) 14 #define FILTER_HEIGHT_SMALL SkIntToScalar(32) 15 #define FILTER_WIDTH_LARGE SkIntToScalar(256) 16 #define FILTER_HEIGHT_LARGE SkIntToScalar(256) 17 18 static sk_sp<SkImageFilter> make_brightness(float amount, sk_sp<SkImageFilter> input) { 19 SkScalar amount255 = amount * 255; 20 SkScalar matrix[20] = { 1, 0, 0, 0, amount255, 21 0, 1, 0, 0, amount255, 22 0, 0, 1, 0, amount255, 23 0, 0, 0, 1, 0 }; 24 sk_sp<SkColorFilter> filter(SkColorFilter::MakeMatrixFilterRowMajor255(matrix)); 25 return SkColorFilterImageFilter::Make(std::move(filter), std::move(input)); 26 } 27 28 static sk_sp<SkImageFilter> make_grayscale(sk_sp<SkImageFilter> input) { 29 SkScalar matrix[20]; 30 memset(matrix, 0, 20 * sizeof(SkScalar)); 31 matrix[0] = matrix[5] = matrix[10] = 0.2126f; 32 matrix[1] = matrix[6] = matrix[11] = 0.7152f; 33 matrix[2] = matrix[7] = matrix[12] = 0.0722f; 34 matrix[18] = 1.0f; 35 sk_sp<SkColorFilter> filter(SkColorFilter::MakeMatrixFilterRowMajor255(matrix)); 36 return SkColorFilterImageFilter::Make(std::move(filter), std::move(input)); 37 } 38 39 static sk_sp<SkImageFilter> make_mode_blue(sk_sp<SkImageFilter> input) { 40 sk_sp<SkColorFilter> filter(SkColorFilter::MakeModeFilter(SK_ColorBLUE, SkBlendMode::kSrcIn)); 41 return SkColorFilterImageFilter::Make(std::move(filter), std::move(input)); 42 } 43 44 class ColorFilterBaseBench : public Benchmark { 45 46 public: 47 ColorFilterBaseBench(bool small) : fIsSmall(small) { } 48 49 protected: 50 SkRect getFilterRect() const { 51 return this->isSmall() ? SkRect::MakeWH(FILTER_WIDTH_SMALL, FILTER_HEIGHT_SMALL) : 52 SkRect::MakeWH(FILTER_WIDTH_LARGE, FILTER_HEIGHT_LARGE); 53 } 54 55 inline bool isSmall() const { return fIsSmall; } 56 57 private: 58 bool fIsSmall; 59 60 typedef Benchmark INHERITED; 61 }; 62 63 class ColorFilterDimBrightBench : public ColorFilterBaseBench { 64 65 public: 66 ColorFilterDimBrightBench(bool small) : INHERITED(small) { } 67 68 protected: 69 const char* onGetName() override { 70 return this->isSmall() ? "colorfilter_dim_bright_small" : "colorfilter_dim_bright_large"; 71 } 72 73 void onDraw(int loops, SkCanvas* canvas) override { 74 SkRect r = this->getFilterRect(); 75 SkPaint paint; 76 paint.setColor(SK_ColorRED); 77 78 for (int i = 0; i < loops; i++) { 79 for (float brightness = -1.0f; brightness <= 1.0f; brightness += 0.4f) { 80 sk_sp<SkImageFilter> dim(make_brightness(-brightness, nullptr)); 81 paint.setImageFilter(make_brightness(brightness, std::move(dim))); 82 canvas->drawRect(r, paint); 83 } 84 } 85 } 86 87 private: 88 typedef ColorFilterBaseBench INHERITED; 89 }; 90 91 class ColorFilterBrightGrayBench : public ColorFilterBaseBench { 92 93 public: 94 ColorFilterBrightGrayBench(bool small) : INHERITED(small) { } 95 96 protected: 97 const char* onGetName() override { 98 return this->isSmall() ? "colorfilter_bright_gray_small" : "colorfilter_bright_gray_large"; 99 } 100 101 void onDraw(int loops, SkCanvas* canvas) override { 102 SkRect r = this->getFilterRect(); 103 SkPaint paint; 104 paint.setColor(SK_ColorRED); 105 for (int i = 0; i < loops; i++) { 106 sk_sp<SkImageFilter> brightness(make_brightness(0.9f, nullptr)); 107 paint.setImageFilter(make_grayscale(std::move(brightness))); 108 canvas->drawRect(r, paint); 109 } 110 } 111 112 private: 113 typedef ColorFilterBaseBench INHERITED; 114 }; 115 116 class ColorFilterGrayBrightBench : public ColorFilterBaseBench { 117 118 public: 119 ColorFilterGrayBrightBench(bool small) : INHERITED(small) { } 120 121 protected: 122 const char* onGetName() override { 123 return this->isSmall() ? "colorfilter_gray_bright_small" : "colorfilter_gray_bright_large"; 124 } 125 126 void onDraw(int loops, SkCanvas* canvas) override { 127 SkRect r = this->getFilterRect(); 128 SkPaint paint; 129 paint.setColor(SK_ColorRED); 130 for (int i = 0; i < loops; i++) { 131 sk_sp<SkImageFilter> grayscale(make_grayscale(nullptr)); 132 paint.setImageFilter(make_brightness(0.9f, std::move(grayscale))); 133 canvas->drawRect(r, paint); 134 } 135 } 136 137 private: 138 typedef ColorFilterBaseBench INHERITED; 139 }; 140 141 class ColorFilterBlueBrightBench : public ColorFilterBaseBench { 142 143 public: 144 ColorFilterBlueBrightBench(bool small) : INHERITED(small) { } 145 146 protected: 147 const char* onGetName() override { 148 return this->isSmall() ? "colorfilter_blue_bright_small" : "colorfilter_blue_bright_large"; 149 } 150 151 void onDraw(int loops, SkCanvas* canvas) override { 152 SkRect r = this->getFilterRect(); 153 SkPaint paint; 154 paint.setColor(SK_ColorRED); 155 for (int i = 0; i < loops; i++) { 156 sk_sp<SkImageFilter> blue(make_mode_blue(nullptr)); 157 paint.setImageFilter(make_brightness(1.0f, std::move(blue))); 158 canvas->drawRect(r, paint); 159 } 160 } 161 162 private: 163 typedef ColorFilterBaseBench INHERITED; 164 }; 165 166 class ColorFilterBrightBlueBench : public ColorFilterBaseBench { 167 168 public: 169 ColorFilterBrightBlueBench(bool small) : INHERITED(small) { } 170 171 protected: 172 const char* onGetName() override { 173 return this->isSmall() ? "colorfilter_bright_blue_small" : "colorfilter_bright_blue_large"; 174 } 175 176 void onDraw(int loops, SkCanvas* canvas) override { 177 SkRect r = this->getFilterRect(); 178 SkPaint paint; 179 paint.setColor(SK_ColorRED); 180 for (int i = 0; i < loops; i++) { 181 sk_sp<SkImageFilter> brightness(make_brightness(1.0f, nullptr)); 182 paint.setImageFilter(make_mode_blue(std::move(brightness))); 183 canvas->drawRect(r, paint); 184 } 185 } 186 187 private: 188 typedef ColorFilterBaseBench INHERITED; 189 }; 190 191 class ColorFilterBrightBench : public ColorFilterBaseBench { 192 193 public: 194 ColorFilterBrightBench(bool small) : INHERITED(small) { } 195 196 protected: 197 const char* onGetName() override { 198 return this->isSmall() ? "colorfilter_bright_small" : "colorfilter_bright_large"; 199 } 200 201 void onDraw(int loops, SkCanvas* canvas) override { 202 SkRect r = this->getFilterRect(); 203 SkPaint paint; 204 paint.setColor(SK_ColorRED); 205 for (int i = 0; i < loops; i++) { 206 paint.setImageFilter(make_brightness(1.0f, nullptr)); 207 canvas->drawRect(r, paint); 208 } 209 } 210 211 private: 212 typedef ColorFilterBaseBench INHERITED; 213 }; 214 215 class ColorFilterBlueBench : public ColorFilterBaseBench { 216 217 public: 218 ColorFilterBlueBench(bool small) : INHERITED(small) { } 219 220 protected: 221 const char* onGetName() override { 222 return this->isSmall() ? "colorfilter_blue_small" : "colorfilter_blue_large"; 223 } 224 225 void onDraw(int loops, SkCanvas* canvas) override { 226 SkRect r = this->getFilterRect(); 227 SkPaint paint; 228 paint.setColor(SK_ColorRED); 229 for (int i = 0; i < loops; i++) { 230 paint.setImageFilter(make_mode_blue(nullptr)); 231 canvas->drawRect(r, paint); 232 } 233 } 234 235 private: 236 typedef ColorFilterBaseBench INHERITED; 237 }; 238 239 class ColorFilterGrayBench : public ColorFilterBaseBench { 240 241 public: 242 ColorFilterGrayBench(bool small) : INHERITED(small) { } 243 244 protected: 245 const char* onGetName() override { 246 return this->isSmall() ? "colorfilter_gray_small" : "colorfilter_gray_large"; 247 } 248 249 void onDraw(int loops, SkCanvas* canvas) override { 250 SkRect r = this->getFilterRect(); 251 SkPaint paint; 252 paint.setColor(SK_ColorRED); 253 for (int i = 0; i < loops; i++) { 254 paint.setImageFilter(make_grayscale(nullptr)); 255 canvas->drawRect(r, paint); 256 } 257 } 258 259 private: 260 typedef ColorFilterBaseBench INHERITED; 261 }; 262 263 /////////////////////////////////////////////////////////////////////////////// 264 265 DEF_BENCH( return new ColorFilterDimBrightBench(true); ) 266 DEF_BENCH( return new ColorFilterBrightGrayBench(true); ) 267 DEF_BENCH( return new ColorFilterGrayBrightBench(true); ) 268 DEF_BENCH( return new ColorFilterBlueBrightBench(true); ) 269 DEF_BENCH( return new ColorFilterBrightBlueBench(true); ) 270 DEF_BENCH( return new ColorFilterBrightBench(true); ) 271 DEF_BENCH( return new ColorFilterBlueBench(true); ) 272 DEF_BENCH( return new ColorFilterGrayBench(true); ) 273 274 DEF_BENCH( return new ColorFilterDimBrightBench(false); ) 275 DEF_BENCH( return new ColorFilterBrightGrayBench(false); ) 276 DEF_BENCH( return new ColorFilterGrayBrightBench(false); ) 277 DEF_BENCH( return new ColorFilterBlueBrightBench(false); ) 278 DEF_BENCH( return new ColorFilterBrightBlueBench(false); ) 279 DEF_BENCH( return new ColorFilterBrightBench(false); ) 280 DEF_BENCH( return new ColorFilterBlueBench(false); ) 281 DEF_BENCH( return new ColorFilterGrayBench(false); ) 282