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