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