1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SampleCode.h"
8b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkBlurMask.h"
947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkBlurMaskFilter.h"
10b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkCanvas.h"
1147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkColorPriv.h"
1247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkGradientShader.h"
1347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkUtils.h"
14b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkView.h"
1547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com
1647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comstatic SkBitmap make_bitmap() {
170a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com    SkPMColor c[256];
1847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    for (int i = 0; i < 256; i++) {
1947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        c[i] = SkPackARGB32(255 - i, 0, 0, 0);
2047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    }
210a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com
220a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com    SkBitmap bm;
230a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com    SkColorTable* ctable = new SkColorTable(c, 256);
240a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com
25a8c183125f2861067daf432cada06d431a795cd0commit-bot@chromium.org    bm.allocPixels(SkImageInfo::Make(256, 256, kIndex_8_SkColorType,
26a8c183125f2861067daf432cada06d431a795cd0commit-bot@chromium.org                                     kPremul_SkAlphaType),
2796fcdcc219d2a0d3579719b84b28bede76efba64halcanary                   nullptr, ctable);
2847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    ctable->unref();
2947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com
3047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    bm.lockPixels();
3147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    const float cx = bm.width() * 0.5f;
3247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    const float cy = bm.height() * 0.5f;
3347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    for (int y = 0; y < bm.height(); y++) {
3447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        float dy = y - cy;
3547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        dy *= dy;
3647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        uint8_t* p = bm.getAddr8(0, y);
3747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        for (int x = 0; x < 256; x++) {
3847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com            float dx = x - cx;
3947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com            dx *= dx;
4047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com            float d = (dx + dy) / (cx/2);
4147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com            int id = (int)d;
4247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com            if (id > 255) {
4347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com                id = 255;
4447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com            }
4547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com            p[x] = id;
4647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        }
4747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    }
4847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    bm.unlockPixels();
4947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    return bm;
5047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com}
5147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com
52e36ddf01311802dd5c5fe85d47a9bd84b2b84565senorblanco@chromium.orgclass BlurView : public SampleView {
5347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    SkBitmap    fBM;
5447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.compublic:
55ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com    BlurView() {
5602939ce4bddd3223d9e8cc98d4abd02939b7f70acaryclark@google.com        if (false) { // avoid bit rot, suppress warning
5702939ce4bddd3223d9e8cc98d4abd02939b7f70acaryclark@google.com            fBM = make_bitmap();
5802939ce4bddd3223d9e8cc98d4abd02939b7f70acaryclark@google.com        }
5947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    }
600ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com
6147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comprotected:
6247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    // overrides from SkEventSink
6347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    virtual bool onQuery(SkEvent* evt) {
6447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        if (SampleCode::TitleQ(*evt)) {
6547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com            SampleCode::TitleR(evt, "Blur");
6647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com            return true;
6747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        }
6847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        return this->INHERITED::onQuery(evt);
6947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    }
700ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com
7147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    void drawBG(SkCanvas* canvas) {
7247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        canvas->drawColor(0xFFDDDDDD);
7347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    }
740ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com
75e36ddf01311802dd5c5fe85d47a9bd84b2b84565senorblanco@chromium.org    virtual void onDrawContent(SkCanvas* canvas) {
7647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        drawBG(canvas);
770ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com
78e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org        SkBlurStyle NONE = SkBlurStyle(-999);
79da449a38a2ac06f47f504cef7897afe322981daereed@android.com        static const struct {
80e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org            SkBlurStyle fStyle;
81e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org            int         fCx, fCy;
82da449a38a2ac06f47f504cef7897afe322981daereed@android.com        } gRecs[] = {
83da449a38a2ac06f47f504cef7897afe322981daereed@android.com            { NONE,                                 0,  0 },
84e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org            { kInner_SkBlurStyle,  -1,  0 },
85e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org            { kNormal_SkBlurStyle,  0,  1 },
86e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org            { kSolid_SkBlurStyle,   0, -1 },
87e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org            { kOuter_SkBlurStyle,   1,  0 },
88da449a38a2ac06f47f504cef7897afe322981daereed@android.com        };
8947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com
9047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        SkPaint paint;
9147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        paint.setAntiAlias(true);
920ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com        paint.setTextSize(25);
930ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com        canvas->translate(-40, 0);
94da449a38a2ac06f47f504cef7897afe322981daereed@android.com
950ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com        SkBlurMaskFilter::BlurFlags flags = SkBlurMaskFilter::kNone_BlurFlag;
960ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com        for (int j = 0; j < 2; j++) {
970ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com            canvas->save();
980ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com            paint.setColor(SK_ColorBLUE);
990ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com            for (size_t i = 0; i < SK_ARRAY_COUNT(gRecs); i++) {
1000ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                if (gRecs[i].fStyle != NONE) {
101efdfd51b68a300d5c6e28743fe0344ca05d1cec9reed                    paint.setMaskFilter(SkBlurMaskFilter::Make(gRecs[i].fStyle,
102b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com                                      SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(20)),
103efdfd51b68a300d5c6e28743fe0344ca05d1cec9reed                                      flags));
1040ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                } else {
10596fcdcc219d2a0d3579719b84b28bede76efba64halcanary                    paint.setMaskFilter(nullptr);
1060ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                }
107261b8e2ca1cf22303ad95267f0bdc6e87e1bbe70reed@google.com                canvas->drawCircle(200 + gRecs[i].fCx*100.f,
108261b8e2ca1cf22303ad95267f0bdc6e87e1bbe70reed@google.com                                   200 + gRecs[i].fCy*100.f, 50, paint);
1090ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com            }
1100ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com            // draw text
1110ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com            {
112efdfd51b68a300d5c6e28743fe0344ca05d1cec9reed                paint.setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle,
113efdfd51b68a300d5c6e28743fe0344ca05d1cec9reed                                                           SkBlurMask::ConvertRadiusToSigma(4),
114efdfd51b68a300d5c6e28743fe0344ca05d1cec9reed                                                           flags));
1150ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                SkScalar x = SkIntToScalar(70);
1160ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                SkScalar y = SkIntToScalar(400);
1170ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                paint.setColor(SK_ColorBLACK);
1180ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                canvas->drawText("Hamburgefons Style", 18, x, y, paint);
1190ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                canvas->drawText("Hamburgefons Style", 18, x, y + SkIntToScalar(50), paint);
12096fcdcc219d2a0d3579719b84b28bede76efba64halcanary                paint.setMaskFilter(nullptr);
1210ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                paint.setColor(SK_ColorWHITE);
1220ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                x -= SkIntToScalar(2);
1230ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                y -= SkIntToScalar(2);
1240ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                canvas->drawText("Hamburgefons Style", 18, x, y, paint);
125da449a38a2ac06f47f504cef7897afe322981daereed@android.com            }
1260ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com            canvas->restore();
12711a5ff376be94d15daf5bc66cdf857f5f2f297afreed@google.com            flags = SkBlurMaskFilter::kHighQuality_BlurFlag;
1280ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com            canvas->translate(350, 0);
129da449a38a2ac06f47f504cef7897afe322981daereed@android.com        }
13047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    }
1310ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com
13247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comprivate:
13347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    typedef SkView INHERITED;
13447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com};
13547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com
13647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com//////////////////////////////////////////////////////////////////////////////
13747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com
13847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comstatic SkView* MyFactory() { return new BlurView; }
13947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comstatic SkViewRegister reg(MyFactory);
140