1#include "SampleCode.h"
2#include "SkBlurMaskFilter.h"
3#include "SkColorPriv.h"
4#include "SkGradientShader.h"
5#include "SkView.h"
6#include "SkCanvas.h"
7#include "SkUtils.h"
8
9static SkBitmap make_bitmap() {
10    SkBitmap bm;
11    SkColorTable* ctable = new SkColorTable(256);
12
13    SkPMColor* c = ctable->lockColors();
14    for (int i = 0; i < 256; i++) {
15        c[i] = SkPackARGB32(255 - i, 0, 0, 0);
16    }
17    ctable->unlockColors(true);
18    bm.setConfig(SkBitmap::kIndex8_Config, 256, 256);
19    bm.allocPixels(ctable);
20    ctable->unref();
21
22    bm.lockPixels();
23    const float cx = bm.width() * 0.5f;
24    const float cy = bm.height() * 0.5f;
25    for (int y = 0; y < bm.height(); y++) {
26        float dy = y - cy;
27        dy *= dy;
28        uint8_t* p = bm.getAddr8(0, y);
29        for (int x = 0; x < 256; x++) {
30            float dx = x - cx;
31            dx *= dx;
32            float d = (dx + dy) / (cx/2);
33            int id = (int)d;
34            if (id > 255) {
35                id = 255;
36            }
37            p[x] = id;
38        }
39    }
40    bm.unlockPixels();
41    return bm;
42}
43
44class BlurView : public SkView {
45    SkBitmap    fBM;
46public:
47	BlurView() {
48    }
49
50protected:
51    // overrides from SkEventSink
52    virtual bool onQuery(SkEvent* evt) {
53        if (SampleCode::TitleQ(*evt)) {
54            SampleCode::TitleR(evt, "Blur");
55            return true;
56        }
57        return this->INHERITED::onQuery(evt);
58    }
59
60    void drawBG(SkCanvas* canvas) {
61        canvas->drawColor(0xFFDDDDDD);
62    }
63
64    virtual void onDraw(SkCanvas* canvas) {
65        drawBG(canvas);
66
67        SkBlurMaskFilter::BlurStyle NONE = SkBlurMaskFilter::BlurStyle(-999);
68        static const struct {
69            SkBlurMaskFilter::BlurStyle fStyle;
70            int                         fCx, fCy;
71        } gRecs[] = {
72            { NONE,                                 0,  0 },
73            { SkBlurMaskFilter::kInner_BlurStyle,  -1,  0 },
74            { SkBlurMaskFilter::kNormal_BlurStyle,  0,  1 },
75            { SkBlurMaskFilter::kSolid_BlurStyle,   0, -1 },
76            { SkBlurMaskFilter::kOuter_BlurStyle,   1,  0 },
77        };
78
79        SkPaint paint;
80        paint.setAntiAlias(true);
81        paint.setTextSize(25);
82        canvas->translate(-40, 0);
83
84        SkBlurMaskFilter::BlurFlags flags = SkBlurMaskFilter::kNone_BlurFlag;
85        for (int j = 0; j < 2; j++) {
86            canvas->save();
87            paint.setColor(SK_ColorBLUE);
88            for (size_t i = 0; i < SK_ARRAY_COUNT(gRecs); i++) {
89                if (gRecs[i].fStyle != NONE) {
90                    SkMaskFilter* mf = SkBlurMaskFilter::Create(20,
91                                                                gRecs[i].fStyle,
92                                                                flags);
93                    paint.setMaskFilter(mf)->unref();
94                } else {
95                    paint.setMaskFilter(NULL);
96                }
97                canvas->drawCircle(200 + gRecs[i].fCx*100.f,
98                                   200 + gRecs[i].fCy*100.f, 50, paint);
99            }
100            // draw text
101            {
102                SkMaskFilter* mf = SkBlurMaskFilter::Create(4,
103                                                            SkBlurMaskFilter::kNormal_BlurStyle,
104                                                            flags);
105                paint.setMaskFilter(mf)->unref();
106                SkScalar x = SkIntToScalar(70);
107                SkScalar y = SkIntToScalar(400);
108                paint.setColor(SK_ColorBLACK);
109                canvas->drawText("Hamburgefons Style", 18, x, y, paint);
110                canvas->drawText("Hamburgefons Style", 18, x, y + SkIntToScalar(50), paint);
111                paint.setMaskFilter(NULL);
112                paint.setColor(SK_ColorWHITE);
113                x -= SkIntToScalar(2);
114                y -= SkIntToScalar(2);
115                canvas->drawText("Hamburgefons Style", 18, x, y, paint);
116            }
117            canvas->restore();
118            flags = SkBlurMaskFilter::kHighQuality_BlurFlag;
119            canvas->translate(350, 0);
120        }
121    }
122
123private:
124    typedef SkView INHERITED;
125};
126
127//////////////////////////////////////////////////////////////////////////////
128
129static SkView* MyFactory() { return new BlurView; }
130static SkViewRegister reg(MyFactory);
131
132