SampleBlur.cpp revision 261b8e2ca1cf22303ad95267f0bdc6e87e1bbe70
147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SampleCode.h"
247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkBlurMaskFilter.h"
347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkColorPriv.h"
447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkGradientShader.h"
547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkView.h"
647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkCanvas.h"
747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com#include "SkUtils.h"
847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com
947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comstatic SkBitmap make_bitmap() {
1047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    SkBitmap bm;
1147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    SkColorTable* ctable = new SkColorTable(256);
1247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com
1347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    SkPMColor* c = ctable->lockColors();
1447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    for (int i = 0; i < 256; i++) {
1547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        c[i] = SkPackARGB32(255 - i, 0, 0, 0);
1647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    }
1747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    ctable->unlockColors(true);
1847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    bm.setConfig(SkBitmap::kIndex8_Config, 256, 256);
1947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    bm.allocPixels(ctable);
2047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    ctable->unref();
2147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com
2247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    bm.lockPixels();
2347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    const float cx = bm.width() * 0.5f;
2447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    const float cy = bm.height() * 0.5f;
2547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    for (int y = 0; y < bm.height(); y++) {
2647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        float dy = y - cy;
2747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        dy *= dy;
2847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        uint8_t* p = bm.getAddr8(0, y);
2947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        for (int x = 0; x < 256; x++) {
3047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com            float dx = x - cx;
3147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com            dx *= dx;
3247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com            float d = (dx + dy) / (cx/2);
3347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com            int id = (int)d;
3447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com            if (id > 255) {
3547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com                id = 255;
3647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com            }
3747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com            p[x] = id;
3847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        }
3947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    }
4047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    bm.unlockPixels();
4147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    return bm;
4247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com}
4347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com
4447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comclass BlurView : public SkView {
4547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    SkBitmap    fBM;
4647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.compublic:
4747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com	BlurView() {
4847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    }
490ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com
5047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comprotected:
5147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    // overrides from SkEventSink
5247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    virtual bool onQuery(SkEvent* evt) {
5347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        if (SampleCode::TitleQ(*evt)) {
5447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com            SampleCode::TitleR(evt, "Blur");
5547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com            return true;
5647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        }
5747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        return this->INHERITED::onQuery(evt);
5847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    }
590ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com
6047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    void drawBG(SkCanvas* canvas) {
6147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        canvas->drawColor(0xFFDDDDDD);
6247ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    }
630ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com
6447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    virtual void onDraw(SkCanvas* canvas) {
6547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        drawBG(canvas);
660ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com
67da449a38a2ac06f47f504cef7897afe322981daereed@android.com        SkBlurMaskFilter::BlurStyle NONE = SkBlurMaskFilter::BlurStyle(-999);
68da449a38a2ac06f47f504cef7897afe322981daereed@android.com        static const struct {
69da449a38a2ac06f47f504cef7897afe322981daereed@android.com            SkBlurMaskFilter::BlurStyle fStyle;
70da449a38a2ac06f47f504cef7897afe322981daereed@android.com            int                         fCx, fCy;
71da449a38a2ac06f47f504cef7897afe322981daereed@android.com        } gRecs[] = {
72da449a38a2ac06f47f504cef7897afe322981daereed@android.com            { NONE,                                 0,  0 },
73da449a38a2ac06f47f504cef7897afe322981daereed@android.com            { SkBlurMaskFilter::kInner_BlurStyle,  -1,  0 },
74da449a38a2ac06f47f504cef7897afe322981daereed@android.com            { SkBlurMaskFilter::kNormal_BlurStyle,  0,  1 },
75da449a38a2ac06f47f504cef7897afe322981daereed@android.com            { SkBlurMaskFilter::kSolid_BlurStyle,   0, -1 },
76da449a38a2ac06f47f504cef7897afe322981daereed@android.com            { SkBlurMaskFilter::kOuter_BlurStyle,   1,  0 },
77da449a38a2ac06f47f504cef7897afe322981daereed@android.com        };
7847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com
7947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        SkPaint paint;
8047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com        paint.setAntiAlias(true);
810ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com        paint.setTextSize(25);
820ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com        canvas->translate(-40, 0);
83da449a38a2ac06f47f504cef7897afe322981daereed@android.com
840ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com        SkBlurMaskFilter::BlurFlags flags = SkBlurMaskFilter::kNone_BlurFlag;
850ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com        for (int j = 0; j < 2; j++) {
860ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com            canvas->save();
870ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com            paint.setColor(SK_ColorBLUE);
880ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com            for (size_t i = 0; i < SK_ARRAY_COUNT(gRecs); i++) {
890ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                if (gRecs[i].fStyle != NONE) {
900ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                    SkMaskFilter* mf = SkBlurMaskFilter::Create(20,
910ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                                                                gRecs[i].fStyle,
920ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                                                                flags);
930ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                    paint.setMaskFilter(mf)->unref();
940ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                } else {
950ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                    paint.setMaskFilter(NULL);
960ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                }
97261b8e2ca1cf22303ad95267f0bdc6e87e1bbe70reed@google.com                canvas->drawCircle(200 + gRecs[i].fCx*100.f,
98261b8e2ca1cf22303ad95267f0bdc6e87e1bbe70reed@google.com                                   200 + gRecs[i].fCy*100.f, 50, paint);
990ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com            }
1000ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com            // draw text
1010ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com            {
1020ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                SkMaskFilter* mf = SkBlurMaskFilter::Create(4,
1030ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                                                            SkBlurMaskFilter::kNormal_BlurStyle,
1040ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                                                            flags);
105da449a38a2ac06f47f504cef7897afe322981daereed@android.com                paint.setMaskFilter(mf)->unref();
1060ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                SkScalar x = SkIntToScalar(70);
1070ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                SkScalar y = SkIntToScalar(400);
1080ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                paint.setColor(SK_ColorBLACK);
1090ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                canvas->drawText("Hamburgefons Style", 18, x, y, paint);
1100ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                canvas->drawText("Hamburgefons Style", 18, x, y + SkIntToScalar(50), paint);
111da449a38a2ac06f47f504cef7897afe322981daereed@android.com                paint.setMaskFilter(NULL);
1120ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                paint.setColor(SK_ColorWHITE);
1130ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                x -= SkIntToScalar(2);
1140ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                y -= SkIntToScalar(2);
1150ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com                canvas->drawText("Hamburgefons Style", 18, x, y, paint);
116da449a38a2ac06f47f504cef7897afe322981daereed@android.com            }
1170ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com            canvas->restore();
11811a5ff376be94d15daf5bc66cdf857f5f2f297afreed@google.com            flags = SkBlurMaskFilter::kHighQuality_BlurFlag;
1190ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com            canvas->translate(350, 0);
120da449a38a2ac06f47f504cef7897afe322981daereed@android.com        }
12147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    }
1220ecc2b79db52ec0a709fb99653b5fc5d74a92126reed@google.com
12347ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comprivate:
12447ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com    typedef SkView INHERITED;
12547ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com};
12647ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com
12747ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com//////////////////////////////////////////////////////////////////////////////
12847ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com
12947ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comstatic SkView* MyFactory() { return new BlurView; }
13047ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.comstatic SkViewRegister reg(MyFactory);
13147ca036e29aa44f93d2300f5ed0109b3845d30d6reed@android.com
132