blob: fafe11e3da95e997ba4613acc1e640b4486b36dc [file] [log] [blame]
Florin Malita15a64e72018-04-18 11:14:50 -04001/*
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
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "bench/Benchmark.h"
9#include "include/core/SkCanvas.h"
10#include "include/core/SkPaint.h"
11#include "include/core/SkPictureRecorder.h"
12#include "include/core/SkSurface.h"
13#include "include/effects/SkShaderMaskFilter.h"
14#include "src/shaders/SkPictureShader.h"
Florin Malita15a64e72018-04-18 11:14:50 -040015
16static sk_sp<SkShader> make_bitmap_shader() {
17 SkPaint p;
18 p.setColor(SK_ColorBLACK);
19 p.setAntiAlias(true);
20
21 auto surface = SkSurface::MakeRasterN32Premul(100, 100);
22 surface->getCanvas()->drawCircle(50, 50, 50, p);
23
Mike Reed99c94462020-12-08 13:16:56 -050024 return surface->makeImageSnapshot()->makeShader(SkTileMode::kRepeat, SkTileMode::kRepeat,
25 SkSamplingOptions());
Florin Malita15a64e72018-04-18 11:14:50 -040026}
27
28static sk_sp<SkShader> make_picture_shader() {
29 SkPaint p;
30 p.setColor(SK_ColorBLACK);
31 p.setAntiAlias(true);
32
33 SkPictureRecorder recorder;
34 recorder.beginRecording(100, 100)->drawCircle(50, 50, 50, p);
35
Mike Reedfae8fce2019-04-03 10:27:45 -040036 return recorder.finishRecordingAsPicture()->makeShader(SkTileMode::kRepeat, SkTileMode::kRepeat);
Florin Malita15a64e72018-04-18 11:14:50 -040037}
38
39class ShaderMFBench final : public Benchmark {
40
41public:
42 using ShaderMaker = sk_sp<SkShader>(*)();
43
44 ShaderMFBench(const char* nm, bool opaque, const ShaderMaker& maker) {
45 fMaskFilter = SkShaderMaskFilter::Make(maker());
46 fColor = opaque ? 0xff00ff00 : 0x8000ff00;
47 fName = SkStringPrintf("shadermaskfilter_%s_%x", nm, SkColorGetA(fColor));
48 }
49
50protected:
51 const char* onGetName() override {
52 return fName.c_str();
53 }
54
55 void onDraw(int loops, SkCanvas* canvas) override {
56 SkPaint maskPaint;
57 maskPaint.setMaskFilter(fMaskFilter);
58
59 for (int i = 0; i < loops; ++i) {
60 SkAutoCanvasRestore arc(canvas, false);
61 canvas->saveLayer(nullptr, &maskPaint);
62 canvas->drawColor(fColor);
63 }
64 }
65
66private:
67 SkString fName;
68 sk_sp<SkMaskFilter> fMaskFilter;
69 SkColor fColor;
70
71 using INHERITED = Benchmark;
72};
73
74DEF_BENCH( return new ShaderMFBench("bitmap" , true , make_bitmap_shader ); )
75DEF_BENCH( return new ShaderMFBench("bitmap" , false, make_bitmap_shader ); )
76DEF_BENCH( return new ShaderMFBench("picture", true , make_picture_shader); )
77DEF_BENCH( return new ShaderMFBench("picture", false, make_picture_shader); )