1/*
2 * Copyright 2016 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 "SkBlurMaskFilter.h"
10#include "SkCanvas.h"
11#include "SkPaint.h"
12#include "SkRRect.h"
13#include "SkRect.h"
14#include "sk_tool_utils.h"
15
16class BlurOccludedRRectBench : public Benchmark {
17public:
18    BlurOccludedRRectBench() {}
19
20    const char* onGetName() override {
21        return "bluroccludedrrect";
22    }
23
24    SkIPoint onGetSize() override {
25        return SkIPoint::Make(1024, 2048);
26    }
27
28    void onDraw(int loops, SkCanvas* canvas) override {
29        for (int l = 0; l < loops; ++l) {
30            canvas->clear(0xFFFAFAFA);
31
32            SkPaint opaque;
33            opaque.setAntiAlias(true);
34            opaque.setColor(SK_ColorWHITE);
35
36            const SkRect r = SkRect::MakeWH(480, 230);
37            const SkRRect rr = SkRRect::MakeRectXY(r, 8, 8);
38            SkRect occRect = sk_tool_utils::compute_central_occluder(rr);
39
40            for (int i = 0; i < 2; ++i) {
41                canvas->save();
42
43                canvas->translate(i*502.0f+20, 10.0f);
44
45                for (int j = 0; j < 8; ++j) {
46                    canvas->save();
47
48                        canvas->translate(0.0f, j*256.0f);
49
50                        SkPaint firstBlur;
51                        firstBlur.setAntiAlias(true);
52                        firstBlur.setColor(0x09000000);
53                        firstBlur.setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle,
54                                                                       2.5f,
55                                                                       occRect));
56
57                        canvas->drawRRect(rr, firstBlur);
58
59                        canvas->save();
60                            canvas->translate(1.5f, 1.5f);
61
62                            SkPaint secondBlur;
63                            secondBlur.setAntiAlias(true);
64                            secondBlur.setColor(0x30000000);
65                            secondBlur.setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle,
66                                                                            6.0f,
67                                                                            occRect));
68
69                            canvas->drawRRect(rr, secondBlur);
70
71                        canvas->restore();
72
73                        canvas->drawRRect(rr, opaque);
74
75                    canvas->restore();
76                }
77
78                canvas->restore();
79            }
80        }
81    }
82
83private:
84    typedef Benchmark INHERITED;
85};
86
87DEF_BENCH(return new BlurOccludedRRectBench();)
88