BlurRectBench.cpp revision 732fbee1cb686c5a4ab647148c2158dfa20834ec
1/*
2 * Copyright 2013 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 "SkBenchmark.h"
9#include "SkCanvas.h"
10#include "SkPaint.h"
11#include "SkRandom.h"
12#include "SkShader.h"
13#include "SkString.h"
14#include "SkBlurMask.h"
15
16#define SMALL   SkIntToScalar(2)
17#define REAL    SkFloatToScalar(1.5f)
18#define BIG     SkIntToScalar(10)
19#define REALBIG SkFloatToScalar(30.5f)
20
21class BlurRectBench: public SkBenchmark {
22    SkScalar    fRadius;
23    SkString    fName;
24
25public:
26    BlurRectBench(void *param, SkScalar rad) : INHERITED(param) {
27        fRadius = rad;
28    }
29
30protected:
31    virtual const char* onGetName() {
32        return fName.c_str();
33    }
34
35    SkScalar radius() const {
36        return fRadius;
37    }
38
39    void setName(const SkString& name) {
40        fName = name;
41    }
42
43    virtual void onDraw(SkCanvas* canvas) {
44        SkPaint paint;
45        this->setupPaint(&paint);
46
47        paint.setAntiAlias(true);
48
49        SkScalar pad = fRadius*3/2 + SK_Scalar1;
50        SkRect r = SkRect::MakeWH(2 * pad + SK_Scalar1, 2 * pad + SK_Scalar1);
51
52        int loop_count;
53
54        if (fRadius > SkIntToScalar(25)) {
55          loop_count = 100;
56        } else if (fRadius > SkIntToScalar(5)) {
57          loop_count = 1000;
58        } else {
59          loop_count = 10000;
60        }
61
62        preBenchSetup(r);
63
64        for (int i = 0; i < SkBENCHLOOP(loop_count); i++) {
65            makeBlurryRect(r);
66        }
67    }
68
69    virtual void makeBlurryRect(const SkRect&) = 0;
70    virtual void preBenchSetup(const SkRect&) {}
71private:
72    typedef SkBenchmark INHERITED;
73};
74
75
76class BlurRectDirectBench: public BlurRectBench {
77 public:
78    BlurRectDirectBench(void *param, SkScalar rad) : BlurRectBench(param, rad) {
79        SkString name;
80
81        if (SkScalarFraction(rad) != 0) {
82            name.printf("blurrect_direct_%.2f", SkScalarToFloat(rad));
83        } else {
84            name.printf("blurrect_direct_%d", SkScalarRound(rad));
85        }
86
87        setName(name);
88    }
89protected:
90    virtual void makeBlurryRect(const SkRect& r) SK_OVERRIDE {
91        SkMask mask;
92        SkBlurMask::BlurRect(&mask, r, radius(), SkBlurMask::kNormal_Style,
93                             SkBlurMask::kHigh_Quality);
94    }
95};
96
97class BlurRectSeparableBench: public BlurRectBench {
98    SkMask fSrcMask;
99public:
100    BlurRectSeparableBench(void *param, SkScalar rad) : BlurRectBench(param, rad) {
101        SkString name;
102        if (SkScalarFraction(rad) != 0) {
103            name.printf("blurrect_separable_%.2f", SkScalarToFloat(rad));
104        } else {
105            name.printf("blurrect_separable_%d", SkScalarRound(rad));
106        }
107
108        setName(name);
109    }
110
111protected:
112    virtual void preBenchSetup(const SkRect& r) SK_OVERRIDE {
113        r.roundOut(&fSrcMask.fBounds);
114        fSrcMask.fFormat = SkMask::kA8_Format;
115        fSrcMask.fRowBytes = fSrcMask.fBounds.width();
116        fSrcMask.fImage = SkMask::AllocImage(fSrcMask.computeTotalImageSize());
117
118        memset(fSrcMask.fImage, 0xff, fSrcMask.computeTotalImageSize());
119    }
120
121    virtual void makeBlurryRect(const SkRect& r) SK_OVERRIDE {
122        SkMask mask;
123        SkBlurMask::BlurSeparable(&mask, fSrcMask, radius(),
124                                  SkBlurMask::kNormal_Style,
125                                  SkBlurMask::kHigh_Quality);
126    }
127};
128
129DEF_BENCH(return new BlurRectSeparableBench(p, SMALL);)
130DEF_BENCH(return new BlurRectSeparableBench(p, BIG);)
131DEF_BENCH(return new BlurRectSeparableBench(p, REALBIG);)
132DEF_BENCH(return new BlurRectSeparableBench(p, REAL);)
133DEF_BENCH(return new BlurRectDirectBench(p, SMALL);)
134DEF_BENCH(return new BlurRectDirectBench(p, BIG);)
135DEF_BENCH(return new BlurRectDirectBench(p, REALBIG);)
136DEF_BENCH(return new BlurRectDirectBench(p, REAL);)
137