Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(742)

Side by Side Diff: bench/BlurRectBench.cpp

Issue 23701006: Push sigma-based blur interface into our GMs/benches/tests/samplecode (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Cleaned up Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright 2013 Google Inc. 2 * Copyright 2013 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkBenchmark.h" 8 #include "SkBenchmark.h"
9 #include "SkCanvas.h" 9 #include "SkCanvas.h"
10 #include "SkPaint.h" 10 #include "SkPaint.h"
11 #include "SkRandom.h" 11 #include "SkRandom.h"
12 #include "SkShader.h" 12 #include "SkShader.h"
13 #include "SkString.h" 13 #include "SkString.h"
14 #include "SkBlurMask.h" 14 #include "SkBlurMask.h"
15 15
16 #define SMALL SkIntToScalar(2) 16 #define SMALL SkFloatToScalar(1.6547f)
17 #define REAL SkFloatToScalar(1.5f) 17 #define REAL SkFloatToScalar(1.366025f)
18 #define BIG SkIntToScalar(10) 18 static const SkScalar kMedium = SkFloatToScalar(3.38675f);
19 #define REALBIG SkFloatToScalar(30.5f) 19 #define BIG SkFloatToScalar(6.2735f)
20 static const SkScalar kMedBig = SkFloatToScalar(12.047f);
21 #define REALBIG SkFloatToScalar(18.109175f)
20 22
21 class BlurRectBench: public SkBenchmark { 23 class BlurRectBench: public SkBenchmark {
22 int fLoopCount; 24 int fLoopCount;
23 SkScalar fRadius; 25 SkScalar fSigma;
24 SkString fName; 26 SkString fName;
25 27
26 public: 28 public:
27 BlurRectBench(void *param, SkScalar rad) : INHERITED(param) { 29 BlurRectBench(void *param, SkScalar sigma) : INHERITED(param) {
28 fRadius = rad; 30 fSigma = sigma;
29 31
30 if (fRadius > SkIntToScalar(25)) { 32 if (fSigma > SkIntToScalar(15)) {
31 fLoopCount = 100; 33 fLoopCount = 100;
32 } else if (fRadius > SkIntToScalar(5)) { 34 } else if (fSigma > SkIntToScalar(3)) {
33 fLoopCount = 1000; 35 fLoopCount = 1000;
34 } else { 36 } else {
35 fLoopCount = 10000; 37 fLoopCount = 10000;
36 } 38 }
37 } 39 }
38 40
39 protected: 41 protected:
40 virtual const char* onGetName() { 42 virtual const char* onGetName() {
41 return fName.c_str(); 43 return fName.c_str();
42 } 44 }
43 45
44 SkScalar radius() const { 46 SkScalar sigma() const {
45 return fRadius; 47 return fSigma;
46 } 48 }
47 49
48 void setName(const SkString& name) { 50 void setName(const SkString& name) {
49 fName = name; 51 fName = name;
50 } 52 }
51 53
52 virtual void onDraw(SkCanvas*) { 54 virtual void onDraw(SkCanvas*) {
53 SkPaint paint; 55 SkPaint paint;
54 this->setupPaint(&paint); 56 this->setupPaint(&paint);
55 57
56 paint.setAntiAlias(true); 58 paint.setAntiAlias(true);
57 59
58 SkScalar pad = fRadius*3/2 + SK_Scalar1; 60 SkRect r = SkRect::MakeWH(3.0f * fSigma, 3.0f * fSigma);
59 SkRect r = SkRect::MakeWH(2 * pad + SK_Scalar1, 2 * pad + SK_Scalar1);
60 61
61 preBenchSetup(r); 62 preBenchSetup(r);
62 63
63 for (int i = 0; i < SkBENCHLOOP(fLoopCount); i++) { 64 for (int i = 0; i < SkBENCHLOOP(fLoopCount); i++) {
64 makeBlurryRect(r); 65 makeBlurryRect(r);
65 } 66 }
66 } 67 }
67 68
68 virtual void makeBlurryRect(const SkRect&) = 0; 69 virtual void makeBlurryRect(const SkRect&) = 0;
69 virtual void preBenchSetup(const SkRect&) {} 70 virtual void preBenchSetup(const SkRect&) {}
70 private: 71 private:
71 typedef SkBenchmark INHERITED; 72 typedef SkBenchmark INHERITED;
72 }; 73 };
73 74
74 75
75 class BlurRectDirectBench: public BlurRectBench { 76 class BlurRectDirectBench: public BlurRectBench {
76 public: 77 public:
77 BlurRectDirectBench(void *param, SkScalar rad) : INHERITED(param, rad) { 78 BlurRectDirectBench(void *param, SkScalar sigma, const char* suffix)
79 : INHERITED(param, sigma) {
78 SkString name; 80 SkString name;
79 81 name.printf("blurrect_direct_%s", suffix);
80 if (SkScalarFraction(rad) != 0) { 82 this->setName(name);
81 name.printf("blurrect_direct_%.2f", SkScalarToFloat(rad));
82 } else {
83 name.printf("blurrect_direct_%d", SkScalarRoundToInt(rad));
84 }
85
86 setName(name);
87 } 83 }
88 protected: 84 protected:
89 virtual void makeBlurryRect(const SkRect& r) SK_OVERRIDE { 85 virtual void makeBlurryRect(const SkRect& r) SK_OVERRIDE {
90 SkMask mask; 86 SkMask mask;
91 SkBlurMask::BlurRect(&mask, r, this->radius(), SkBlurMask::kNormal_Style ); 87 SkBlurMask::BlurRect(this->sigma(), &mask, r, SkBlurMask::kNormal_Style) ;
92 SkMask::FreeImage(mask.fImage); 88 SkMask::FreeImage(mask.fImage);
93 } 89 }
94 private: 90 private:
95 typedef BlurRectBench INHERITED; 91 typedef BlurRectBench INHERITED;
96 }; 92 };
97 93
98 class BlurRectSeparableBench: public BlurRectBench { 94 class BlurRectSeparableBench: public BlurRectBench {
99 95
100 public: 96 public:
101 BlurRectSeparableBench(void *param, SkScalar rad) : INHERITED(param, rad) { 97 BlurRectSeparableBench(void *param, SkScalar sigma) : INHERITED(param, sigma ) {
102 fSrcMask.fImage = NULL; 98 fSrcMask.fImage = NULL;
103 } 99 }
104 100
105 ~BlurRectSeparableBench() { 101 ~BlurRectSeparableBench() {
106 SkMask::FreeImage(fSrcMask.fImage); 102 SkMask::FreeImage(fSrcMask.fImage);
107 } 103 }
108 104
109 protected: 105 protected:
110 virtual void preBenchSetup(const SkRect& r) SK_OVERRIDE { 106 virtual void preBenchSetup(const SkRect& r) SK_OVERRIDE {
111 SkMask::FreeImage(fSrcMask.fImage); 107 SkMask::FreeImage(fSrcMask.fImage);
112 108
113 r.roundOut(&fSrcMask.fBounds); 109 r.roundOut(&fSrcMask.fBounds);
114 fSrcMask.fFormat = SkMask::kA8_Format; 110 fSrcMask.fFormat = SkMask::kA8_Format;
115 fSrcMask.fRowBytes = fSrcMask.fBounds.width(); 111 fSrcMask.fRowBytes = fSrcMask.fBounds.width();
116 fSrcMask.fImage = SkMask::AllocImage(fSrcMask.computeTotalImageSize()); 112 fSrcMask.fImage = SkMask::AllocImage(fSrcMask.computeTotalImageSize());
117 113
118 memset(fSrcMask.fImage, 0xff, fSrcMask.computeTotalImageSize()); 114 memset(fSrcMask.fImage, 0xff, fSrcMask.computeTotalImageSize());
119 } 115 }
120 116
121 SkMask fSrcMask; 117 SkMask fSrcMask;
122 private: 118 private:
123 typedef BlurRectBench INHERITED; 119 typedef BlurRectBench INHERITED;
124 }; 120 };
125 121
126 class BlurRectBoxFilterBench: public BlurRectSeparableBench { 122 class BlurRectBoxFilterBench: public BlurRectSeparableBench {
127 public: 123 public:
128 BlurRectBoxFilterBench(void *param, SkScalar rad) : INHERITED(param, rad) { 124 BlurRectBoxFilterBench(void *param, SkScalar sigma, const char* suffix)
125 : INHERITED(param, sigma) {
129 SkString name; 126 SkString name;
130 if (SkScalarFraction(rad) != 0) { 127 name.printf("blurrect_boxfilter_%s", suffix);
131 name.printf("blurrect_boxfilter_%.2f", SkScalarToFloat(rad)); 128 this->setName(name);
132 } else {
133 name.printf("blurrect_boxfilter_%d", SkScalarRoundToInt(rad));
134 }
135 setName(name);
136 } 129 }
137 130
138 protected: 131 protected:
139 132
140 virtual void makeBlurryRect(const SkRect&) SK_OVERRIDE { 133 virtual void makeBlurryRect(const SkRect&) SK_OVERRIDE {
141 SkMask mask; 134 SkMask mask;
142 mask.fImage = NULL; 135 mask.fImage = NULL;
143 SkBlurMask::Blur(&mask, fSrcMask, this->radius(), 136 SkBlurMask::BoxBlur(&mask, fSrcMask, this->sigma(),
144 SkBlurMask::kNormal_Style, 137 SkBlurMask::kNormal_Style,
145 SkBlurMask::kHigh_Quality); 138 SkBlurMask::kHigh_Quality);
146 SkMask::FreeImage(mask.fImage); 139 SkMask::FreeImage(mask.fImage);
147 } 140 }
148 private: 141 private:
149 typedef BlurRectSeparableBench INHERITED; 142 typedef BlurRectSeparableBench INHERITED;
150 }; 143 };
151 144
152 class BlurRectGaussianBench: public BlurRectSeparableBench { 145 class BlurRectGaussianBench: public BlurRectSeparableBench {
153 public: 146 public:
154 BlurRectGaussianBench(void *param, SkScalar rad) : INHERITED(param, rad) { 147 BlurRectGaussianBench(void *param, SkScalar sigma, const char* suffix)
148 : INHERITED(param, sigma) {
155 SkString name; 149 SkString name;
156 if (SkScalarFraction(rad) != 0) { 150 name.printf("blurrect_gaussian_%s", suffix);
157 name.printf("blurrect_gaussian_%.2f", SkScalarToFloat(rad)); 151 this->setName(name);
158 } else {
159 name.printf("blurrect_gaussian_%d", SkScalarRoundToInt(rad));
160 }
161 setName(name);
162 } 152 }
163 153
164 protected: 154 protected:
165 155
166 virtual void makeBlurryRect(const SkRect&) SK_OVERRIDE { 156 virtual void makeBlurryRect(const SkRect&) SK_OVERRIDE {
167 SkMask mask; 157 SkMask mask;
168 mask.fImage = NULL; 158 mask.fImage = NULL;
169 SkBlurMask::BlurGroundTruth(&mask, fSrcMask, this->radius(), 159 SkBlurMask::BlurGroundTruth(this->sigma(), &mask, fSrcMask,
170 SkBlurMask::kNormal_Style); 160 SkBlurMask::kNormal_Style);
171 SkMask::FreeImage(mask.fImage); 161 SkMask::FreeImage(mask.fImage);
172 } 162 }
173 private: 163 private:
174 typedef BlurRectSeparableBench INHERITED; 164 typedef BlurRectSeparableBench INHERITED;
175 }; 165 };
176 166
177 DEF_BENCH(return new BlurRectBoxFilterBench(p, SMALL);) 167 DEF_BENCH(return new BlurRectBoxFilterBench(p, SMALL, "2");)
178 DEF_BENCH(return new BlurRectBoxFilterBench(p, BIG);) 168 DEF_BENCH(return new BlurRectBoxFilterBench(p, BIG, "10");)
179 DEF_BENCH(return new BlurRectBoxFilterBench(p, REALBIG);) 169 DEF_BENCH(return new BlurRectBoxFilterBench(p, REALBIG, "30.50");)
180 DEF_BENCH(return new BlurRectBoxFilterBench(p, REAL);) 170 DEF_BENCH(return new BlurRectBoxFilterBench(p, REAL, "1.50");)
181 DEF_BENCH(return new BlurRectGaussianBench(p, SMALL);) 171 DEF_BENCH(return new BlurRectGaussianBench(p, SMALL, "2");)
182 DEF_BENCH(return new BlurRectGaussianBench(p, BIG);) 172 DEF_BENCH(return new BlurRectGaussianBench(p, BIG, "10");)
183 DEF_BENCH(return new BlurRectGaussianBench(p, REALBIG);) 173 DEF_BENCH(return new BlurRectGaussianBench(p, REALBIG, "30.50");)
184 DEF_BENCH(return new BlurRectGaussianBench(p, REAL);) 174 DEF_BENCH(return new BlurRectGaussianBench(p, REAL, "1.50");)
185 DEF_BENCH(return new BlurRectDirectBench(p, SMALL);) 175 DEF_BENCH(return new BlurRectDirectBench(p, SMALL, "2");)
186 DEF_BENCH(return new BlurRectDirectBench(p, BIG);) 176 DEF_BENCH(return new BlurRectDirectBench(p, BIG, "10");)
187 DEF_BENCH(return new BlurRectDirectBench(p, REALBIG);) 177 DEF_BENCH(return new BlurRectDirectBench(p, REALBIG, "30.50");)
188 DEF_BENCH(return new BlurRectDirectBench(p, REAL);) 178 DEF_BENCH(return new BlurRectDirectBench(p, REAL, "1.50");)
189 179
190 DEF_BENCH(return new BlurRectDirectBench(p, SkIntToScalar(5));) 180 DEF_BENCH(return new BlurRectDirectBench(p, kMedium, "5");)
191 DEF_BENCH(return new BlurRectDirectBench(p, SkIntToScalar(20));) 181 DEF_BENCH(return new BlurRectDirectBench(p, kMedBig, "20");)
192 182
193 DEF_BENCH(return new BlurRectBoxFilterBench(p, SkIntToScalar(5));) 183 DEF_BENCH(return new BlurRectBoxFilterBench(p, kMedium, "5");)
194 DEF_BENCH(return new BlurRectBoxFilterBench(p, SkIntToScalar(20));) 184 DEF_BENCH(return new BlurRectBoxFilterBench(p, kMedBig, "20");)
195 185
196 #if 0 186 #if 0
197 // disable Gaussian benchmarks; the algorithm works well enough 187 // disable Gaussian benchmarks; the algorithm works well enough
198 // and serves as a baseline for ground truth, but it's too slow 188 // and serves as a baseline for ground truth, but it's too slow
199 // to use in production for non-trivial radii, so no real point 189 // to use in production for non-trivial radii, so no real point
200 // in having the bots benchmark it all the time. 190 // in having the bots benchmark it all the time.
201 191
202 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(1));) 192 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(1));)
203 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(2));) 193 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(2));)
204 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(3));) 194 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(3));)
205 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(4));) 195 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(4));)
206 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(5));) 196 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(5));)
207 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(6));) 197 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(6));)
208 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(7));) 198 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(7));)
209 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(8));) 199 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(8));)
210 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(9));) 200 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(9));)
211 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(10));) 201 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(10));)
212 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(11));) 202 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(11));)
213 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(12));) 203 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(12));)
214 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(13));) 204 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(13));)
215 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(14));) 205 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(14));)
216 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(15));) 206 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(15));)
217 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(16));) 207 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(16));)
218 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(17));) 208 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(17));)
219 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(18));) 209 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(18));)
220 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(19));) 210 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(19));)
221 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(20));) 211 DEF_BENCH(return new BlurRectGaussianBench(p, SkIntToScalar(20));)
222 #endif 212 #endif
OLDNEW
« bench/BlurBench.cpp ('K') | « bench/BlurBench.cpp ('k') | bench/RectoriBench.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698