1db87c960857a19555517c017e98804af7d9bf8c1reed@google.com/*
2a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com* Copyright 2012 Google Inc.
3a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com*
4a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com* Use of this source code is governed by a BSD-style license that can be
5a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com* found in the LICENSE file.
6a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com*/
7db87c960857a19555517c017e98804af7d9bf8c1reed@google.com
8db87c960857a19555517c017e98804af7d9bf8c1reed@google.com#include "gm.h"
97c7292c6071898d73dc935c3b66b9816183806f0humper@google.com#include "SkBlurMask.h"
10b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkBlurMaskFilter.h"
11db87c960857a19555517c017e98804af7d9bf8c1reed@google.com#include "SkCanvas.h"
12db87c960857a19555517c017e98804af7d9bf8c1reed@google.com#include "SkPath.h"
13db87c960857a19555517c017e98804af7d9bf8c1reed@google.com
14db87c960857a19555517c017e98804af7d9bf8c1reed@google.com#define STROKE_WIDTH    SkIntToScalar(10)
15db87c960857a19555517c017e98804af7d9bf8c1reed@google.com
16db87c960857a19555517c017e98804af7d9bf8c1reed@google.comtypedef void (*Proc)(SkCanvas*, const SkRect&, const SkPaint&);
17db87c960857a19555517c017e98804af7d9bf8c1reed@google.com
18db87c960857a19555517c017e98804af7d9bf8c1reed@google.comstatic void fill_rect(SkCanvas* canvas, const SkRect& r, const SkPaint& p) {
19db87c960857a19555517c017e98804af7d9bf8c1reed@google.com    canvas->drawRect(r, p);
20db87c960857a19555517c017e98804af7d9bf8c1reed@google.com}
21db87c960857a19555517c017e98804af7d9bf8c1reed@google.com
22db87c960857a19555517c017e98804af7d9bf8c1reed@google.comstatic void draw_donut(SkCanvas* canvas, const SkRect& r, const SkPaint& p) {
23db87c960857a19555517c017e98804af7d9bf8c1reed@google.com    SkRect  rect;
24db87c960857a19555517c017e98804af7d9bf8c1reed@google.com    SkPath  path;
253458716b52aa25dcd1b270141c7628c380696e35skia.committer@gmail.com
26db87c960857a19555517c017e98804af7d9bf8c1reed@google.com    rect = r;
27db87c960857a19555517c017e98804af7d9bf8c1reed@google.com    rect.outset(STROKE_WIDTH/2, STROKE_WIDTH/2);
28db87c960857a19555517c017e98804af7d9bf8c1reed@google.com    path.addRect(rect);
29db87c960857a19555517c017e98804af7d9bf8c1reed@google.com    rect = r;
30db87c960857a19555517c017e98804af7d9bf8c1reed@google.com    rect.inset(STROKE_WIDTH/2, STROKE_WIDTH/2);
313458716b52aa25dcd1b270141c7628c380696e35skia.committer@gmail.com
32db87c960857a19555517c017e98804af7d9bf8c1reed@google.com    path.addRect(rect);
33db87c960857a19555517c017e98804af7d9bf8c1reed@google.com    path.setFillType(SkPath::kEvenOdd_FillType);
343458716b52aa25dcd1b270141c7628c380696e35skia.committer@gmail.com
35808b70f869572b2f2d6660960578ba39eb0d5d73reed@google.com    canvas->drawPath(path, p);
36808b70f869572b2f2d6660960578ba39eb0d5d73reed@google.com}
37db87c960857a19555517c017e98804af7d9bf8c1reed@google.com
38808b70f869572b2f2d6660960578ba39eb0d5d73reed@google.comstatic void draw_donut_skewed(SkCanvas* canvas, const SkRect& r, const SkPaint& p) {
39808b70f869572b2f2d6660960578ba39eb0d5d73reed@google.com    SkRect  rect;
40808b70f869572b2f2d6660960578ba39eb0d5d73reed@google.com    SkPath  path;
413458716b52aa25dcd1b270141c7628c380696e35skia.committer@gmail.com
42808b70f869572b2f2d6660960578ba39eb0d5d73reed@google.com    rect = r;
43808b70f869572b2f2d6660960578ba39eb0d5d73reed@google.com    rect.outset(STROKE_WIDTH/2, STROKE_WIDTH/2);
44808b70f869572b2f2d6660960578ba39eb0d5d73reed@google.com    path.addRect(rect);
45808b70f869572b2f2d6660960578ba39eb0d5d73reed@google.com    rect = r;
46808b70f869572b2f2d6660960578ba39eb0d5d73reed@google.com    rect.inset(STROKE_WIDTH/2, STROKE_WIDTH/2);
473458716b52aa25dcd1b270141c7628c380696e35skia.committer@gmail.com
48808b70f869572b2f2d6660960578ba39eb0d5d73reed@google.com    rect.offset(7, -7);
493458716b52aa25dcd1b270141c7628c380696e35skia.committer@gmail.com
50808b70f869572b2f2d6660960578ba39eb0d5d73reed@google.com    path.addRect(rect);
51808b70f869572b2f2d6660960578ba39eb0d5d73reed@google.com    path.setFillType(SkPath::kEvenOdd_FillType);
523458716b52aa25dcd1b270141c7628c380696e35skia.committer@gmail.com
53db87c960857a19555517c017e98804af7d9bf8c1reed@google.com    canvas->drawPath(path, p);
54db87c960857a19555517c017e98804af7d9bf8c1reed@google.com}
55db87c960857a19555517c017e98804af7d9bf8c1reed@google.com
5653007a2b1724c15c170340658daac012f9d909bereed@google.com#include "SkGradientShader.h"
5753007a2b1724c15c170340658daac012f9d909bereed@google.com
58341400ea7ba0f711ac4c6ead0b33c5c89b4ac55cjoshualitt/*
59341400ea7ba0f711ac4c6ead0b33c5c89b4ac55cjoshualitt * Spits out a dummy gradient to test blur with shader on paint
60341400ea7ba0f711ac4c6ead0b33c5c89b4ac55cjoshualitt */
61341400ea7ba0f711ac4c6ead0b33c5c89b4ac55cjoshualittstatic SkShader* MakeRadial() {
62341400ea7ba0f711ac4c6ead0b33c5c89b4ac55cjoshualitt    SkPoint pts[2] = {
63341400ea7ba0f711ac4c6ead0b33c5c89b4ac55cjoshualitt        { 0, 0 },
64341400ea7ba0f711ac4c6ead0b33c5c89b4ac55cjoshualitt        { SkIntToScalar(100), SkIntToScalar(100) }
65341400ea7ba0f711ac4c6ead0b33c5c89b4ac55cjoshualitt    };
66341400ea7ba0f711ac4c6ead0b33c5c89b4ac55cjoshualitt    SkShader::TileMode tm = SkShader::kClamp_TileMode;
67341400ea7ba0f711ac4c6ead0b33c5c89b4ac55cjoshualitt    const SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, };
68341400ea7ba0f711ac4c6ead0b33c5c89b4ac55cjoshualitt    const SkScalar pos[] = { SK_Scalar1/4, SK_Scalar1*3/4 };
69341400ea7ba0f711ac4c6ead0b33c5c89b4ac55cjoshualitt    SkMatrix scale;
70341400ea7ba0f711ac4c6ead0b33c5c89b4ac55cjoshualitt    scale.setScale(0.5f, 0.5f);
71341400ea7ba0f711ac4c6ead0b33c5c89b4ac55cjoshualitt    scale.postTranslate(25.f, 25.f);
72341400ea7ba0f711ac4c6ead0b33c5c89b4ac55cjoshualitt    SkPoint center0, center1;
73341400ea7ba0f711ac4c6ead0b33c5c89b4ac55cjoshualitt    center0.set(SkScalarAve(pts[0].fX, pts[1].fX),
74341400ea7ba0f711ac4c6ead0b33c5c89b4ac55cjoshualitt                SkScalarAve(pts[0].fY, pts[1].fY));
75341400ea7ba0f711ac4c6ead0b33c5c89b4ac55cjoshualitt    center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5),
76341400ea7ba0f711ac4c6ead0b33c5c89b4ac55cjoshualitt                SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4));
7771a6cbfc585959738dc0b375603696ca7f60605freed    return SkGradientShader::CreateTwoPointConical(center1, (pts[1].fX - pts[0].fX) / 7,
78341400ea7ba0f711ac4c6ead0b33c5c89b4ac55cjoshualitt                                                  center0, (pts[1].fX - pts[0].fX) / 2,
79341400ea7ba0f711ac4c6ead0b33c5c89b4ac55cjoshualitt                                                  colors, pos, SK_ARRAY_COUNT(colors), tm,
80341400ea7ba0f711ac4c6ead0b33c5c89b4ac55cjoshualitt                                                  0, &scale);
81341400ea7ba0f711ac4c6ead0b33c5c89b4ac55cjoshualitt}
82341400ea7ba0f711ac4c6ead0b33c5c89b4ac55cjoshualitt
8353007a2b1724c15c170340658daac012f9d909bereed@google.comtypedef void (*PaintProc)(SkPaint*, SkScalar width);
8453007a2b1724c15c170340658daac012f9d909bereed@google.com
85db87c960857a19555517c017e98804af7d9bf8c1reed@google.comclass BlurRectGM : public skiagm::GM {
86e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org      SkAutoTUnref<SkMaskFilter> fMaskFilters[kLastEnum_SkBlurStyle + 1];
87a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com      SkString  fName;
88a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com      SkAlpha   fAlpha;
89db87c960857a19555517c017e98804af7d9bf8c1reed@google.compublic:
907cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org    BlurRectGM(const char name[], U8CPU alpha)
917cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org        : fName(name)
927cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org        , fAlpha(SkToU8(alpha)) {
9357850b9daddd941f880d94faaf83f2169355a0c8reed@google.com    }
94db87c960857a19555517c017e98804af7d9bf8c1reed@google.com
95db87c960857a19555517c017e98804af7d9bf8c1reed@google.comprotected:
9636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onOnceBeforeDraw() override {
97e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org        for (int i = 0; i <= kLastEnum_SkBlurStyle; ++i) {
98e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org            fMaskFilters[i].reset(SkBlurMaskFilter::Create((SkBlurStyle)i,
997cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org                                  SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(STROKE_WIDTH/2)),
1007cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org                                  SkBlurMaskFilter::kHighQuality_BlurFlag));
1017cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org        }
1027cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org    }
1037cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org
10436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkString onShortName() override {
10553007a2b1724c15c170340658daac012f9d909bereed@google.com        return fName;
106db87c960857a19555517c017e98804af7d9bf8c1reed@google.com    }
107db87c960857a19555517c017e98804af7d9bf8c1reed@google.com
10836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkISize onISize() override {
109341400ea7ba0f711ac4c6ead0b33c5c89b4ac55cjoshualitt        return SkISize::Make(860, 820);
110db87c960857a19555517c017e98804af7d9bf8c1reed@google.com    }
111db87c960857a19555517c017e98804af7d9bf8c1reed@google.com
11236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(SkCanvas* canvas) override {
113db87c960857a19555517c017e98804af7d9bf8c1reed@google.com        canvas->translate(STROKE_WIDTH*3/2, STROKE_WIDTH*3/2);
114db87c960857a19555517c017e98804af7d9bf8c1reed@google.com
1157cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org        SkRect  r = { 0, 0, 100, 50 };
1167cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org        SkScalar scales[] = { SK_Scalar1, 0.6f };
1178ccf590b89cec1a5974b6f4b7b49ca67cc5036cfskia.committer@gmail.com
1187cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org        for (size_t s = 0; s < SK_ARRAY_COUNT(scales); ++s) {
1197cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org            canvas->save();
1207cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org            for (size_t f = 0; f < SK_ARRAY_COUNT(fMaskFilters); ++f) {
1217cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org                SkPaint paint;
1227cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org                paint.setMaskFilter(fMaskFilters[f]);
1237cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org                paint.setAlpha(fAlpha);
1247cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org
125341400ea7ba0f711ac4c6ead0b33c5c89b4ac55cjoshualitt                SkPaint paintWithRadial = paint;
126341400ea7ba0f711ac4c6ead0b33c5c89b4ac55cjoshualitt                paintWithRadial.setShader(MakeRadial())->unref();
127341400ea7ba0f711ac4c6ead0b33c5c89b4ac55cjoshualitt
1287cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org                static const Proc procs[] = {
1297cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org                    fill_rect, draw_donut, draw_donut_skewed
1307cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org                };
131db87c960857a19555517c017e98804af7d9bf8c1reed@google.com
1327cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org                canvas->save();
1337cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org                canvas->scale(scales[s], scales[s]);
1347cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org                this->drawProcs(canvas, r, paint, false, procs, SK_ARRAY_COUNT(procs));
1357cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org                canvas->translate(r.width() * 4/3, 0);
136341400ea7ba0f711ac4c6ead0b33c5c89b4ac55cjoshualitt                this->drawProcs(canvas, r, paintWithRadial, false, procs, SK_ARRAY_COUNT(procs));
137341400ea7ba0f711ac4c6ead0b33c5c89b4ac55cjoshualitt                canvas->translate(r.width() * 4/3, 0);
1387cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org                this->drawProcs(canvas, r, paint, true, procs, SK_ARRAY_COUNT(procs));
139341400ea7ba0f711ac4c6ead0b33c5c89b4ac55cjoshualitt                canvas->translate(r.width() * 4/3, 0);
140341400ea7ba0f711ac4c6ead0b33c5c89b4ac55cjoshualitt                this->drawProcs(canvas, r, paintWithRadial, true, procs, SK_ARRAY_COUNT(procs));
1417cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org                canvas->restore();
142db87c960857a19555517c017e98804af7d9bf8c1reed@google.com
1437cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org                canvas->translate(0, SK_ARRAY_COUNT(procs) * r.height() * 4/3 * scales[s]);
1447cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org            }
1457cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org            canvas->restore();
146341400ea7ba0f711ac4c6ead0b33c5c89b4ac55cjoshualitt            canvas->translate(4 * r.width() * 4/3 * scales[s], 0);
1477cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org        }
148db87c960857a19555517c017e98804af7d9bf8c1reed@google.com    }
149db87c960857a19555517c017e98804af7d9bf8c1reed@google.com
150db87c960857a19555517c017e98804af7d9bf8c1reed@google.comprivate:
151db87c960857a19555517c017e98804af7d9bf8c1reed@google.com    void drawProcs(SkCanvas* canvas, const SkRect& r, const SkPaint& paint,
152db87c960857a19555517c017e98804af7d9bf8c1reed@google.com                   bool doClip, const Proc procs[], size_t procsCount) {
153db87c960857a19555517c017e98804af7d9bf8c1reed@google.com        SkAutoCanvasRestore acr(canvas, true);
154db87c960857a19555517c017e98804af7d9bf8c1reed@google.com        for (size_t i = 0; i < procsCount; ++i) {
155db87c960857a19555517c017e98804af7d9bf8c1reed@google.com            if (doClip) {
156db87c960857a19555517c017e98804af7d9bf8c1reed@google.com                SkRect clipRect(r);
157db87c960857a19555517c017e98804af7d9bf8c1reed@google.com                clipRect.inset(STROKE_WIDTH/2, STROKE_WIDTH/2);
158db87c960857a19555517c017e98804af7d9bf8c1reed@google.com                canvas->save();
159db87c960857a19555517c017e98804af7d9bf8c1reed@google.com                canvas->clipRect(r);
160db87c960857a19555517c017e98804af7d9bf8c1reed@google.com            }
161db87c960857a19555517c017e98804af7d9bf8c1reed@google.com            procs[i](canvas, r, paint);
162db87c960857a19555517c017e98804af7d9bf8c1reed@google.com            if (doClip) {
163db87c960857a19555517c017e98804af7d9bf8c1reed@google.com                canvas->restore();
164db87c960857a19555517c017e98804af7d9bf8c1reed@google.com            }
165db87c960857a19555517c017e98804af7d9bf8c1reed@google.com            canvas->translate(0, r.height() * 4/3);
166db87c960857a19555517c017e98804af7d9bf8c1reed@google.com        }
167db87c960857a19555517c017e98804af7d9bf8c1reed@google.com    }
168a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.comprivate:
169db87c960857a19555517c017e98804af7d9bf8c1reed@google.com    typedef GM INHERITED;
170db87c960857a19555517c017e98804af7d9bf8c1reed@google.com};
171db87c960857a19555517c017e98804af7d9bf8c1reed@google.com
1723c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
1733c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.orgclass BlurRectDirectGM : public skiagm::GM {
1743c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org    SkString  fName;
1753c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org    int fGMWidth, fGMHeight;
1763c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org    int fPadding, fMargin;
1773c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.orgpublic:
1783c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org    BlurRectDirectGM(const char name[])
1793c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org        : fName(name),
1803c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org          fGMWidth(1200),
1813c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org          fGMHeight(1024),
1823c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org          fPadding(10),
1833c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org          fMargin(100)
1843c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org    {
1853c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org    }
1863c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
1873c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.orgprotected:
1883c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org    virtual SkString onShortName() {
1893c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org        return fName;
1903c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org    }
1913c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
1923c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org    virtual SkISize onISize() {
1933c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org        return SkISize::Make(fGMWidth, fGMHeight);
1943c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org    }
1953c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
1963c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org    virtual void onDraw(SkCanvas* canvas) {
1973c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org        const int widths[] = {25, 5, 5, 100, 150, 25};
1983c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org        const int heights[] = {100, 100, 5, 25, 150, 25};
1993c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org        const SkBlurStyle styles[] = {kNormal_SkBlurStyle, kInner_SkBlurStyle, kOuter_SkBlurStyle};
2003c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org        const float radii[] = {20, 5, 10};
2013c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
2023c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org        canvas->translate(50,20);
2033c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
2043c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org        int cur_x = 0;
2053c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org        int cur_y = 0;
2063c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
2073c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org        int max_height = 0;
2083c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
2093c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org        for (size_t i = 0 ; i < SK_ARRAY_COUNT(widths) ; i++) {
2103c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org            int width = widths[i];
2113c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org            int height = heights[i];
2123c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org            SkRect r;
2133c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org            r.setWH(SkIntToScalar(width), SkIntToScalar(height));
2143c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org            SkAutoCanvasRestore autoRestore(canvas, true);
2153c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
2163c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org            for (size_t j = 0 ; j < SK_ARRAY_COUNT(radii) ; j++) {
2173c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                float radius = radii[j];
2183c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                for (size_t k = 0 ; k < SK_ARRAY_COUNT(styles) ; k++) {
2193c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    SkBlurStyle style = styles[k];
2203c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
2213c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    SkMask mask;
2223c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    SkBlurMask::BlurRect(SkBlurMask::ConvertRadiusToSigma(radius), &mask, r, style);
2233c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
2243c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    SkAutoMaskFreeImage amfi(mask.fImage);
2253c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
2263c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    SkBitmap bm;
2273c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    bm.installMaskPixels(mask);
2283c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
2293c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    if (cur_x + bm.width() >= fGMWidth - fMargin) {
2303c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                        cur_x = 0;
2313c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                        cur_y += max_height + fPadding;
2323c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                        max_height = 0;
2333c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    }
2343c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
2353c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    canvas->save();
236793ddd994aae5a78b13fdbe24a6755085f7998cdcommit-bot@chromium.org                    canvas->translate((SkScalar)cur_x, (SkScalar)cur_y);
2373c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    canvas->translate(-(bm.width() - r.width())/2, -(bm.height()-r.height())/2);
2383c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    canvas->drawBitmap(bm, 0.f, 0.f, NULL);
2393c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    canvas->restore();
2403c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
2413c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    cur_x += bm.width() + fPadding;
2423c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    if (bm.height() > max_height)
2433c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                        max_height = bm.height();
2443c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                }
2453c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org            }
2463c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org        }
2473c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org    }
2483c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
2493c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.orgprivate:
2503c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org    typedef GM INHERITED;
2513c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org};
2523c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
2537c7292c6071898d73dc935c3b66b9816183806f0humper@google.comclass BlurRectCompareGM : public skiagm::GM {
2547c7292c6071898d73dc935c3b66b9816183806f0humper@google.com    SkString  fName;
2557c7292c6071898d73dc935c3b66b9816183806f0humper@google.com    unsigned int fRectWidth, fRectHeight;
256140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com    SkScalar fRadius;
257e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org    SkBlurStyle fStyle;
2587c7292c6071898d73dc935c3b66b9816183806f0humper@google.compublic:
259b3ec29d2d81ae391e433fbdf8aabc791e426ee38skia.committer@gmail.com    BlurRectCompareGM(const char name[], unsigned int rectWidth,
260b3ec29d2d81ae391e433fbdf8aabc791e426ee38skia.committer@gmail.com                      unsigned int rectHeight, float radius,
261e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org                      SkBlurStyle style)
26233cdbdea3ddcec9323b65eace86e10557312ae9bbsalomon@google.com        : fName(name)
26333cdbdea3ddcec9323b65eace86e10557312ae9bbsalomon@google.com        , fRectWidth(rectWidth)
26433cdbdea3ddcec9323b65eace86e10557312ae9bbsalomon@google.com        , fRectHeight(rectHeight)
26533cdbdea3ddcec9323b65eace86e10557312ae9bbsalomon@google.com        , fRadius(radius)
266b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com        , fStyle(style) {
267b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com    }
268d454ec135eeef48edea7ebc47a61ff39bd654576skia.committer@gmail.com    int width() const {
269d454ec135eeef48edea7ebc47a61ff39bd654576skia.committer@gmail.com        return fRectWidth;
270a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com    }
271d454ec135eeef48edea7ebc47a61ff39bd654576skia.committer@gmail.com    int height() const {
272d454ec135eeef48edea7ebc47a61ff39bd654576skia.committer@gmail.com        return fRectHeight;
273a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com    }
274d454ec135eeef48edea7ebc47a61ff39bd654576skia.committer@gmail.com    SkScalar radius() const {
275d454ec135eeef48edea7ebc47a61ff39bd654576skia.committer@gmail.com        return fRadius;
276a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com    }
277e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org    SkBlurStyle style() const {
278d454ec135eeef48edea7ebc47a61ff39bd654576skia.committer@gmail.com        return fStyle;
279a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com    }
2807c7292c6071898d73dc935c3b66b9816183806f0humper@google.com
2817c7292c6071898d73dc935c3b66b9816183806f0humper@google.comprotected:
2827c7292c6071898d73dc935c3b66b9816183806f0humper@google.com    virtual SkString onShortName() {
2837c7292c6071898d73dc935c3b66b9816183806f0humper@google.com        return fName;
2847c7292c6071898d73dc935c3b66b9816183806f0humper@google.com    }
2857c7292c6071898d73dc935c3b66b9816183806f0humper@google.com
2867c7292c6071898d73dc935c3b66b9816183806f0humper@google.com    virtual SkISize onISize() {
2877c7292c6071898d73dc935c3b66b9816183806f0humper@google.com        return SkISize::Make(640, 480);
2887c7292c6071898d73dc935c3b66b9816183806f0humper@google.com    }
2898ae714b186ae5f4eaddee239281fbfe7282320c9skia.committer@gmail.com
290a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com    virtual bool makeMask(SkMask *m, const SkRect&) = 0;
2917c7292c6071898d73dc935c3b66b9816183806f0humper@google.com
2927c7292c6071898d73dc935c3b66b9816183806f0humper@google.com    virtual void onDraw(SkCanvas* canvas) {
293a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        SkRect r;
294a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        r.setWH(SkIntToScalar(fRectWidth), SkIntToScalar(fRectHeight));
295a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com
296a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        SkISize canvas_size = canvas->getDeviceSize();
297d98df1a3c468a2a7a5fff5efbf6dbdaf077d1abejvanverth@google.com        int center_x = (canvas_size.fWidth - (int)(r.width()))/2;
298d98df1a3c468a2a7a5fff5efbf6dbdaf077d1abejvanverth@google.com        int center_y = (canvas_size.fHeight - (int)(r.height()))/2;
299a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com
300a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        SkMask mask;
301a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com
302a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        if (!this->makeMask(&mask, r)) {
303a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com            SkPaint paint;
304d98df1a3c468a2a7a5fff5efbf6dbdaf077d1abejvanverth@google.com            r.offset( SkIntToScalar(center_x), SkIntToScalar(center_y) );
305a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com            canvas->drawRect(r,paint);
306a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com            return;
307a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        }
308a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        SkAutoMaskFreeImage amfi(mask.fImage);
3097c7292c6071898d73dc935c3b66b9816183806f0humper@google.com
310a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        SkBitmap bm;
311dac522589e9395b4654a1a708f1bd971f37f95a5commit-bot@chromium.org        bm.installMaskPixels(mask);
3127c7292c6071898d73dc935c3b66b9816183806f0humper@google.com
313a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        center_x = (canvas_size.fWidth - mask.fBounds.width())/2;
314a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        center_y = (canvas_size.fHeight - mask.fBounds.height())/2;
3157c7292c6071898d73dc935c3b66b9816183806f0humper@google.com
316d98df1a3c468a2a7a5fff5efbf6dbdaf077d1abejvanverth@google.com        canvas->drawBitmap(bm, SkIntToScalar(center_x), SkIntToScalar(center_y), NULL);
3177c7292c6071898d73dc935c3b66b9816183806f0humper@google.com    }
3187c7292c6071898d73dc935c3b66b9816183806f0humper@google.com
3197c7292c6071898d73dc935c3b66b9816183806f0humper@google.comprivate:
3207c7292c6071898d73dc935c3b66b9816183806f0humper@google.com    typedef GM INHERITED;
3217c7292c6071898d73dc935c3b66b9816183806f0humper@google.com};
3227c7292c6071898d73dc935c3b66b9816183806f0humper@google.com
3237c7292c6071898d73dc935c3b66b9816183806f0humper@google.comclass BlurRectFastGM: public BlurRectCompareGM {
3247c7292c6071898d73dc935c3b66b9816183806f0humper@google.compublic:
3257ce661d19c5cf4484305a1b20c44bd111f129847robertphillips@google.com    BlurRectFastGM(const char name[], unsigned int rectWidth,
3267ce661d19c5cf4484305a1b20c44bd111f129847robertphillips@google.com                   unsigned int rectHeight, float blurRadius,
327e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org                   SkBlurStyle style) :
3287ce661d19c5cf4484305a1b20c44bd111f129847robertphillips@google.com        INHERITED(name, rectWidth, rectHeight, blurRadius, style) {
329a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        }
3307ce661d19c5cf4484305a1b20c44bd111f129847robertphillips@google.com
3317c7292c6071898d73dc935c3b66b9816183806f0humper@google.comprotected:
33236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool makeMask(SkMask *m, const SkRect& r) override {
333b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com        return SkBlurMask::BlurRect(SkBlurMask::ConvertRadiusToSigma(this->radius()),
334b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com                                    m, r, this->style());
335140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com    }
336a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.comprivate:
337a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com    typedef BlurRectCompareGM INHERITED;
3387c7292c6071898d73dc935c3b66b9816183806f0humper@google.com};
3397c7292c6071898d73dc935c3b66b9816183806f0humper@google.com
3407c7292c6071898d73dc935c3b66b9816183806f0humper@google.comclass BlurRectSlowGM: public BlurRectCompareGM {
3417c7292c6071898d73dc935c3b66b9816183806f0humper@google.compublic:
342b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com    BlurRectSlowGM(const char name[], unsigned int rectWidth, unsigned int rectHeight,
343e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org                   float blurRadius, SkBlurStyle style)
344b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com        : INHERITED(name, rectWidth, rectHeight, blurRadius, style) {
345a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        }
346b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com
3477c7292c6071898d73dc935c3b66b9816183806f0humper@google.comprotected:
34836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool makeMask(SkMask *m, const SkRect& r) override {
349140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com        SkMask src;
350140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com        r.roundOut(&src.fBounds);
351140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com        src.fBounds.offset(-src.fBounds.fLeft, -src.fBounds.fTop);  // move to origin
352140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com        src.fFormat = SkMask::kA8_Format;
353140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com        src.fRowBytes = src.fBounds.width();
354a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        src.fImage = SkMask::AllocImage(src.computeTotalImageSize());
35533cdbdea3ddcec9323b65eace86e10557312ae9bbsalomon@google.com        SkAutoMaskFreeImage amfi(src.fImage);
3567c7292c6071898d73dc935c3b66b9816183806f0humper@google.com
35733cdbdea3ddcec9323b65eace86e10557312ae9bbsalomon@google.com        memset(src.fImage, 0xff, src.computeTotalImageSize());
3587c7292c6071898d73dc935c3b66b9816183806f0humper@google.com
359b3ec29d2d81ae391e433fbdf8aabc791e426ee38skia.committer@gmail.com        return SkBlurMask::BoxBlur(m, src,
360b3ec29d2d81ae391e433fbdf8aabc791e426ee38skia.committer@gmail.com                                   SkBlurMask::ConvertRadiusToSigma(this->radius()),
361b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com                                   this->style(), this->getQuality());
362140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com    }
363a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com
364e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org    virtual SkBlurQuality getQuality() {
365e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org        return kHigh_SkBlurQuality;
366a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com    }
367a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.comprivate:
368a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com    typedef BlurRectCompareGM INHERITED;
369a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com};
370a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com
371a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.comclass BlurRectSlowLowGM: public BlurRectSlowGM {
372a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.compublic:
373d454ec135eeef48edea7ebc47a61ff39bd654576skia.committer@gmail.com    BlurRectSlowLowGM(const char name[], unsigned int rectWidth, unsigned int rectHeight,
374e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org                      float blurRadius, SkBlurStyle style)
375b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com        : INHERITED(name, rectWidth, rectHeight, blurRadius, style) {
376a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        }
377b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com
378a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.comprotected:
37936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkBlurQuality getQuality() override {
380e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org        return kLow_SkBlurQuality;
381a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com    }
382a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.comprivate:
383a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com    typedef BlurRectSlowGM INHERITED;
384a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com};
385a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com
386a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.comclass BlurRectGroundTruthGM: public BlurRectCompareGM {
387a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.compublic:
388d454ec135eeef48edea7ebc47a61ff39bd654576skia.committer@gmail.com    BlurRectGroundTruthGM(const char name[], unsigned int rectWidth, unsigned int rectHeight,
389e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org                          float blurRadius, SkBlurStyle style)
390b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com        : INHERITED(name, rectWidth, rectHeight, blurRadius, style) {
391a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        }
392b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com
393a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.comprotected:
39436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool makeMask(SkMask *m, const SkRect& r) override {
395a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        SkMask src;
396a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        r.roundOut(&src.fBounds);
397a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        src.fBounds.offset(-src.fBounds.fLeft, -src.fBounds.fTop);  // move to origin
398a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        src.fFormat = SkMask::kA8_Format;
399a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        src.fRowBytes = src.fBounds.width();
400a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        src.fImage = SkMask::AllocImage(src.computeTotalImageSize());
401a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        SkAutoMaskFreeImage amfi(src.fImage);
402a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com
403a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        memset(src.fImage, 0xff, src.computeTotalImageSize());
404a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com
405b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com        return SkBlurMask::BlurGroundTruth(SkBlurMask::ConvertRadiusToSigma(this->radius()),
406b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com                                           m, src, this->style());
407a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com    }
408a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com
409e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org    virtual SkBlurQuality getQuality() {
410e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org        return kHigh_SkBlurQuality;
411a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com    }
412a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.comprivate:
413a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com    typedef BlurRectCompareGM INHERITED;
4147c7292c6071898d73dc935c3b66b9816183806f0humper@google.com};
4157c7292c6071898d73dc935c3b66b9816183806f0humper@google.com
4167c7292c6071898d73dc935c3b66b9816183806f0humper@google.com
417db87c960857a19555517c017e98804af7d9bf8c1reed@google.com//////////////////////////////////////////////////////////////////////////////
418db87c960857a19555517c017e98804af7d9bf8c1reed@google.com
4197cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.orgDEF_GM(return new BlurRectGM("blurrects", 0xFF);)
4203c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.orgDEF_GM(return new BlurRectDirectGM("blurrect_gallery");)
421