• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2018 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 "bench/Benchmark.h"
9 #include "include/core/SkCanvas.h"
10 #include "include/core/SkMaskFilter.h"
11 #include "include/core/SkPaint.h"
12 #include "include/core/SkPictureRecorder.h"
13 #include "include/core/SkSurface.h"
14 #include "include/effects/SkShaderMaskFilter.h"
15 #include "src/shaders/SkPictureShader.h"
16 
make_bitmap_shader()17 static sk_sp<SkShader> make_bitmap_shader() {
18     SkPaint p;
19     p.setColor(SK_ColorBLACK);
20     p.setAntiAlias(true);
21 
22     auto surface = SkSurface::MakeRasterN32Premul(100, 100);
23     surface->getCanvas()->drawCircle(50, 50, 50, p);
24 
25     return surface->makeImageSnapshot()->makeShader(SkTileMode::kRepeat, SkTileMode::kRepeat,
26                                                     SkSamplingOptions());
27 }
28 
make_picture_shader()29 static sk_sp<SkShader> make_picture_shader() {
30     SkPaint p;
31     p.setColor(SK_ColorBLACK);
32     p.setAntiAlias(true);
33 
34     SkPictureRecorder recorder;
35     recorder.beginRecording(100, 100)->drawCircle(50, 50, 50, p);
36 
37     return recorder.finishRecordingAsPicture()->makeShader(SkTileMode::kRepeat, SkTileMode::kRepeat,
38                                                            SkFilterMode::kNearest);
39 }
40 
41 class ShaderMFBench final : public Benchmark {
42 
43 public:
44     using ShaderMaker = sk_sp<SkShader>(*)();
45 
ShaderMFBench(const char * nm,bool opaque,const ShaderMaker maker)46     ShaderMFBench(const char* nm, bool opaque, const ShaderMaker maker)
47             : fMaker{maker}
48             , fColor{opaque ? 0xff00ff00 : 0x8000ff00} {
49         fName = SkStringPrintf("shadermaskfilter_%s_%x", nm, SkColorGetA(fColor));
50     }
51 
52 protected:
onGetName()53     const char* onGetName() override {
54         return fName.c_str();
55     }
56 
onDelayedSetup()57     void onDelayedSetup() override {
58         fMaskFilter = SkShaderMaskFilter::Make(fMaker());
59     }
60 
onDraw(int loops,SkCanvas * canvas)61     void onDraw(int loops, SkCanvas* canvas) override {
62         SkPaint maskPaint;
63         maskPaint.setMaskFilter(fMaskFilter);
64 
65         for (int i = 0; i < loops; ++i) {
66             SkAutoCanvasRestore arc(canvas, false);
67             canvas->saveLayer(nullptr, &maskPaint);
68             canvas->drawColor(fColor);
69         }
70     }
71 
72 private:
73     const ShaderMaker fMaker;
74     const SkColor fColor;
75     SkString fName;
76     sk_sp<SkMaskFilter> fMaskFilter;
77 
78     using INHERITED = Benchmark;
79 };
80 
81 DEF_BENCH( return new ShaderMFBench("bitmap" , true , make_bitmap_shader ); )
82 DEF_BENCH( return new ShaderMFBench("bitmap" , false, make_bitmap_shader ); )
83 DEF_BENCH( return new ShaderMFBench("picture", true , make_picture_shader); )
84 DEF_BENCH( return new ShaderMFBench("picture", false, make_picture_shader); )
85