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 14 enum { 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 20 class ImageFilterDAGBench : public Benchmark { 21 public: ImageFilterDAGBench()22 ImageFilterDAGBench() {} 23 24 protected: onGetName()25 const char* onGetName() override { 26 return "image_filter_dag"; 27 } 28 onDraw(int loops,SkCanvas * canvas)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 44 private: 45 typedef Benchmark INHERITED; 46 }; 47 48 // Exercise a blur filter connected to both inputs of an SkDisplacementMapEffect. 49 50 class ImageFilterDisplacedBlur : public Benchmark { 51 public: ImageFilterDisplacedBlur()52 ImageFilterDisplacedBlur() {} 53 54 protected: onGetName()55 const char* onGetName() override { 56 return "image_filter_displaced_blur"; 57 } 58 onDraw(int loops,SkCanvas * canvas)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 74 private: 75 typedef Benchmark INHERITED; 76 }; 77 78 DEF_BENCH(return new ImageFilterDAGBench;) 79 DEF_BENCH(return new ImageFilterDisplacedBlur;) 80