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