blob: f49d96e32b617cd1e51050d6e049f68d96761253 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
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 */
reed@android.com47ca0362009-09-02 02:07:45 +00008#include "SampleCode.h"
9#include "SkBlurMaskFilter.h"
10#include "SkColorPriv.h"
11#include "SkGradientShader.h"
12#include "SkView.h"
13#include "SkCanvas.h"
14#include "SkUtils.h"
15
16static SkBitmap make_bitmap() {
17 SkBitmap bm;
18 SkColorTable* ctable = new SkColorTable(256);
19
20 SkPMColor* c = ctable->lockColors();
21 for (int i = 0; i < 256; i++) {
22 c[i] = SkPackARGB32(255 - i, 0, 0, 0);
23 }
24 ctable->unlockColors(true);
25 bm.setConfig(SkBitmap::kIndex8_Config, 256, 256);
26 bm.allocPixels(ctable);
27 ctable->unref();
28
29 bm.lockPixels();
30 const float cx = bm.width() * 0.5f;
31 const float cy = bm.height() * 0.5f;
32 for (int y = 0; y < bm.height(); y++) {
33 float dy = y - cy;
34 dy *= dy;
35 uint8_t* p = bm.getAddr8(0, y);
36 for (int x = 0; x < 256; x++) {
37 float dx = x - cx;
38 dx *= dx;
39 float d = (dx + dy) / (cx/2);
40 int id = (int)d;
41 if (id > 255) {
42 id = 255;
43 }
44 p[x] = id;
45 }
46 }
47 bm.unlockPixels();
48 return bm;
49}
50
senorblanco@chromium.orge36ddf02011-07-15 14:28:16 +000051class BlurView : public SampleView {
reed@android.com47ca0362009-09-02 02:07:45 +000052 SkBitmap fBM;
53public:
54 BlurView() {
caryclark@google.com02939ce2012-06-06 12:09:51 +000055 if (false) { // avoid bit rot, suppress warning
56 fBM = make_bitmap();
57 }
reed@android.com47ca0362009-09-02 02:07:45 +000058 }
reed@google.com0ecc2b792011-02-16 13:06:15 +000059
reed@android.com47ca0362009-09-02 02:07:45 +000060protected:
61 // overrides from SkEventSink
62 virtual bool onQuery(SkEvent* evt) {
63 if (SampleCode::TitleQ(*evt)) {
64 SampleCode::TitleR(evt, "Blur");
65 return true;
66 }
67 return this->INHERITED::onQuery(evt);
68 }
reed@google.com0ecc2b792011-02-16 13:06:15 +000069
reed@android.com47ca0362009-09-02 02:07:45 +000070 void drawBG(SkCanvas* canvas) {
71 canvas->drawColor(0xFFDDDDDD);
72 }
reed@google.com0ecc2b792011-02-16 13:06:15 +000073
senorblanco@chromium.orge36ddf02011-07-15 14:28:16 +000074 virtual void onDrawContent(SkCanvas* canvas) {
reed@android.com47ca0362009-09-02 02:07:45 +000075 drawBG(canvas);
reed@google.com0ecc2b792011-02-16 13:06:15 +000076
reed@android.comda449a32009-09-18 20:57:05 +000077 SkBlurMaskFilter::BlurStyle NONE = SkBlurMaskFilter::BlurStyle(-999);
78 static const struct {
79 SkBlurMaskFilter::BlurStyle fStyle;
80 int fCx, fCy;
81 } gRecs[] = {
82 { NONE, 0, 0 },
83 { SkBlurMaskFilter::kInner_BlurStyle, -1, 0 },
84 { SkBlurMaskFilter::kNormal_BlurStyle, 0, 1 },
85 { SkBlurMaskFilter::kSolid_BlurStyle, 0, -1 },
86 { SkBlurMaskFilter::kOuter_BlurStyle, 1, 0 },
87 };
reed@android.com47ca0362009-09-02 02:07:45 +000088
reed@android.com47ca0362009-09-02 02:07:45 +000089 SkPaint paint;
90 paint.setAntiAlias(true);
reed@google.com0ecc2b792011-02-16 13:06:15 +000091 paint.setTextSize(25);
92 canvas->translate(-40, 0);
reed@android.comda449a32009-09-18 20:57:05 +000093
reed@google.com0ecc2b792011-02-16 13:06:15 +000094 SkBlurMaskFilter::BlurFlags flags = SkBlurMaskFilter::kNone_BlurFlag;
95 for (int j = 0; j < 2; j++) {
96 canvas->save();
97 paint.setColor(SK_ColorBLUE);
98 for (size_t i = 0; i < SK_ARRAY_COUNT(gRecs); i++) {
99 if (gRecs[i].fStyle != NONE) {
100 SkMaskFilter* mf = SkBlurMaskFilter::Create(20,
101 gRecs[i].fStyle,
102 flags);
103 paint.setMaskFilter(mf)->unref();
104 } else {
105 paint.setMaskFilter(NULL);
106 }
reed@google.com261b8e22011-04-14 17:53:24 +0000107 canvas->drawCircle(200 + gRecs[i].fCx*100.f,
108 200 + gRecs[i].fCy*100.f, 50, paint);
reed@android.comda449a32009-09-18 20:57:05 +0000109 }
reed@google.com0ecc2b792011-02-16 13:06:15 +0000110 // draw text
111 {
112 SkMaskFilter* mf = SkBlurMaskFilter::Create(4,
113 SkBlurMaskFilter::kNormal_BlurStyle,
114 flags);
115 paint.setMaskFilter(mf)->unref();
116 SkScalar x = SkIntToScalar(70);
117 SkScalar y = SkIntToScalar(400);
118 paint.setColor(SK_ColorBLACK);
119 canvas->drawText("Hamburgefons Style", 18, x, y, paint);
120 canvas->drawText("Hamburgefons Style", 18, x, y + SkIntToScalar(50), paint);
121 paint.setMaskFilter(NULL);
122 paint.setColor(SK_ColorWHITE);
123 x -= SkIntToScalar(2);
124 y -= SkIntToScalar(2);
125 canvas->drawText("Hamburgefons Style", 18, x, y, paint);
126 }
127 canvas->restore();
reed@google.com11a5ff32011-02-18 20:20:51 +0000128 flags = SkBlurMaskFilter::kHighQuality_BlurFlag;
reed@google.com0ecc2b792011-02-16 13:06:15 +0000129 canvas->translate(350, 0);
reed@android.comda449a32009-09-18 20:57:05 +0000130 }
reed@android.com47ca0362009-09-02 02:07:45 +0000131 }
reed@google.com0ecc2b792011-02-16 13:06:15 +0000132
reed@android.com47ca0362009-09-02 02:07:45 +0000133private:
134 typedef SkView INHERITED;
135};
136
137//////////////////////////////////////////////////////////////////////////////
138
139static SkView* MyFactory() { return new BlurView; }
140static SkViewRegister reg(MyFactory);
141