xref: /aosp_15_r20/external/skia/bench/ShaderMaskFilterBench.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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