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 */
612ad1aa67c6894696cdd65ec56057f81031d1c24areedstatic sk_sp<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));
772ad1aa67c6894696cdd65ec56057f81031d1c24areed    return SkGradientShader::MakeTwoPointConical(center1, (pts[1].fX - pts[0].fX) / 7,
782ad1aa67c6894696cdd65ec56057f81031d1c24areed                                                 center0, (pts[1].fX - pts[0].fX) / 2,
792ad1aa67c6894696cdd65ec56057f81031d1c24areed                                                 colors, pos, SK_ARRAY_COUNT(colors), tm,
802ad1aa67c6894696cdd65ec56057f81031d1c24areed                                                 0, &scale);
81341400ea7ba0f711ac4c6ead0b33c5c89b4ac55cjoshualitt}
82341400ea7ba0f711ac4c6ead0b33c5c89b4ac55cjoshualitt
8353007a2b1724c15c170340658daac012f9d909bereed@google.comtypedef void (*PaintProc)(SkPaint*, SkScalar width);
8453007a2b1724c15c170340658daac012f9d909bereed@google.com
85db87c960857a19555517c017e98804af7d9bf8c1reed@google.comclass BlurRectGM : public skiagm::GM {
86efdfd51b68a300d5c6e28743fe0344ca05d1cec9reed      sk_sp<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) {
98efdfd51b68a300d5c6e28743fe0344ca05d1cec9reed            fMaskFilters[i] = SkBlurMaskFilter::Make((SkBlurStyle)i,
997cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org                                  SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(STROKE_WIDTH/2)),
100efdfd51b68a300d5c6e28743fe0344ca05d1cec9reed                                  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;
1262ad1aa67c6894696cdd65ec56057f81031d1c24areed                paintWithRadial.setShader(MakeRadial());
127341400ea7ba0f711ac4c6ead0b33c5c89b4ac55cjoshualitt
128dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein                constexpr 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
1722a24338c777462e04a2b26295f9c034155ee8f3ehalcanaryDEF_SIMPLE_GM(blurrect_gallery, canvas, 1200, 1024) {
1732a24338c777462e04a2b26295f9c034155ee8f3ehalcanary        const int fGMWidth = 1200;
1742a24338c777462e04a2b26295f9c034155ee8f3ehalcanary        const int fPadding = 10;
1752a24338c777462e04a2b26295f9c034155ee8f3ehalcanary        const int fMargin = 100;
1763c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
1773c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org        const int widths[] = {25, 5, 5, 100, 150, 25};
1783c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org        const int heights[] = {100, 100, 5, 25, 150, 25};
1793c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org        const SkBlurStyle styles[] = {kNormal_SkBlurStyle, kInner_SkBlurStyle, kOuter_SkBlurStyle};
1803c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org        const float radii[] = {20, 5, 10};
1813c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
1823c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org        canvas->translate(50,20);
1833c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
1843c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org        int cur_x = 0;
1853c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org        int cur_y = 0;
1863c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
1873c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org        int max_height = 0;
1883c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
1893c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org        for (size_t i = 0 ; i < SK_ARRAY_COUNT(widths) ; i++) {
1903c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org            int width = widths[i];
1913c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org            int height = heights[i];
1923c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org            SkRect r;
1933c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org            r.setWH(SkIntToScalar(width), SkIntToScalar(height));
1943c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org            SkAutoCanvasRestore autoRestore(canvas, true);
1953c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
1963c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org            for (size_t j = 0 ; j < SK_ARRAY_COUNT(radii) ; j++) {
1973c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                float radius = radii[j];
1983c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                for (size_t k = 0 ; k < SK_ARRAY_COUNT(styles) ; k++) {
1993c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    SkBlurStyle style = styles[k];
2003c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
2013c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    SkMask mask;
202e80eb928ba0248a5a5dea6e1f0005aa08ecf8740robertphillips                    if (!SkBlurMask::BlurRect(SkBlurMask::ConvertRadiusToSigma(radius),
203e80eb928ba0248a5a5dea6e1f0005aa08ecf8740robertphillips                                              &mask, r, style)) {
204e80eb928ba0248a5a5dea6e1f0005aa08ecf8740robertphillips                        continue;
205e80eb928ba0248a5a5dea6e1f0005aa08ecf8740robertphillips                    }
2063c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
2073c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    SkAutoMaskFreeImage amfi(mask.fImage);
2083c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
2093c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    SkBitmap bm;
2103c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    bm.installMaskPixels(mask);
2113c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
2123c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    if (cur_x + bm.width() >= fGMWidth - fMargin) {
2133c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                        cur_x = 0;
2143c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                        cur_y += max_height + fPadding;
2153c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                        max_height = 0;
2163c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    }
2173c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
2183c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    canvas->save();
219793ddd994aae5a78b13fdbe24a6755085f7998cdcommit-bot@chromium.org                    canvas->translate((SkScalar)cur_x, (SkScalar)cur_y);
2203c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    canvas->translate(-(bm.width() - r.width())/2, -(bm.height()-r.height())/2);
22196fcdcc219d2a0d3579719b84b28bede76efba64halcanary                    canvas->drawBitmap(bm, 0.f, 0.f, nullptr);
2223c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    canvas->restore();
2233c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
2243c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    cur_x += bm.width() + fPadding;
2253c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    if (bm.height() > max_height)
2263c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                        max_height = bm.height();
2273c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                }
2283c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org            }
2293c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org        }
2302a24338c777462e04a2b26295f9c034155ee8f3ehalcanary}
2317c7292c6071898d73dc935c3b66b9816183806f0humper@google.com
232db87c960857a19555517c017e98804af7d9bf8c1reed@google.com//////////////////////////////////////////////////////////////////////////////
233db87c960857a19555517c017e98804af7d9bf8c1reed@google.com
2347cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.orgDEF_GM(return new BlurRectGM("blurrects", 0xFF);)
235