1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SampleCode.h"
9b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkBlurMask.h"
1047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkBlurMaskFilter.h"
11b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkCanvas.h"
1247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkColorPriv.h"
1347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkGradientShader.h"
1447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkUtils.h"
15b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkView.h"
1647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com
1747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comstatic SkBitmap make_bitmap() {
180a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com    SkPMColor c[256];
1947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    for (int i = 0; i < 256; i++) {
2047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        c[i] = SkPackARGB32(255 - i, 0, 0, 0);
2147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    }
220a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com
230a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com    SkBitmap bm;
240a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com    SkColorTable* ctable = new SkColorTable(c, 256);
250a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com
26a8c183125f2861067daf432cada06d431a795cd0commit-bot@chromium.org    bm.allocPixels(SkImageInfo::Make(256, 256, kIndex_8_SkColorType,
27a8c183125f2861067daf432cada06d431a795cd0commit-bot@chromium.org                                     kPremul_SkAlphaType),
28a8c183125f2861067daf432cada06d431a795cd0commit-bot@chromium.org                   NULL, ctable);
2947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    ctable->unref();
3047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com
3147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    bm.lockPixels();
3247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    const float cx = bm.width() * 0.5f;
3347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    const float cy = bm.height() * 0.5f;
3447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    for (int y = 0; y < bm.height(); y++) {
3547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        float dy = y - cy;
3647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        dy *= dy;
3747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        uint8_t* p = bm.getAddr8(0, y);
3847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        for (int x = 0; x < 256; x++) {
3947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com            float dx = x - cx;
4047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com            dx *= dx;
4147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com            float d = (dx + dy) / (cx/2);
4247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com            int id = (int)d;
4347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com            if (id > 255) {
4447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com                id = 255;
4547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com            }
4647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com            p[x] = id;
4747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        }
4847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    }
4947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    bm.unlockPixels();
5047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    return bm;
5147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com}
5247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com
53e36ddf01311802dd5c5fe85d47a9bd84b2b84565senorblanco@chromium.orgclass BlurView : public SampleView {
5447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    SkBitmap    fBM;
5547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.compublic:
56ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com    BlurView() {
5702939ce4bddd3223d9e8cc98d4abd02939b7f70acaryclark@google.com        if (false) { // avoid bit rot, suppress warning
5802939ce4bddd3223d9e8cc98d4abd02939b7f70acaryclark@google.com            fBM = make_bitmap();
5902939ce4bddd3223d9e8cc98d4abd02939b7f70acaryclark@google.com        }
6047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    }
610ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com
6247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comprotected:
6347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    // overrides from SkEventSink
6447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    virtual bool onQuery(SkEvent* evt) {
6547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        if (SampleCode::TitleQ(*evt)) {
6647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com            SampleCode::TitleR(evt, "Blur");
6747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com            return true;
6847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        }
6947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        return this->INHERITED::onQuery(evt);
7047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    }
710ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com
7247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    void drawBG(SkCanvas* canvas) {
7347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        canvas->drawColor(0xFFDDDDDD);
7447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    }
750ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com
76e36ddf01311802dd5c5fe85d47a9bd84b2b84565senorblanco@chromium.org    virtual void onDrawContent(SkCanvas* canvas) {
7747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        drawBG(canvas);
780ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com
79e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org        SkBlurStyle NONE = SkBlurStyle(-999);
80da449a38a2ac06f47f504cef7897afe322981daereed@android.com        static const struct {
81e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org            SkBlurStyle fStyle;
82e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org            int         fCx, fCy;
83da449a38a2ac06f47f504cef7897afe322981daereed@android.com        } gRecs[] = {
84da449a38a2ac06f47f504cef7897afe322981daereed@android.com            { NONE,                                 0,  0 },
85e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org            { kInner_SkBlurStyle,  -1,  0 },
86e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org            { kNormal_SkBlurStyle,  0,  1 },
87e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org            { kSolid_SkBlurStyle,   0, -1 },
88e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org            { kOuter_SkBlurStyle,   1,  0 },
89da449a38a2ac06f47f504cef7897afe322981daereed@android.com        };
9047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com
9147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        SkPaint paint;
9247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        paint.setAntiAlias(true);
930ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com        paint.setTextSize(25);
940ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com        canvas->translate(-40, 0);
95da449a38a2ac06f47f504cef7897afe322981daereed@android.com
960ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com        SkBlurMaskFilter::BlurFlags flags = SkBlurMaskFilter::kNone_BlurFlag;
970ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com        for (int j = 0; j < 2; j++) {
980ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com            canvas->save();
990ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com            paint.setColor(SK_ColorBLUE);
1000ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com            for (size_t i = 0; i < SK_ARRAY_COUNT(gRecs); i++) {
1010ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                if (gRecs[i].fStyle != NONE) {
102b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com                    SkMaskFilter* mf = SkBlurMaskFilter::Create(gRecs[i].fStyle,
103b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com                                      SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(20)),
104b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com                                      flags);
1050ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                    paint.setMaskFilter(mf)->unref();
1060ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                } else {
1070ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                    paint.setMaskFilter(NULL);
1080ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                }
109261b8e2ca1cf22303ad95267f0bdc6e87e1bbe70reed@google.com                canvas->drawCircle(200 + gRecs[i].fCx*100.f,
110261b8e2ca1cf22303ad95267f0bdc6e87e1bbe70reed@google.com                                   200 + gRecs[i].fCy*100.f, 50, paint);
1110ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com            }
1120ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com            // draw text
1130ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com            {
114e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org                SkMaskFilter* mf = SkBlurMaskFilter::Create(kNormal_SkBlurStyle,
115b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com                                      SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(4)),
116b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com                                      flags);
117da449a38a2ac06f47f504cef7897afe322981daereed@android.com                paint.setMaskFilter(mf)->unref();
1180ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                SkScalar x = SkIntToScalar(70);
1190ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                SkScalar y = SkIntToScalar(400);
1200ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                paint.setColor(SK_ColorBLACK);
1210ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                canvas->drawText("Hamburgefons Style", 18, x, y, paint);
1220ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                canvas->drawText("Hamburgefons Style", 18, x, y + SkIntToScalar(50), paint);
123da449a38a2ac06f47f504cef7897afe322981daereed@android.com                paint.setMaskFilter(NULL);
1240ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                paint.setColor(SK_ColorWHITE);
1250ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                x -= SkIntToScalar(2);
1260ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                y -= SkIntToScalar(2);
1270ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                canvas->drawText("Hamburgefons Style", 18, x, y, paint);
128da449a38a2ac06f47f504cef7897afe322981daereed@android.com            }
1290ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com            canvas->restore();
13011a5ff376be94d15daf5bc66cdf857f5f2f297afreed@google.com            flags = SkBlurMaskFilter::kHighQuality_BlurFlag;
1310ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com            canvas->translate(350, 0);
132da449a38a2ac06f47f504cef7897afe322981daereed@android.com        }
13347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    }
1340ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com
13547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comprivate:
13647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    typedef SkView INHERITED;
13747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com};
13847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com
13947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com//////////////////////////////////////////////////////////////////////////////
14047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com
14147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comstatic SkView* MyFactory() { return new BlurView; }
14247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comstatic SkViewRegister reg(MyFactory);
143