BlurRectBench.cpp revision cb88d32b9fb3921529d1e46422daa65dbea0165d
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/*
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Copyright 2013 Google Inc.
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Use of this source code is governed by a BSD-style license that can be
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * found in the LICENSE file.
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "SkBenchmark.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "SkCanvas.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "SkPaint.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "SkRandom.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "SkShader.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "SkString.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "SkBlurMask.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define SMALL   SkIntToScalar(2)
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define REAL    SkFloatToScalar(1.5f)
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define BIG     SkIntToScalar(10)
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define REALBIG SkFloatToScalar(30.5f)
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class BlurRectBench: public SkBenchmark {
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SkScalar    fRadius;
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SkString    fName;
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)public:
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    BlurRectBench(void *param, SkScalar rad) : INHERITED(param) {
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        fRadius = rad;
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)protected:
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual const char* onGetName() {
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return fName.c_str();
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SkScalar radius() const {
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return fRadius;
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    void setName(const SkString& name) {
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        fName = name;
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void onDraw(SkCanvas* canvas) {
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        SkPaint paint;
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        this->setupPaint(&paint);
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        paint.setAntiAlias(true);
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        SkScalar pad = fRadius*3/2 + SK_Scalar1;
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        SkRect r = SkRect::MakeWH(2 * pad + SK_Scalar1, 2 * pad + SK_Scalar1);
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        int loop_count;
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        if (fRadius > SkIntToScalar(50)) {
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          loop_count = 10;
56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        } else if (fRadius > SkIntToScalar(5)) {
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          loop_count = 1000;
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        } else {
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          loop_count = 10000;
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        }
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        preBenchSetup(r);
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        for (int i = 0; i < SkBENCHLOOP(loop_count); i++) {
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            makeBlurryRect(r);
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        }
67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void makeBlurryRect(const SkRect&) = 0;
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void preBenchSetup(const SkRect&) {}
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)private:
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    typedef SkBenchmark INHERITED;
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class BlurRectDirectBench: public BlurRectBench {
77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    BlurRectDirectBench(void *param, SkScalar rad) : BlurRectBench(param, rad) {
79868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        SkString name;
80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        if (SkScalarFraction(rad) != 0) {
82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            name.printf("blurrect_direct_%.2f", SkScalarToFloat(rad));
83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        } else {
84868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            name.printf("blurrect_direct_%d", SkScalarRound(rad));
85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        }
86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        setName(name);
88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)protected:
90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    virtual void makeBlurryRect(const SkRect& r) SK_OVERRIDE {
91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        SkMask mask;
92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        SkBlurMask::BlurRect(&mask, r, radius(), SkBlurMask::kNormal_Style,
93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                             SkBlurMask::kHigh_Quality);
94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class BlurRectSeparableBench: public BlurRectBench {
98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    SkMask fSrcMask;
99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)public:
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    BlurRectSeparableBench(void *param, SkScalar rad) : BlurRectBench(param, rad) {
101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        SkString name;
102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        if (SkScalarFraction(rad) != 0) {
103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            name.printf("blurrect_separable_%.2f", SkScalarToFloat(rad));
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        } else {
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            name.printf("blurrect_separable_%d", SkScalarRound(rad));
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        }
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        setName(name);
109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)protected:
112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void preBenchSetup(const SkRect& r) SK_OVERRIDE {
113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        r.roundOut(&fSrcMask.fBounds);
114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        fSrcMask.fFormat = SkMask::kA8_Format;
115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        fSrcMask.fRowBytes = fSrcMask.fBounds.width();
116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        fSrcMask.fImage = SkMask::AllocImage(fSrcMask.computeTotalImageSize());
117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        memset(fSrcMask.fImage, 0xff, fSrcMask.computeTotalImageSize());
119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual void makeBlurryRect(const SkRect& r) SK_OVERRIDE {
122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        SkMask mask;
123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        SkBlurMask::BlurSeparable(&mask, fSrcMask, radius(),
124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  SkBlurMask::kNormal_Style,
125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  SkBlurMask::kHigh_Quality);
126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
128868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
129868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DEF_BENCH(return new BlurRectSeparableBench(p, SMALL);)
130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DEF_BENCH(return new BlurRectSeparableBench(p, BIG);)
131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DEF_BENCH(return new BlurRectSeparableBench(p, REALBIG);)
132868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DEF_BENCH(return new BlurRectSeparableBench(p, REAL);)
133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DEF_BENCH(return new BlurRectDirectBench(p, SMALL);)
134868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DEF_BENCH(return new BlurRectDirectBench(p, BIG);)
135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DEF_BENCH(return new BlurRectDirectBench(p, REALBIG);)
136868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)DEF_BENCH(return new BlurRectDirectBench(p, REAL);)
137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)