blob: 49ef856c6428558d07ddc2b1b76fb6b763bb7980 [file] [log] [blame]
reed@google.comdb87c962012-11-02 21:11:12 +00001/*
humper@google.coma99a92c2013-02-20 16:42:06 +00002* Copyright 2012 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.comdb87c962012-11-02 21:11:12 +00007
8#include "gm.h"
humper@google.com7c7292c2013-01-04 20:29:03 +00009#include "SkBlurMask.h"
robertphillips@google.comb7061172013-09-06 14:16:12 +000010#include "SkBlurMaskFilter.h"
reed@google.comdb87c962012-11-02 21:11:12 +000011#include "SkCanvas.h"
12#include "SkPath.h"
13
14#define STROKE_WIDTH SkIntToScalar(10)
15
16typedef void (*Proc)(SkCanvas*, const SkRect&, const SkPaint&);
17
18static void fill_rect(SkCanvas* canvas, const SkRect& r, const SkPaint& p) {
19 canvas->drawRect(r, p);
20}
21
reed@google.comdb87c962012-11-02 21:11:12 +000022static void draw_donut(SkCanvas* canvas, const SkRect& r, const SkPaint& p) {
23 SkRect rect;
24 SkPath path;
skia.committer@gmail.com34587162012-11-20 02:01:23 +000025
reed@google.comdb87c962012-11-02 21:11:12 +000026 rect = r;
27 rect.outset(STROKE_WIDTH/2, STROKE_WIDTH/2);
28 path.addRect(rect);
29 rect = r;
30 rect.inset(STROKE_WIDTH/2, STROKE_WIDTH/2);
skia.committer@gmail.com34587162012-11-20 02:01:23 +000031
reed@google.comdb87c962012-11-02 21:11:12 +000032 path.addRect(rect);
33 path.setFillType(SkPath::kEvenOdd_FillType);
skia.committer@gmail.com34587162012-11-20 02:01:23 +000034
reed@google.com808b70f2012-11-19 16:14:02 +000035 canvas->drawPath(path, p);
36}
reed@google.comdb87c962012-11-02 21:11:12 +000037
reed@google.com808b70f2012-11-19 16:14:02 +000038static void draw_donut_skewed(SkCanvas* canvas, const SkRect& r, const SkPaint& p) {
39 SkRect rect;
40 SkPath path;
skia.committer@gmail.com34587162012-11-20 02:01:23 +000041
reed@google.com808b70f2012-11-19 16:14:02 +000042 rect = r;
43 rect.outset(STROKE_WIDTH/2, STROKE_WIDTH/2);
44 path.addRect(rect);
45 rect = r;
46 rect.inset(STROKE_WIDTH/2, STROKE_WIDTH/2);
skia.committer@gmail.com34587162012-11-20 02:01:23 +000047
reed@google.com808b70f2012-11-19 16:14:02 +000048 rect.offset(7, -7);
skia.committer@gmail.com34587162012-11-20 02:01:23 +000049
reed@google.com808b70f2012-11-19 16:14:02 +000050 path.addRect(rect);
51 path.setFillType(SkPath::kEvenOdd_FillType);
skia.committer@gmail.com34587162012-11-20 02:01:23 +000052
reed@google.comdb87c962012-11-02 21:11:12 +000053 canvas->drawPath(path, p);
54}
55
reed@google.com53007a22012-11-26 14:39:50 +000056#include "SkGradientShader.h"
57
joshualitt341400e2014-12-18 11:54:13 -080058/*
59 * Spits out a dummy gradient to test blur with shader on paint
60 */
61static SkShader* MakeRadial() {
62 SkPoint pts[2] = {
63 { 0, 0 },
64 { SkIntToScalar(100), SkIntToScalar(100) }
65 };
66 SkShader::TileMode tm = SkShader::kClamp_TileMode;
67 const SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, };
68 const SkScalar pos[] = { SK_Scalar1/4, SK_Scalar1*3/4 };
69 SkMatrix scale;
70 scale.setScale(0.5f, 0.5f);
71 scale.postTranslate(25.f, 25.f);
72 SkPoint center0, center1;
73 center0.set(SkScalarAve(pts[0].fX, pts[1].fX),
74 SkScalarAve(pts[0].fY, pts[1].fY));
75 center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5),
76 SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4));
77 return SkGradientShader::CreateTwoPointRadial(center1, (pts[1].fX - pts[0].fX) / 7,
78 center0, (pts[1].fX - pts[0].fX) / 2,
79 colors, pos, SK_ARRAY_COUNT(colors), tm,
80 0, &scale);
81}
82
reed@google.com53007a22012-11-26 14:39:50 +000083typedef void (*PaintProc)(SkPaint*, SkScalar width);
84
reed@google.comdb87c962012-11-02 21:11:12 +000085class BlurRectGM : public skiagm::GM {
commit-bot@chromium.orge3964552014-04-28 16:25:35 +000086 SkAutoTUnref<SkMaskFilter> fMaskFilters[kLastEnum_SkBlurStyle + 1];
humper@google.coma99a92c2013-02-20 16:42:06 +000087 SkString fName;
humper@google.coma99a92c2013-02-20 16:42:06 +000088 SkAlpha fAlpha;
reed@google.comdb87c962012-11-02 21:11:12 +000089public:
commit-bot@chromium.org7cced562014-01-10 23:10:13 +000090 BlurRectGM(const char name[], U8CPU alpha)
91 : fName(name)
92 , fAlpha(SkToU8(alpha)) {
reed@google.com57850b92012-12-17 21:20:53 +000093 }
reed@google.comdb87c962012-11-02 21:11:12 +000094
95protected:
commit-bot@chromium.org7cced562014-01-10 23:10:13 +000096 virtual void onOnceBeforeDraw() SK_OVERRIDE {
commit-bot@chromium.orge3964552014-04-28 16:25:35 +000097 for (int i = 0; i <= kLastEnum_SkBlurStyle; ++i) {
98 fMaskFilters[i].reset(SkBlurMaskFilter::Create((SkBlurStyle)i,
commit-bot@chromium.org7cced562014-01-10 23:10:13 +000099 SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(STROKE_WIDTH/2)),
100 SkBlurMaskFilter::kHighQuality_BlurFlag));
101 }
102 }
103
reed@google.comdb87c962012-11-02 21:11:12 +0000104 virtual SkString onShortName() {
reed@google.com53007a22012-11-26 14:39:50 +0000105 return fName;
reed@google.comdb87c962012-11-02 21:11:12 +0000106 }
107
108 virtual SkISize onISize() {
joshualitt341400e2014-12-18 11:54:13 -0800109 return SkISize::Make(860, 820);
reed@google.comdb87c962012-11-02 21:11:12 +0000110 }
111
112 virtual void onDraw(SkCanvas* canvas) {
113 canvas->translate(STROKE_WIDTH*3/2, STROKE_WIDTH*3/2);
114
commit-bot@chromium.org7cced562014-01-10 23:10:13 +0000115 SkRect r = { 0, 0, 100, 50 };
116 SkScalar scales[] = { SK_Scalar1, 0.6f };
skia.committer@gmail.com8ccf5902012-11-27 02:01:19 +0000117
commit-bot@chromium.org7cced562014-01-10 23:10:13 +0000118 for (size_t s = 0; s < SK_ARRAY_COUNT(scales); ++s) {
119 canvas->save();
120 for (size_t f = 0; f < SK_ARRAY_COUNT(fMaskFilters); ++f) {
121 SkPaint paint;
122 paint.setMaskFilter(fMaskFilters[f]);
123 paint.setAlpha(fAlpha);
124
joshualitt341400e2014-12-18 11:54:13 -0800125 SkPaint paintWithRadial = paint;
126 paintWithRadial.setShader(MakeRadial())->unref();
127
commit-bot@chromium.org7cced562014-01-10 23:10:13 +0000128 static const Proc procs[] = {
129 fill_rect, draw_donut, draw_donut_skewed
130 };
131
132 canvas->save();
133 canvas->scale(scales[s], scales[s]);
134 this->drawProcs(canvas, r, paint, false, procs, SK_ARRAY_COUNT(procs));
135 canvas->translate(r.width() * 4/3, 0);
joshualitt341400e2014-12-18 11:54:13 -0800136 this->drawProcs(canvas, r, paintWithRadial, false, procs, SK_ARRAY_COUNT(procs));
137 canvas->translate(r.width() * 4/3, 0);
commit-bot@chromium.org7cced562014-01-10 23:10:13 +0000138 this->drawProcs(canvas, r, paint, true, procs, SK_ARRAY_COUNT(procs));
joshualitt341400e2014-12-18 11:54:13 -0800139 canvas->translate(r.width() * 4/3, 0);
140 this->drawProcs(canvas, r, paintWithRadial, true, procs, SK_ARRAY_COUNT(procs));
commit-bot@chromium.org7cced562014-01-10 23:10:13 +0000141 canvas->restore();
142
143 canvas->translate(0, SK_ARRAY_COUNT(procs) * r.height() * 4/3 * scales[s]);
144 }
145 canvas->restore();
joshualitt341400e2014-12-18 11:54:13 -0800146 canvas->translate(4 * r.width() * 4/3 * scales[s], 0);
reed@google.com53007a22012-11-26 14:39:50 +0000147 }
reed@google.comdb87c962012-11-02 21:11:12 +0000148 }
149
joshualitt341400e2014-12-18 11:54:13 -0800150 virtual uint32_t onGetFlags() const { return kSkipPipe_Flag | kSkipTiled_Flag; }
reed@google.comdb87c962012-11-02 21:11:12 +0000151
152private:
153 void drawProcs(SkCanvas* canvas, const SkRect& r, const SkPaint& paint,
154 bool doClip, const Proc procs[], size_t procsCount) {
155 SkAutoCanvasRestore acr(canvas, true);
156 for (size_t i = 0; i < procsCount; ++i) {
157 if (doClip) {
158 SkRect clipRect(r);
159 clipRect.inset(STROKE_WIDTH/2, STROKE_WIDTH/2);
160 canvas->save();
161 canvas->clipRect(r);
162 }
163 procs[i](canvas, r, paint);
164 if (doClip) {
165 canvas->restore();
166 }
167 canvas->translate(0, r.height() * 4/3);
168 }
169 }
humper@google.coma99a92c2013-02-20 16:42:06 +0000170private:
reed@google.comdb87c962012-11-02 21:11:12 +0000171 typedef GM INHERITED;
172};
173
commit-bot@chromium.org3c1594a2014-05-28 21:52:12 +0000174
175class BlurRectDirectGM : public skiagm::GM {
176 SkString fName;
177 int fGMWidth, fGMHeight;
178 int fPadding, fMargin;
179public:
180 BlurRectDirectGM(const char name[])
181 : fName(name),
182 fGMWidth(1200),
183 fGMHeight(1024),
184 fPadding(10),
185 fMargin(100)
186 {
187 }
188
189protected:
190 virtual SkString onShortName() {
191 return fName;
192 }
193
194 virtual SkISize onISize() {
195 return SkISize::Make(fGMWidth, fGMHeight);
196 }
197
198 virtual void onDraw(SkCanvas* canvas) {
199 const int widths[] = {25, 5, 5, 100, 150, 25};
200 const int heights[] = {100, 100, 5, 25, 150, 25};
201 const SkBlurStyle styles[] = {kNormal_SkBlurStyle, kInner_SkBlurStyle, kOuter_SkBlurStyle};
202 const float radii[] = {20, 5, 10};
203
204 canvas->translate(50,20);
205
206 int cur_x = 0;
207 int cur_y = 0;
208
209 int max_height = 0;
210
211 for (size_t i = 0 ; i < SK_ARRAY_COUNT(widths) ; i++) {
212 int width = widths[i];
213 int height = heights[i];
214 SkRect r;
215 r.setWH(SkIntToScalar(width), SkIntToScalar(height));
216 SkAutoCanvasRestore autoRestore(canvas, true);
217
218 for (size_t j = 0 ; j < SK_ARRAY_COUNT(radii) ; j++) {
219 float radius = radii[j];
220 for (size_t k = 0 ; k < SK_ARRAY_COUNT(styles) ; k++) {
221 SkBlurStyle style = styles[k];
222
223 SkMask mask;
224 SkBlurMask::BlurRect(SkBlurMask::ConvertRadiusToSigma(radius), &mask, r, style);
225
226 SkAutoMaskFreeImage amfi(mask.fImage);
227
228 SkBitmap bm;
229 bm.installMaskPixels(mask);
230
231 if (cur_x + bm.width() >= fGMWidth - fMargin) {
232 cur_x = 0;
233 cur_y += max_height + fPadding;
234 max_height = 0;
235 }
236
237 canvas->save();
commit-bot@chromium.org793ddd92014-05-28 22:42:31 +0000238 canvas->translate((SkScalar)cur_x, (SkScalar)cur_y);
commit-bot@chromium.org3c1594a2014-05-28 21:52:12 +0000239 canvas->translate(-(bm.width() - r.width())/2, -(bm.height()-r.height())/2);
240 canvas->drawBitmap(bm, 0.f, 0.f, NULL);
241 canvas->restore();
242
243 cur_x += bm.width() + fPadding;
244 if (bm.height() > max_height)
245 max_height = bm.height();
246 }
247 }
248 }
249 }
250
251 virtual uint32_t onGetFlags() const { return kSkipPipe_Flag; }
252
253private:
254 typedef GM INHERITED;
255};
256
humper@google.com7c7292c2013-01-04 20:29:03 +0000257class BlurRectCompareGM : public skiagm::GM {
258 SkString fName;
259 unsigned int fRectWidth, fRectHeight;
reed@google.com140d7282013-01-07 20:25:04 +0000260 SkScalar fRadius;
commit-bot@chromium.orge3964552014-04-28 16:25:35 +0000261 SkBlurStyle fStyle;
humper@google.com7c7292c2013-01-04 20:29:03 +0000262public:
skia.committer@gmail.comb3ec29d2013-09-07 07:01:16 +0000263 BlurRectCompareGM(const char name[], unsigned int rectWidth,
264 unsigned int rectHeight, float radius,
commit-bot@chromium.orge3964552014-04-28 16:25:35 +0000265 SkBlurStyle style)
bsalomon@google.com33cdbde2013-01-11 20:54:44 +0000266 : fName(name)
267 , fRectWidth(rectWidth)
268 , fRectHeight(rectHeight)
269 , fRadius(radius)
robertphillips@google.comb7061172013-09-06 14:16:12 +0000270 , fStyle(style) {
271 }
skia.committer@gmail.comd454ec12013-02-21 07:15:03 +0000272 int width() const {
273 return fRectWidth;
humper@google.coma99a92c2013-02-20 16:42:06 +0000274 }
skia.committer@gmail.comd454ec12013-02-21 07:15:03 +0000275 int height() const {
276 return fRectHeight;
humper@google.coma99a92c2013-02-20 16:42:06 +0000277 }
skia.committer@gmail.comd454ec12013-02-21 07:15:03 +0000278 SkScalar radius() const {
279 return fRadius;
humper@google.coma99a92c2013-02-20 16:42:06 +0000280 }
commit-bot@chromium.orge3964552014-04-28 16:25:35 +0000281 SkBlurStyle style() const {
skia.committer@gmail.comd454ec12013-02-21 07:15:03 +0000282 return fStyle;
humper@google.coma99a92c2013-02-20 16:42:06 +0000283 }
humper@google.com7c7292c2013-01-04 20:29:03 +0000284
285protected:
286 virtual SkString onShortName() {
287 return fName;
288 }
289
290 virtual SkISize onISize() {
291 return SkISize::Make(640, 480);
292 }
skia.committer@gmail.com8ae714b2013-01-05 02:02:05 +0000293
humper@google.coma99a92c2013-02-20 16:42:06 +0000294 virtual bool makeMask(SkMask *m, const SkRect&) = 0;
humper@google.com7c7292c2013-01-04 20:29:03 +0000295
296 virtual void onDraw(SkCanvas* canvas) {
humper@google.coma99a92c2013-02-20 16:42:06 +0000297 SkRect r;
298 r.setWH(SkIntToScalar(fRectWidth), SkIntToScalar(fRectHeight));
humper@google.com7c7292c2013-01-04 20:29:03 +0000299
humper@google.coma99a92c2013-02-20 16:42:06 +0000300 SkISize canvas_size = canvas->getDeviceSize();
jvanverth@google.comd98df1a2013-02-20 19:02:34 +0000301 int center_x = (canvas_size.fWidth - (int)(r.width()))/2;
302 int center_y = (canvas_size.fHeight - (int)(r.height()))/2;
humper@google.com7c7292c2013-01-04 20:29:03 +0000303
humper@google.coma99a92c2013-02-20 16:42:06 +0000304 SkMask mask;
humper@google.com7c7292c2013-01-04 20:29:03 +0000305
humper@google.coma99a92c2013-02-20 16:42:06 +0000306 if (!this->makeMask(&mask, r)) {
307 SkPaint paint;
jvanverth@google.comd98df1a2013-02-20 19:02:34 +0000308 r.offset( SkIntToScalar(center_x), SkIntToScalar(center_y) );
humper@google.coma99a92c2013-02-20 16:42:06 +0000309 canvas->drawRect(r,paint);
310 return;
311 }
312 SkAutoMaskFreeImage amfi(mask.fImage);
313
314 SkBitmap bm;
commit-bot@chromium.orgdac52252014-02-17 21:21:46 +0000315 bm.installMaskPixels(mask);
humper@google.coma99a92c2013-02-20 16:42:06 +0000316
317 center_x = (canvas_size.fWidth - mask.fBounds.width())/2;
318 center_y = (canvas_size.fHeight - mask.fBounds.height())/2;
319
jvanverth@google.comd98df1a2013-02-20 19:02:34 +0000320 canvas->drawBitmap(bm, SkIntToScalar(center_x), SkIntToScalar(center_y), NULL);
humper@google.com7c7292c2013-01-04 20:29:03 +0000321 }
322
323 virtual uint32_t onGetFlags() const { return kSkipPipe_Flag; }
324
325private:
326 typedef GM INHERITED;
327};
328
329class BlurRectFastGM: public BlurRectCompareGM {
330public:
robertphillips@google.com7ce661d2013-08-27 16:14:03 +0000331 BlurRectFastGM(const char name[], unsigned int rectWidth,
332 unsigned int rectHeight, float blurRadius,
commit-bot@chromium.orge3964552014-04-28 16:25:35 +0000333 SkBlurStyle style) :
robertphillips@google.com7ce661d2013-08-27 16:14:03 +0000334 INHERITED(name, rectWidth, rectHeight, blurRadius, style) {
humper@google.coma99a92c2013-02-20 16:42:06 +0000335 }
robertphillips@google.com7ce661d2013-08-27 16:14:03 +0000336
humper@google.com7c7292c2013-01-04 20:29:03 +0000337protected:
humper@google.coma99a92c2013-02-20 16:42:06 +0000338 virtual bool makeMask(SkMask *m, const SkRect& r) SK_OVERRIDE {
robertphillips@google.comb7061172013-09-06 14:16:12 +0000339 return SkBlurMask::BlurRect(SkBlurMask::ConvertRadiusToSigma(this->radius()),
340 m, r, this->style());
reed@google.com140d7282013-01-07 20:25:04 +0000341 }
humper@google.coma99a92c2013-02-20 16:42:06 +0000342private:
343 typedef BlurRectCompareGM INHERITED;
humper@google.com7c7292c2013-01-04 20:29:03 +0000344};
345
346class BlurRectSlowGM: public BlurRectCompareGM {
347public:
robertphillips@google.comb7061172013-09-06 14:16:12 +0000348 BlurRectSlowGM(const char name[], unsigned int rectWidth, unsigned int rectHeight,
commit-bot@chromium.orge3964552014-04-28 16:25:35 +0000349 float blurRadius, SkBlurStyle style)
robertphillips@google.comb7061172013-09-06 14:16:12 +0000350 : INHERITED(name, rectWidth, rectHeight, blurRadius, style) {
humper@google.coma99a92c2013-02-20 16:42:06 +0000351 }
robertphillips@google.comb7061172013-09-06 14:16:12 +0000352
humper@google.com7c7292c2013-01-04 20:29:03 +0000353protected:
humper@google.coma99a92c2013-02-20 16:42:06 +0000354 virtual bool makeMask(SkMask *m, const SkRect& r) SK_OVERRIDE {
reed@google.com140d7282013-01-07 20:25:04 +0000355 SkMask src;
356 r.roundOut(&src.fBounds);
357 src.fBounds.offset(-src.fBounds.fLeft, -src.fBounds.fTop); // move to origin
358 src.fFormat = SkMask::kA8_Format;
359 src.fRowBytes = src.fBounds.width();
humper@google.coma99a92c2013-02-20 16:42:06 +0000360 src.fImage = SkMask::AllocImage(src.computeTotalImageSize());
bsalomon@google.com33cdbde2013-01-11 20:54:44 +0000361 SkAutoMaskFreeImage amfi(src.fImage);
humper@google.com7c7292c2013-01-04 20:29:03 +0000362
bsalomon@google.com33cdbde2013-01-11 20:54:44 +0000363 memset(src.fImage, 0xff, src.computeTotalImageSize());
humper@google.com7c7292c2013-01-04 20:29:03 +0000364
skia.committer@gmail.comb3ec29d2013-09-07 07:01:16 +0000365 return SkBlurMask::BoxBlur(m, src,
366 SkBlurMask::ConvertRadiusToSigma(this->radius()),
robertphillips@google.comb7061172013-09-06 14:16:12 +0000367 this->style(), this->getQuality());
reed@google.com140d7282013-01-07 20:25:04 +0000368 }
humper@google.coma99a92c2013-02-20 16:42:06 +0000369
commit-bot@chromium.orge3964552014-04-28 16:25:35 +0000370 virtual SkBlurQuality getQuality() {
371 return kHigh_SkBlurQuality;
humper@google.coma99a92c2013-02-20 16:42:06 +0000372 }
373private:
374 typedef BlurRectCompareGM INHERITED;
375};
376
377class BlurRectSlowLowGM: public BlurRectSlowGM {
378public:
skia.committer@gmail.comd454ec12013-02-21 07:15:03 +0000379 BlurRectSlowLowGM(const char name[], unsigned int rectWidth, unsigned int rectHeight,
commit-bot@chromium.orge3964552014-04-28 16:25:35 +0000380 float blurRadius, SkBlurStyle style)
robertphillips@google.comb7061172013-09-06 14:16:12 +0000381 : INHERITED(name, rectWidth, rectHeight, blurRadius, style) {
humper@google.coma99a92c2013-02-20 16:42:06 +0000382 }
robertphillips@google.comb7061172013-09-06 14:16:12 +0000383
humper@google.coma99a92c2013-02-20 16:42:06 +0000384protected:
commit-bot@chromium.orge3964552014-04-28 16:25:35 +0000385 virtual SkBlurQuality getQuality() SK_OVERRIDE {
386 return kLow_SkBlurQuality;
humper@google.coma99a92c2013-02-20 16:42:06 +0000387 }
388private:
389 typedef BlurRectSlowGM INHERITED;
390};
391
392class BlurRectGroundTruthGM: public BlurRectCompareGM {
393public:
skia.committer@gmail.comd454ec12013-02-21 07:15:03 +0000394 BlurRectGroundTruthGM(const char name[], unsigned int rectWidth, unsigned int rectHeight,
commit-bot@chromium.orge3964552014-04-28 16:25:35 +0000395 float blurRadius, SkBlurStyle style)
robertphillips@google.comb7061172013-09-06 14:16:12 +0000396 : INHERITED(name, rectWidth, rectHeight, blurRadius, style) {
humper@google.coma99a92c2013-02-20 16:42:06 +0000397 }
robertphillips@google.comb7061172013-09-06 14:16:12 +0000398
humper@google.coma99a92c2013-02-20 16:42:06 +0000399protected:
400 virtual bool makeMask(SkMask *m, const SkRect& r) SK_OVERRIDE {
401 SkMask src;
402 r.roundOut(&src.fBounds);
403 src.fBounds.offset(-src.fBounds.fLeft, -src.fBounds.fTop); // move to origin
404 src.fFormat = SkMask::kA8_Format;
405 src.fRowBytes = src.fBounds.width();
406 src.fImage = SkMask::AllocImage(src.computeTotalImageSize());
407 SkAutoMaskFreeImage amfi(src.fImage);
408
409 memset(src.fImage, 0xff, src.computeTotalImageSize());
410
robertphillips@google.comb7061172013-09-06 14:16:12 +0000411 return SkBlurMask::BlurGroundTruth(SkBlurMask::ConvertRadiusToSigma(this->radius()),
412 m, src, this->style());
humper@google.coma99a92c2013-02-20 16:42:06 +0000413 }
414
commit-bot@chromium.orge3964552014-04-28 16:25:35 +0000415 virtual SkBlurQuality getQuality() {
416 return kHigh_SkBlurQuality;
humper@google.coma99a92c2013-02-20 16:42:06 +0000417 }
418private:
419 typedef BlurRectCompareGM INHERITED;
humper@google.com7c7292c2013-01-04 20:29:03 +0000420};
421
422
reed@google.comdb87c962012-11-02 21:11:12 +0000423//////////////////////////////////////////////////////////////////////////////
424
commit-bot@chromium.org7cced562014-01-10 23:10:13 +0000425DEF_GM(return new BlurRectGM("blurrects", 0xFF);)
commit-bot@chromium.org3c1594a2014-05-28 21:52:12 +0000426DEF_GM(return new BlurRectDirectGM("blurrect_gallery");)