SampleBlur.cpp revision ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976e
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"
947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkBlurMaskFilter.h"
1047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkColorPriv.h"
1147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkGradientShader.h"
1247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkView.h"
1347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkCanvas.h"
1447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkUtils.h"
1547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com
1647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comstatic SkBitmap make_bitmap() {
1747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    SkBitmap bm;
1847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    SkColorTable* ctable = new SkColorTable(256);
1947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com
2047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    SkPMColor* c = ctable->lockColors();
2147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    for (int i = 0; i < 256; i++) {
2247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        c[i] = SkPackARGB32(255 - i, 0, 0, 0);
2347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    }
2447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    ctable->unlockColors(true);
2547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    bm.setConfig(SkBitmap::kIndex8_Config, 256, 256);
2647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    bm.allocPixels(ctable);
2747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    ctable->unref();
2847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com
2947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    bm.lockPixels();
3047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    const float cx = bm.width() * 0.5f;
3147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    const float cy = bm.height() * 0.5f;
3247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    for (int y = 0; y < bm.height(); y++) {
3347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        float dy = y - cy;
3447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        dy *= dy;
3547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        uint8_t* p = bm.getAddr8(0, y);
3647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        for (int x = 0; x < 256; x++) {
3747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com            float dx = x - cx;
3847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com            dx *= dx;
3947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com            float d = (dx + dy) / (cx/2);
4047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com            int id = (int)d;
4147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com            if (id > 255) {
4247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com                id = 255;
4347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com            }
4447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com            p[x] = id;
4547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        }
4647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    }
4747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    bm.unlockPixels();
4847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    return bm;
4947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com}
5047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com
51e36ddf01311802dd5c5fe85d47a9bd84b2b84565senorblanco@chromium.orgclass BlurView : public SampleView {
5247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    SkBitmap    fBM;
5347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.compublic:
5447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com	BlurView() {
5547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    }
560ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com
5747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comprotected:
5847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    // overrides from SkEventSink
5947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    virtual bool onQuery(SkEvent* evt) {
6047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        if (SampleCode::TitleQ(*evt)) {
6147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com            SampleCode::TitleR(evt, "Blur");
6247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com            return true;
6347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        }
6447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        return this->INHERITED::onQuery(evt);
6547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    }
660ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com
6747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    void drawBG(SkCanvas* canvas) {
6847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        canvas->drawColor(0xFFDDDDDD);
6947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    }
700ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com
71e36ddf01311802dd5c5fe85d47a9bd84b2b84565senorblanco@chromium.org    virtual void onDrawContent(SkCanvas* canvas) {
7247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        drawBG(canvas);
730ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com
74da449a38a2ac06f47f504cef7897afe322981daereed@android.com        SkBlurMaskFilter::BlurStyle NONE = SkBlurMaskFilter::BlurStyle(-999);
75da449a38a2ac06f47f504cef7897afe322981daereed@android.com        static const struct {
76da449a38a2ac06f47f504cef7897afe322981daereed@android.com            SkBlurMaskFilter::BlurStyle fStyle;
77da449a38a2ac06f47f504cef7897afe322981daereed@android.com            int                         fCx, fCy;
78da449a38a2ac06f47f504cef7897afe322981daereed@android.com        } gRecs[] = {
79da449a38a2ac06f47f504cef7897afe322981daereed@android.com            { NONE,                                 0,  0 },
80da449a38a2ac06f47f504cef7897afe322981daereed@android.com            { SkBlurMaskFilter::kInner_BlurStyle,  -1,  0 },
81da449a38a2ac06f47f504cef7897afe322981daereed@android.com            { SkBlurMaskFilter::kNormal_BlurStyle,  0,  1 },
82da449a38a2ac06f47f504cef7897afe322981daereed@android.com            { SkBlurMaskFilter::kSolid_BlurStyle,   0, -1 },
83da449a38a2ac06f47f504cef7897afe322981daereed@android.com            { SkBlurMaskFilter::kOuter_BlurStyle,   1,  0 },
84da449a38a2ac06f47f504cef7897afe322981daereed@android.com        };
8547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com
8647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        SkPaint paint;
8747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        paint.setAntiAlias(true);
880ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com        paint.setTextSize(25);
890ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com        canvas->translate(-40, 0);
90da449a38a2ac06f47f504cef7897afe322981daereed@android.com
910ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com        SkBlurMaskFilter::BlurFlags flags = SkBlurMaskFilter::kNone_BlurFlag;
920ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com        for (int j = 0; j < 2; j++) {
930ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com            canvas->save();
940ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com            paint.setColor(SK_ColorBLUE);
950ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com            for (size_t i = 0; i < SK_ARRAY_COUNT(gRecs); i++) {
960ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                if (gRecs[i].fStyle != NONE) {
970ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                    SkMaskFilter* mf = SkBlurMaskFilter::Create(20,
980ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                                                                gRecs[i].fStyle,
990ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                                                                flags);
1000ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                    paint.setMaskFilter(mf)->unref();
1010ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                } else {
1020ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                    paint.setMaskFilter(NULL);
1030ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                }
104261b8e2ca1cf22303ad95267f0bdc6e87e1bbe70reed@google.com                canvas->drawCircle(200 + gRecs[i].fCx*100.f,
105261b8e2ca1cf22303ad95267f0bdc6e87e1bbe70reed@google.com                                   200 + gRecs[i].fCy*100.f, 50, paint);
1060ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com            }
1070ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com            // draw text
1080ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com            {
1090ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                SkMaskFilter* mf = SkBlurMaskFilter::Create(4,
1100ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                                                            SkBlurMaskFilter::kNormal_BlurStyle,
1110ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                                                            flags);
112da449a38a2ac06f47f504cef7897afe322981daereed@android.com                paint.setMaskFilter(mf)->unref();
1130ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                SkScalar x = SkIntToScalar(70);
1140ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                SkScalar y = SkIntToScalar(400);
1150ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                paint.setColor(SK_ColorBLACK);
1160ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                canvas->drawText("Hamburgefons Style", 18, x, y, paint);
1170ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                canvas->drawText("Hamburgefons Style", 18, x, y + SkIntToScalar(50), paint);
118da449a38a2ac06f47f504cef7897afe322981daereed@android.com                paint.setMaskFilter(NULL);
1190ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                paint.setColor(SK_ColorWHITE);
1200ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                x -= SkIntToScalar(2);
1210ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                y -= SkIntToScalar(2);
1220ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                canvas->drawText("Hamburgefons Style", 18, x, y, paint);
123da449a38a2ac06f47f504cef7897afe322981daereed@android.com            }
1240ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com            canvas->restore();
12511a5ff376be94d15daf5bc66cdf857f5f2f297afreed@google.com            flags = SkBlurMaskFilter::kHighQuality_BlurFlag;
1260ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com            canvas->translate(350, 0);
127da449a38a2ac06f47f504cef7897afe322981daereed@android.com        }
12847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    }
1290ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com
13047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comprivate:
13147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    typedef SkView INHERITED;
13247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com};
13347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com
13447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com//////////////////////////////////////////////////////////////////////////////
13547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com
13647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comstatic SkView* MyFactory() { return new BlurView; }
13747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comstatic SkViewRegister reg(MyFactory);
13847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com
139