blob: 2e79aa47016edb1ff6dc302ecae75ced587379d6 [file] [log] [blame]
humper@google.com7c7292c2013-01-04 20:29:03 +00001/*
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 */
reed@google.comcb88d322013-01-07 21:54:25 +00007
humper@google.com7c7292c2013-01-04 20:29:03 +00008#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 }
skia.committer@gmail.com8ae714b2013-01-05 02:02:05 +000034
humper@google.com7c7292c2013-01-04 20:29:03 +000035 SkScalar radius() const {
36 return fRadius;
37 }
skia.committer@gmail.com8ae714b2013-01-05 02:02:05 +000038
reed@google.comcb88d322013-01-07 21:54:25 +000039 void setName(const SkString& name) {
humper@google.com7c7292c2013-01-04 20:29:03 +000040 fName = name;
41 }
42
43 virtual void onDraw(SkCanvas* canvas) {
44 SkPaint paint;
45 this->setupPaint(&paint);
46
47 paint.setAntiAlias(true);
48
reed@google.comcb88d322013-01-07 21:54:25 +000049 SkScalar pad = fRadius*3/2 + SK_Scalar1;
50 SkRect r = SkRect::MakeWH(2 * pad + SK_Scalar1, 2 * pad + SK_Scalar1);
skia.committer@gmail.com8ae714b2013-01-05 02:02:05 +000051
humper@google.com7c7292c2013-01-04 20:29:03 +000052 int loop_count;
skia.committer@gmail.com8ae714b2013-01-05 02:02:05 +000053
humper@google.com7c7292c2013-01-04 20:29:03 +000054 if (fRadius > SkIntToScalar(50)) {
55 loop_count = 10;
56 } else if (fRadius > SkIntToScalar(5)) {
57 loop_count = 1000;
58 } else {
59 loop_count = 10000;
60 }
skia.committer@gmail.com8ae714b2013-01-05 02:02:05 +000061
reed@google.comcb88d322013-01-07 21:54:25 +000062 preBenchSetup(r);
skia.committer@gmail.com8ae714b2013-01-05 02:02:05 +000063
humper@google.com7c7292c2013-01-04 20:29:03 +000064 for (int i = 0; i < SkBENCHLOOP(loop_count); i++) {
reed@google.comcb88d322013-01-07 21:54:25 +000065 makeBlurryRect(r);
humper@google.com7c7292c2013-01-04 20:29:03 +000066 }
67 }
skia.committer@gmail.com8ae714b2013-01-05 02:02:05 +000068
reed@google.comcb88d322013-01-07 21:54:25 +000069 virtual void makeBlurryRect(const SkRect&) = 0;
70 virtual void preBenchSetup(const SkRect&) {}
humper@google.com7c7292c2013-01-04 20:29:03 +000071private:
72 typedef SkBenchmark INHERITED;
73};
74
75
76class BlurRectDirectBench: public BlurRectBench {
77 public:
reed@google.comcb88d322013-01-07 21:54:25 +000078 BlurRectDirectBench(void *param, SkScalar rad) : BlurRectBench(param, rad) {
humper@google.com7c7292c2013-01-04 20:29:03 +000079 SkString name;
skia.committer@gmail.com8ae714b2013-01-05 02:02:05 +000080
humper@google.com7c7292c2013-01-04 20:29:03 +000081 if (SkScalarFraction(rad) != 0) {
82 name.printf("blurrect_direct_%.2f", SkScalarToFloat(rad));
83 } else {
84 name.printf("blurrect_direct_%d", SkScalarRound(rad));
85 }
skia.committer@gmail.com8ae714b2013-01-05 02:02:05 +000086
reed@google.comcb88d322013-01-07 21:54:25 +000087 setName(name);
humper@google.com7c7292c2013-01-04 20:29:03 +000088 }
89protected:
reed@google.comcb88d322013-01-07 21:54:25 +000090 virtual void makeBlurryRect(const SkRect& r) SK_OVERRIDE {
humper@google.com7c7292c2013-01-04 20:29:03 +000091 SkMask mask;
reed@google.comcb88d322013-01-07 21:54:25 +000092 SkBlurMask::BlurRect(&mask, r, radius(), SkBlurMask::kNormal_Style,
93 SkBlurMask::kHigh_Quality);
humper@google.com7c7292c2013-01-04 20:29:03 +000094 }
95};
96
97class BlurRectSeparableBench: public BlurRectBench {
98 SkMask fSrcMask;
99public:
reed@google.comcb88d322013-01-07 21:54:25 +0000100 BlurRectSeparableBench(void *param, SkScalar rad) : BlurRectBench(param, rad) {
humper@google.com7c7292c2013-01-04 20:29:03 +0000101 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 }
skia.committer@gmail.com8ae714b2013-01-05 02:02:05 +0000107
reed@google.comcb88d322013-01-07 21:54:25 +0000108 setName(name);
humper@google.com7c7292c2013-01-04 20:29:03 +0000109 }
110
111protected:
reed@google.comcb88d322013-01-07 21:54:25 +0000112 virtual void preBenchSetup(const SkRect& r) SK_OVERRIDE {
113 r.roundOut(&fSrcMask.fBounds);
humper@google.com7c7292c2013-01-04 20:29:03 +0000114 fSrcMask.fFormat = SkMask::kA8_Format;
reed@google.comcb88d322013-01-07 21:54:25 +0000115 fSrcMask.fRowBytes = fSrcMask.fBounds.width();
116 fSrcMask.fImage = SkMask::AllocImage(fSrcMask.computeTotalImageSize());
skia.committer@gmail.com8ae714b2013-01-05 02:02:05 +0000117
reed@google.comcb88d322013-01-07 21:54:25 +0000118 memset(fSrcMask.fImage, 0xff, fSrcMask.computeTotalImageSize());
humper@google.com7c7292c2013-01-04 20:29:03 +0000119 }
skia.committer@gmail.com8ae714b2013-01-05 02:02:05 +0000120
reed@google.comcb88d322013-01-07 21:54:25 +0000121 virtual void makeBlurryRect(const SkRect& r) SK_OVERRIDE {
humper@google.com7c7292c2013-01-04 20:29:03 +0000122 SkMask mask;
reed@google.comcb88d322013-01-07 21:54:25 +0000123 SkBlurMask::BlurSeparable(&mask, fSrcMask, radius(),
124 SkBlurMask::kNormal_Style,
125 SkBlurMask::kHigh_Quality);
humper@google.com7c7292c2013-01-04 20:29:03 +0000126 }
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);)