1/* 2 * Copyright 2014 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 "SkBlurImageFilter.h" 10#include "SkDisplacementMapEffect.h" 11#include "SkCanvas.h" 12#include "SkMergeImageFilter.h" 13 14enum { kNumInputs = 5 }; 15 16// Exercise a blur filter connected to 5 inputs of the same merge filter. 17// This bench shows an improvement in performance once cacheing of re-used 18// nodes is implemented, since the DAG is no longer flattened to a tree. 19 20class ImageFilterDAGBench : public Benchmark { 21public: 22 ImageFilterDAGBench() {} 23 24protected: 25 const char* onGetName() override { 26 return "image_filter_dag"; 27 } 28 29 void onDraw(int loops, SkCanvas* canvas) override { 30 for (int j = 0; j < loops; j++) { 31 SkAutoTUnref<SkImageFilter> blur(SkBlurImageFilter::Create(20.0f, 20.0f)); 32 SkImageFilter* inputs[kNumInputs]; 33 for (int i = 0; i < kNumInputs; ++i) { 34 inputs[i] = blur.get(); 35 } 36 SkAutoTUnref<SkImageFilter> merge(SkMergeImageFilter::Create(inputs, kNumInputs)); 37 SkPaint paint; 38 paint.setImageFilter(merge); 39 SkRect rect = SkRect::Make(SkIRect::MakeWH(400, 400)); 40 canvas->drawRect(rect, paint); 41 } 42 } 43 44private: 45 typedef Benchmark INHERITED; 46}; 47 48// Exercise a blur filter connected to both inputs of an SkDisplacementMapEffect. 49 50class ImageFilterDisplacedBlur : public Benchmark { 51public: 52 ImageFilterDisplacedBlur() {} 53 54protected: 55 const char* onGetName() override { 56 return "image_filter_displaced_blur"; 57 } 58 59 void onDraw(int loops, SkCanvas* canvas) override { 60 for (int j = 0; j < loops; j++) { 61 SkAutoTUnref<SkImageFilter> blur(SkBlurImageFilter::Create(4.0f, 4.0f)); 62 SkDisplacementMapEffect::ChannelSelectorType xSelector = SkDisplacementMapEffect::kR_ChannelSelectorType; 63 SkDisplacementMapEffect::ChannelSelectorType ySelector = SkDisplacementMapEffect::kB_ChannelSelectorType; 64 SkScalar scale = 2; 65 SkAutoTUnref<SkImageFilter> displ(SkDisplacementMapEffect::Create(xSelector, ySelector, scale, 66 blur.get(), blur.get())); 67 SkPaint paint; 68 paint.setImageFilter(displ); 69 SkRect rect = SkRect::Make(SkIRect::MakeWH(400, 400)); 70 canvas->drawRect(rect, paint); 71 } 72 } 73 74private: 75 typedef Benchmark INHERITED; 76}; 77 78DEF_BENCH(return new ImageFilterDAGBench;) 79DEF_BENCH(return new ImageFilterDisplacedBlur;) 80