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