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
5853007a2b1724c15c170340658daac012f9d909bereed@google.comtypedef void (*PaintProc)(SkPaint*, SkScalar width);
5953007a2b1724c15c170340658daac012f9d909bereed@google.com
60db87c960857a19555517c017e98804af7d9bf8c1reed@google.comclass BlurRectGM : public skiagm::GM {
61e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org      SkAutoTUnref<SkMaskFilter> fMaskFilters[kLastEnum_SkBlurStyle + 1];
62a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com      SkString  fName;
63a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com      SkAlpha   fAlpha;
64db87c960857a19555517c017e98804af7d9bf8c1reed@google.compublic:
657cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org    BlurRectGM(const char name[], U8CPU alpha)
667cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org        : fName(name)
677cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org        , fAlpha(SkToU8(alpha)) {
6857850b9daddd941f880d94faaf83f2169355a0c8reed@google.com    }
69db87c960857a19555517c017e98804af7d9bf8c1reed@google.com
70db87c960857a19555517c017e98804af7d9bf8c1reed@google.comprotected:
717cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org    virtual void onOnceBeforeDraw() SK_OVERRIDE {
72e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org        for (int i = 0; i <= kLastEnum_SkBlurStyle; ++i) {
73e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org            fMaskFilters[i].reset(SkBlurMaskFilter::Create((SkBlurStyle)i,
747cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org                                  SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(STROKE_WIDTH/2)),
757cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org                                  SkBlurMaskFilter::kHighQuality_BlurFlag));
767cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org        }
777cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org    }
787cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org
79db87c960857a19555517c017e98804af7d9bf8c1reed@google.com    virtual SkString onShortName() {
8053007a2b1724c15c170340658daac012f9d909bereed@google.com        return fName;
81db87c960857a19555517c017e98804af7d9bf8c1reed@google.com    }
82db87c960857a19555517c017e98804af7d9bf8c1reed@google.com
83db87c960857a19555517c017e98804af7d9bf8c1reed@google.com    virtual SkISize onISize() {
847cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org        return SkISize::Make(440, 820);
85db87c960857a19555517c017e98804af7d9bf8c1reed@google.com    }
86db87c960857a19555517c017e98804af7d9bf8c1reed@google.com
87db87c960857a19555517c017e98804af7d9bf8c1reed@google.com    virtual void onDraw(SkCanvas* canvas) {
88db87c960857a19555517c017e98804af7d9bf8c1reed@google.com        canvas->translate(STROKE_WIDTH*3/2, STROKE_WIDTH*3/2);
89db87c960857a19555517c017e98804af7d9bf8c1reed@google.com
907cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org        SkRect  r = { 0, 0, 100, 50 };
917cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org        SkScalar scales[] = { SK_Scalar1, 0.6f };
928ccf590b89cec1a5974b6f4b7b49ca67cc5036cfskia.committer@gmail.com
937cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org        for (size_t s = 0; s < SK_ARRAY_COUNT(scales); ++s) {
947cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org            canvas->save();
957cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org            for (size_t f = 0; f < SK_ARRAY_COUNT(fMaskFilters); ++f) {
967cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org                SkPaint paint;
977cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org                paint.setMaskFilter(fMaskFilters[f]);
987cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org                paint.setAlpha(fAlpha);
997cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org
1007cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org                static const Proc procs[] = {
1017cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org                    fill_rect, draw_donut, draw_donut_skewed
1027cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org                };
103db87c960857a19555517c017e98804af7d9bf8c1reed@google.com
1047cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org                canvas->save();
1057cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org                canvas->scale(scales[s], scales[s]);
1067cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org                this->drawProcs(canvas, r, paint, false, procs, SK_ARRAY_COUNT(procs));
1077cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org                canvas->translate(r.width() * 4/3, 0);
1087cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org                this->drawProcs(canvas, r, paint, true, procs, SK_ARRAY_COUNT(procs));
1097cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org                canvas->restore();
110db87c960857a19555517c017e98804af7d9bf8c1reed@google.com
1117cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org                canvas->translate(0, SK_ARRAY_COUNT(procs) * r.height() * 4/3 * scales[s]);
1127cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org            }
1137cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org            canvas->restore();
1147cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org            canvas->translate(2 * r.width() * 4/3 * scales[s], 0);
1157cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.org        }
116db87c960857a19555517c017e98804af7d9bf8c1reed@google.com    }
117db87c960857a19555517c017e98804af7d9bf8c1reed@google.com
1187cdc1ee11545a10708e857adf1d4a94a2f1e2a48mtklein    virtual uint32_t onGetFlags() const { return kSkipPipe_Flag; }
119db87c960857a19555517c017e98804af7d9bf8c1reed@google.com
120db87c960857a19555517c017e98804af7d9bf8c1reed@google.comprivate:
121db87c960857a19555517c017e98804af7d9bf8c1reed@google.com    void drawProcs(SkCanvas* canvas, const SkRect& r, const SkPaint& paint,
122db87c960857a19555517c017e98804af7d9bf8c1reed@google.com                   bool doClip, const Proc procs[], size_t procsCount) {
123db87c960857a19555517c017e98804af7d9bf8c1reed@google.com        SkAutoCanvasRestore acr(canvas, true);
124db87c960857a19555517c017e98804af7d9bf8c1reed@google.com        for (size_t i = 0; i < procsCount; ++i) {
125db87c960857a19555517c017e98804af7d9bf8c1reed@google.com            if (doClip) {
126db87c960857a19555517c017e98804af7d9bf8c1reed@google.com                SkRect clipRect(r);
127db87c960857a19555517c017e98804af7d9bf8c1reed@google.com                clipRect.inset(STROKE_WIDTH/2, STROKE_WIDTH/2);
128db87c960857a19555517c017e98804af7d9bf8c1reed@google.com                canvas->save();
129db87c960857a19555517c017e98804af7d9bf8c1reed@google.com                canvas->clipRect(r);
130db87c960857a19555517c017e98804af7d9bf8c1reed@google.com            }
131db87c960857a19555517c017e98804af7d9bf8c1reed@google.com            procs[i](canvas, r, paint);
132db87c960857a19555517c017e98804af7d9bf8c1reed@google.com            if (doClip) {
133db87c960857a19555517c017e98804af7d9bf8c1reed@google.com                canvas->restore();
134db87c960857a19555517c017e98804af7d9bf8c1reed@google.com            }
135db87c960857a19555517c017e98804af7d9bf8c1reed@google.com            canvas->translate(0, r.height() * 4/3);
136db87c960857a19555517c017e98804af7d9bf8c1reed@google.com        }
137db87c960857a19555517c017e98804af7d9bf8c1reed@google.com    }
138a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.comprivate:
139db87c960857a19555517c017e98804af7d9bf8c1reed@google.com    typedef GM INHERITED;
140db87c960857a19555517c017e98804af7d9bf8c1reed@google.com};
141db87c960857a19555517c017e98804af7d9bf8c1reed@google.com
1423c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
1433c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.orgclass BlurRectDirectGM : public skiagm::GM {
1443c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org    SkString  fName;
1453c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org    int fGMWidth, fGMHeight;
1463c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org    int fPadding, fMargin;
1473c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.orgpublic:
1483c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org    BlurRectDirectGM(const char name[])
1493c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org        : fName(name),
1503c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org          fGMWidth(1200),
1513c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org          fGMHeight(1024),
1523c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org          fPadding(10),
1533c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org          fMargin(100)
1543c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org    {
1553c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org    }
1563c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
1573c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.orgprotected:
1583c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org    virtual SkString onShortName() {
1593c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org        return fName;
1603c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org    }
1613c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
1623c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org    virtual SkISize onISize() {
1633c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org        return SkISize::Make(fGMWidth, fGMHeight);
1643c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org    }
1653c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
1663c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org    virtual void onDraw(SkCanvas* canvas) {
1673c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org        const int widths[] = {25, 5, 5, 100, 150, 25};
1683c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org        const int heights[] = {100, 100, 5, 25, 150, 25};
1693c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org        const SkBlurStyle styles[] = {kNormal_SkBlurStyle, kInner_SkBlurStyle, kOuter_SkBlurStyle};
1703c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org        const float radii[] = {20, 5, 10};
1713c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
1723c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org        canvas->translate(50,20);
1733c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
1743c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org        int cur_x = 0;
1753c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org        int cur_y = 0;
1763c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
1773c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org        int max_height = 0;
1783c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
1793c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org        for (size_t i = 0 ; i < SK_ARRAY_COUNT(widths) ; i++) {
1803c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org            int width = widths[i];
1813c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org            int height = heights[i];
1823c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org            SkRect r;
1833c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org            r.setWH(SkIntToScalar(width), SkIntToScalar(height));
1843c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org            SkAutoCanvasRestore autoRestore(canvas, true);
1853c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
1863c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org            for (size_t j = 0 ; j < SK_ARRAY_COUNT(radii) ; j++) {
1873c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                float radius = radii[j];
1883c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                for (size_t k = 0 ; k < SK_ARRAY_COUNT(styles) ; k++) {
1893c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    SkBlurStyle style = styles[k];
1903c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
1913c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    SkMask mask;
1923c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    SkBlurMask::BlurRect(SkBlurMask::ConvertRadiusToSigma(radius), &mask, r, style);
1933c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
1943c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    SkAutoMaskFreeImage amfi(mask.fImage);
1953c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
1963c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    SkBitmap bm;
1973c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    bm.installMaskPixels(mask);
1983c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
1993c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    if (cur_x + bm.width() >= fGMWidth - fMargin) {
2003c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                        cur_x = 0;
2013c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                        cur_y += max_height + fPadding;
2023c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                        max_height = 0;
2033c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    }
2043c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
2053c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    canvas->save();
206793ddd994aae5a78b13fdbe24a6755085f7998cdcommit-bot@chromium.org                    canvas->translate((SkScalar)cur_x, (SkScalar)cur_y);
2073c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    canvas->translate(-(bm.width() - r.width())/2, -(bm.height()-r.height())/2);
2083c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    canvas->drawBitmap(bm, 0.f, 0.f, NULL);
2093c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    canvas->restore();
2103c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
2113c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    cur_x += bm.width() + fPadding;
2123c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                    if (bm.height() > max_height)
2133c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                        max_height = bm.height();
2143c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org                }
2153c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org            }
2163c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org        }
2173c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org    }
2183c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
2193c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org    virtual uint32_t onGetFlags() const { return kSkipPipe_Flag; }
2203c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
2213c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.orgprivate:
2223c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org    typedef GM INHERITED;
2233c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org};
2243c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.org
2257c7292c6071898d73dc935c3b66b9816183806f0humper@google.comclass BlurRectCompareGM : public skiagm::GM {
2267c7292c6071898d73dc935c3b66b9816183806f0humper@google.com    SkString  fName;
2277c7292c6071898d73dc935c3b66b9816183806f0humper@google.com    unsigned int fRectWidth, fRectHeight;
228140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com    SkScalar fRadius;
229e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org    SkBlurStyle fStyle;
2307c7292c6071898d73dc935c3b66b9816183806f0humper@google.compublic:
231b3ec29d2d81ae391e433fbdf8aabc791e426ee38skia.committer@gmail.com    BlurRectCompareGM(const char name[], unsigned int rectWidth,
232b3ec29d2d81ae391e433fbdf8aabc791e426ee38skia.committer@gmail.com                      unsigned int rectHeight, float radius,
233e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org                      SkBlurStyle style)
23433cdbdea3ddcec9323b65eace86e10557312ae9bbsalomon@google.com        : fName(name)
23533cdbdea3ddcec9323b65eace86e10557312ae9bbsalomon@google.com        , fRectWidth(rectWidth)
23633cdbdea3ddcec9323b65eace86e10557312ae9bbsalomon@google.com        , fRectHeight(rectHeight)
23733cdbdea3ddcec9323b65eace86e10557312ae9bbsalomon@google.com        , fRadius(radius)
238b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com        , fStyle(style) {
239b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com    }
240d454ec135eeef48edea7ebc47a61ff39bd654576skia.committer@gmail.com    int width() const {
241d454ec135eeef48edea7ebc47a61ff39bd654576skia.committer@gmail.com        return fRectWidth;
242a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com    }
243d454ec135eeef48edea7ebc47a61ff39bd654576skia.committer@gmail.com    int height() const {
244d454ec135eeef48edea7ebc47a61ff39bd654576skia.committer@gmail.com        return fRectHeight;
245a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com    }
246d454ec135eeef48edea7ebc47a61ff39bd654576skia.committer@gmail.com    SkScalar radius() const {
247d454ec135eeef48edea7ebc47a61ff39bd654576skia.committer@gmail.com        return fRadius;
248a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com    }
249e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org    SkBlurStyle style() const {
250d454ec135eeef48edea7ebc47a61ff39bd654576skia.committer@gmail.com        return fStyle;
251a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com    }
2527c7292c6071898d73dc935c3b66b9816183806f0humper@google.com
2537c7292c6071898d73dc935c3b66b9816183806f0humper@google.comprotected:
2547c7292c6071898d73dc935c3b66b9816183806f0humper@google.com    virtual SkString onShortName() {
2557c7292c6071898d73dc935c3b66b9816183806f0humper@google.com        return fName;
2567c7292c6071898d73dc935c3b66b9816183806f0humper@google.com    }
2577c7292c6071898d73dc935c3b66b9816183806f0humper@google.com
2587c7292c6071898d73dc935c3b66b9816183806f0humper@google.com    virtual SkISize onISize() {
2597c7292c6071898d73dc935c3b66b9816183806f0humper@google.com        return SkISize::Make(640, 480);
2607c7292c6071898d73dc935c3b66b9816183806f0humper@google.com    }
2618ae714b186ae5f4eaddee239281fbfe7282320c9skia.committer@gmail.com
262a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com    virtual bool makeMask(SkMask *m, const SkRect&) = 0;
2637c7292c6071898d73dc935c3b66b9816183806f0humper@google.com
2647c7292c6071898d73dc935c3b66b9816183806f0humper@google.com    virtual void onDraw(SkCanvas* canvas) {
265a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        SkRect r;
266a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        r.setWH(SkIntToScalar(fRectWidth), SkIntToScalar(fRectHeight));
267a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com
268a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        SkISize canvas_size = canvas->getDeviceSize();
269d98df1a3c468a2a7a5fff5efbf6dbdaf077d1abejvanverth@google.com        int center_x = (canvas_size.fWidth - (int)(r.width()))/2;
270d98df1a3c468a2a7a5fff5efbf6dbdaf077d1abejvanverth@google.com        int center_y = (canvas_size.fHeight - (int)(r.height()))/2;
271a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com
272a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        SkMask mask;
273a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com
274a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        if (!this->makeMask(&mask, r)) {
275a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com            SkPaint paint;
276d98df1a3c468a2a7a5fff5efbf6dbdaf077d1abejvanverth@google.com            r.offset( SkIntToScalar(center_x), SkIntToScalar(center_y) );
277a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com            canvas->drawRect(r,paint);
278a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com            return;
279a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        }
280a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        SkAutoMaskFreeImage amfi(mask.fImage);
2817c7292c6071898d73dc935c3b66b9816183806f0humper@google.com
282a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        SkBitmap bm;
283dac522589e9395b4654a1a708f1bd971f37f95a5commit-bot@chromium.org        bm.installMaskPixels(mask);
2847c7292c6071898d73dc935c3b66b9816183806f0humper@google.com
285a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        center_x = (canvas_size.fWidth - mask.fBounds.width())/2;
286a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        center_y = (canvas_size.fHeight - mask.fBounds.height())/2;
2877c7292c6071898d73dc935c3b66b9816183806f0humper@google.com
288d98df1a3c468a2a7a5fff5efbf6dbdaf077d1abejvanverth@google.com        canvas->drawBitmap(bm, SkIntToScalar(center_x), SkIntToScalar(center_y), NULL);
2897c7292c6071898d73dc935c3b66b9816183806f0humper@google.com    }
2907c7292c6071898d73dc935c3b66b9816183806f0humper@google.com
2917c7292c6071898d73dc935c3b66b9816183806f0humper@google.com    virtual uint32_t onGetFlags() const { return kSkipPipe_Flag; }
2927c7292c6071898d73dc935c3b66b9816183806f0humper@google.com
2937c7292c6071898d73dc935c3b66b9816183806f0humper@google.comprivate:
2947c7292c6071898d73dc935c3b66b9816183806f0humper@google.com    typedef GM INHERITED;
2957c7292c6071898d73dc935c3b66b9816183806f0humper@google.com};
2967c7292c6071898d73dc935c3b66b9816183806f0humper@google.com
2977c7292c6071898d73dc935c3b66b9816183806f0humper@google.comclass BlurRectFastGM: public BlurRectCompareGM {
2987c7292c6071898d73dc935c3b66b9816183806f0humper@google.compublic:
2997ce661d19c5cf4484305a1b20c44bd111f129847robertphillips@google.com    BlurRectFastGM(const char name[], unsigned int rectWidth,
3007ce661d19c5cf4484305a1b20c44bd111f129847robertphillips@google.com                   unsigned int rectHeight, float blurRadius,
301e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org                   SkBlurStyle style) :
3027ce661d19c5cf4484305a1b20c44bd111f129847robertphillips@google.com        INHERITED(name, rectWidth, rectHeight, blurRadius, style) {
303a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        }
3047ce661d19c5cf4484305a1b20c44bd111f129847robertphillips@google.com
3057c7292c6071898d73dc935c3b66b9816183806f0humper@google.comprotected:
306a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com    virtual bool makeMask(SkMask *m, const SkRect& r) SK_OVERRIDE {
307b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com        return SkBlurMask::BlurRect(SkBlurMask::ConvertRadiusToSigma(this->radius()),
308b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com                                    m, r, this->style());
309140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com    }
310a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.comprivate:
311a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com    typedef BlurRectCompareGM INHERITED;
3127c7292c6071898d73dc935c3b66b9816183806f0humper@google.com};
3137c7292c6071898d73dc935c3b66b9816183806f0humper@google.com
3147c7292c6071898d73dc935c3b66b9816183806f0humper@google.comclass BlurRectSlowGM: public BlurRectCompareGM {
3157c7292c6071898d73dc935c3b66b9816183806f0humper@google.compublic:
316b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com    BlurRectSlowGM(const char name[], unsigned int rectWidth, unsigned int rectHeight,
317e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org                   float blurRadius, SkBlurStyle style)
318b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com        : INHERITED(name, rectWidth, rectHeight, blurRadius, style) {
319a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        }
320b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com
3217c7292c6071898d73dc935c3b66b9816183806f0humper@google.comprotected:
322a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com    virtual bool makeMask(SkMask *m, const SkRect& r) SK_OVERRIDE {
323140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com        SkMask src;
324140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com        r.roundOut(&src.fBounds);
325140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com        src.fBounds.offset(-src.fBounds.fLeft, -src.fBounds.fTop);  // move to origin
326140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com        src.fFormat = SkMask::kA8_Format;
327140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com        src.fRowBytes = src.fBounds.width();
328a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        src.fImage = SkMask::AllocImage(src.computeTotalImageSize());
32933cdbdea3ddcec9323b65eace86e10557312ae9bbsalomon@google.com        SkAutoMaskFreeImage amfi(src.fImage);
3307c7292c6071898d73dc935c3b66b9816183806f0humper@google.com
33133cdbdea3ddcec9323b65eace86e10557312ae9bbsalomon@google.com        memset(src.fImage, 0xff, src.computeTotalImageSize());
3327c7292c6071898d73dc935c3b66b9816183806f0humper@google.com
333b3ec29d2d81ae391e433fbdf8aabc791e426ee38skia.committer@gmail.com        return SkBlurMask::BoxBlur(m, src,
334b3ec29d2d81ae391e433fbdf8aabc791e426ee38skia.committer@gmail.com                                   SkBlurMask::ConvertRadiusToSigma(this->radius()),
335b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com                                   this->style(), this->getQuality());
336140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com    }
337a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com
338e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org    virtual SkBlurQuality getQuality() {
339e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org        return kHigh_SkBlurQuality;
340a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com    }
341a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.comprivate:
342a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com    typedef BlurRectCompareGM INHERITED;
343a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com};
344a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com
345a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.comclass BlurRectSlowLowGM: public BlurRectSlowGM {
346a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.compublic:
347d454ec135eeef48edea7ebc47a61ff39bd654576skia.committer@gmail.com    BlurRectSlowLowGM(const char name[], unsigned int rectWidth, unsigned int rectHeight,
348e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org                      float blurRadius, SkBlurStyle style)
349b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com        : INHERITED(name, rectWidth, rectHeight, blurRadius, style) {
350a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        }
351b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com
352a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.comprotected:
353e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org    virtual SkBlurQuality getQuality() SK_OVERRIDE {
354e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org        return kLow_SkBlurQuality;
355a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com    }
356a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.comprivate:
357a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com    typedef BlurRectSlowGM INHERITED;
358a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com};
359a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com
360a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.comclass BlurRectGroundTruthGM: public BlurRectCompareGM {
361a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.compublic:
362d454ec135eeef48edea7ebc47a61ff39bd654576skia.committer@gmail.com    BlurRectGroundTruthGM(const char name[], unsigned int rectWidth, unsigned int rectHeight,
363e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org                          float blurRadius, SkBlurStyle style)
364b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com        : INHERITED(name, rectWidth, rectHeight, blurRadius, style) {
365a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        }
366b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com
367a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.comprotected:
368a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com    virtual bool makeMask(SkMask *m, const SkRect& r) SK_OVERRIDE {
369a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        SkMask src;
370a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        r.roundOut(&src.fBounds);
371a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        src.fBounds.offset(-src.fBounds.fLeft, -src.fBounds.fTop);  // move to origin
372a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        src.fFormat = SkMask::kA8_Format;
373a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        src.fRowBytes = src.fBounds.width();
374a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        src.fImage = SkMask::AllocImage(src.computeTotalImageSize());
375a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        SkAutoMaskFreeImage amfi(src.fImage);
376a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com
377a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com        memset(src.fImage, 0xff, src.computeTotalImageSize());
378a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com
379b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com        return SkBlurMask::BlurGroundTruth(SkBlurMask::ConvertRadiusToSigma(this->radius()),
380b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com                                           m, src, this->style());
381a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com    }
382a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com
383e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org    virtual SkBlurQuality getQuality() {
384e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org        return kHigh_SkBlurQuality;
385a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com    }
386a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.comprivate:
387a99a92cebaa46cf792cf86eaad1a4c3f9d6162f7humper@google.com    typedef BlurRectCompareGM INHERITED;
3887c7292c6071898d73dc935c3b66b9816183806f0humper@google.com};
3897c7292c6071898d73dc935c3b66b9816183806f0humper@google.com
3907c7292c6071898d73dc935c3b66b9816183806f0humper@google.com
391db87c960857a19555517c017e98804af7d9bf8c1reed@google.com//////////////////////////////////////////////////////////////////////////////
392db87c960857a19555517c017e98804af7d9bf8c1reed@google.com
3937cced56550caf1607f7058e229e06465b641482bcommit-bot@chromium.orgDEF_GM(return new BlurRectGM("blurrects", 0xFF);)
3943c1594aacbd20c4583db300fc66e3c227bec4f6ccommit-bot@chromium.orgDEF_GM(return new BlurRectDirectGM("blurrect_gallery");)
395