BlurBench.cpp revision b3ec29d2d81ae391e433fbdf8aabc791e426ee38
1
2/*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8#include "SkBenchmark.h"
9#include "SkBlurMask.h"
10#include "SkCanvas.h"
11#include "SkPaint.h"
12#include "SkRandom.h"
13#include "SkShader.h"
14#include "SkString.h"
15#include "SkBlurMaskFilter.h"
16
17#define SMALL   SkIntToScalar(2)
18#define REAL    SkFloatToScalar(1.5f)
19#define BIG     SkIntToScalar(10)
20#define REALBIG SkFloatToScalar(100.5f)
21
22static const char* gStyleName[] = {
23    "normal",
24    "solid",
25    "outer",
26    "inner"
27};
28
29class BlurBench : public SkBenchmark {
30    SkScalar    fRadius;
31    SkBlurMaskFilter::BlurStyle fStyle;
32    uint32_t                    fFlags;
33    SkString    fName;
34
35public:
36    BlurBench(void* param, SkScalar rad, SkBlurMaskFilter::BlurStyle bs, uint32_t flags = 0)
37        : INHERITED(param) {
38        fRadius = rad;
39        fStyle = bs;
40        fFlags = flags;
41        const char* name = rad > 0 ? gStyleName[bs] : "none";
42        const char* quality = flags & SkBlurMaskFilter::kHighQuality_BlurFlag ? "high_quality"
43                                                                              : "low_quality";
44        if (SkScalarFraction(rad) != 0) {
45            fName.printf("blur_%.2f_%s_%s", SkScalarToFloat(rad), name, quality);
46        } else {
47            fName.printf("blur_%d_%s_%s", SkScalarRound(rad), name, quality);
48        }
49    }
50
51protected:
52    virtual const char* onGetName() {
53        return fName.c_str();
54    }
55
56    virtual void onDraw(SkCanvas* canvas) {
57        SkPaint paint;
58        this->setupPaint(&paint);
59
60        paint.setAntiAlias(true);
61
62        SkMWCRandom rand;
63        for (int i = 0; i < SkBENCHLOOP(10); i++) {
64            SkRect r = SkRect::MakeWH(rand.nextUScalar1() * 400,
65                                      rand.nextUScalar1() * 400);
66            r.offset(fRadius, fRadius);
67
68            if (fRadius > 0) {
69                SkMaskFilter* mf = SkBlurMaskFilter::Create(fStyle,
70                                            SkBlurMask::ConvertRadiusToSigma(fRadius),
71                                            fFlags);
72                paint.setMaskFilter(mf)->unref();
73            }
74            canvas->drawOval(r, paint);
75        }
76    }
77
78private:
79    typedef SkBenchmark INHERITED;
80};
81
82DEF_BENCH(return new BlurBench(p, SMALL, SkBlurMaskFilter::kNormal_BlurStyle);)
83DEF_BENCH(return new BlurBench(p, SMALL, SkBlurMaskFilter::kSolid_BlurStyle);)
84DEF_BENCH(return new BlurBench(p, SMALL, SkBlurMaskFilter::kOuter_BlurStyle);)
85DEF_BENCH(return new BlurBench(p, SMALL, SkBlurMaskFilter::kInner_BlurStyle);)
86
87DEF_BENCH(return new BlurBench(p, BIG, SkBlurMaskFilter::kNormal_BlurStyle);)
88DEF_BENCH(return new BlurBench(p, BIG, SkBlurMaskFilter::kSolid_BlurStyle);)
89DEF_BENCH(return new BlurBench(p, BIG, SkBlurMaskFilter::kOuter_BlurStyle);)
90DEF_BENCH(return new BlurBench(p, BIG, SkBlurMaskFilter::kInner_BlurStyle);)
91
92DEF_BENCH(return new BlurBench(p, REALBIG, SkBlurMaskFilter::kNormal_BlurStyle);)
93DEF_BENCH(return new BlurBench(p, REALBIG, SkBlurMaskFilter::kSolid_BlurStyle);)
94DEF_BENCH(return new BlurBench(p, REALBIG, SkBlurMaskFilter::kOuter_BlurStyle);)
95DEF_BENCH(return new BlurBench(p, REALBIG, SkBlurMaskFilter::kInner_BlurStyle);)
96
97DEF_BENCH(return new BlurBench(p, REAL, SkBlurMaskFilter::kNormal_BlurStyle);)
98DEF_BENCH(return new BlurBench(p, REAL, SkBlurMaskFilter::kSolid_BlurStyle);)
99DEF_BENCH(return new BlurBench(p, REAL, SkBlurMaskFilter::kOuter_BlurStyle);)
100DEF_BENCH(return new BlurBench(p, REAL, SkBlurMaskFilter::kInner_BlurStyle);)
101
102DEF_BENCH(return new BlurBench(p, SMALL, SkBlurMaskFilter::kNormal_BlurStyle, SkBlurMaskFilter::kHighQuality_BlurFlag);)
103
104DEF_BENCH(return new BlurBench(p, BIG, SkBlurMaskFilter::kNormal_BlurStyle, SkBlurMaskFilter::kHighQuality_BlurFlag);)
105
106DEF_BENCH(return new BlurBench(p, REALBIG, SkBlurMaskFilter::kNormal_BlurStyle, SkBlurMaskFilter::kHighQuality_BlurFlag);)
107
108DEF_BENCH(return new BlurBench(p, REAL, SkBlurMaskFilter::kNormal_BlurStyle, SkBlurMaskFilter::kHighQuality_BlurFlag);)
109
110DEF_BENCH(return new BlurBench(p, 0, SkBlurMaskFilter::kNormal_BlurStyle);)
111