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 "SkView.h"
10 #include "SkCanvas.h"
11 #include "SkBlurMaskFilter.h"
12 #include "SkCamera.h"
13 #include "SkColorFilter.h"
14 #include "SkColorPriv.h"
15 #include "SkDevice.h"
16 #include "SkGradientShader.h"
17 #include "SkImageDecoder.h"
18 #include "SkInterpolator.h"
19 #include "SkMaskFilter.h"
20 #include "SkPath.h"
21 #include "SkRegion.h"
22 #include "SkShader.h"
23 #include "SkTime.h"
24 #include "SkTypeface.h"
25 #include "SkUtils.h"
26 #include "SkKey.h"
27 #include "SkXfermode.h"
28 #include "SkDrawFilter.h"
29
make_paint(SkPaint * paint,const SkMatrix & localMatrix)30 static void make_paint(SkPaint* paint, const SkMatrix& localMatrix) {
31 SkColor colors[] = { 0, SK_ColorWHITE };
32 SkPoint pts[] = { { 0, 0 }, { 0, SK_Scalar1*20 } };
33 SkShader* s = SkGradientShader::CreateLinear(pts, colors, NULL, 2, SkShader::kClamp_TileMode,
34 0, &localMatrix);
35
36 paint->setShader(s)->unref();
37 paint->setXfermodeMode(SkXfermode::kDstIn_Mode);
38 }
39
dump_layers(const char label[],SkCanvas * canvas)40 static void dump_layers(const char label[], SkCanvas* canvas) {
41 SkDebugf("Dump Layers(%s)\n", label);
42
43 SkCanvas::LayerIter iter(canvas, true);
44 int index = 0;
45 while (!iter.done()) {
46 SkImageInfo info = iter.device()->imageInfo();
47 const SkIRect& clip = iter.clip().getBounds();
48 SkDebugf("Layer[%d] bitmap [%d %d] X=%d Y=%d clip=[%d %d %d %d] alpha=%d\n", index++,
49 info.width(), info.height(), iter.x(), iter.y(),
50 clip.fLeft, clip.fTop, clip.fRight, clip.fBottom,
51 iter.paint().getAlpha());
52 iter.next();
53 }
54 }
55
56 // test drawing with strips of fading gradient above and below
test_fade(SkCanvas * canvas)57 static void test_fade(SkCanvas* canvas) {
58 SkAutoCanvasRestore ar(canvas, true);
59
60 SkRect r;
61
62 SkPaint p;
63 p.setAlpha(0x88);
64
65 SkAutoCanvasRestore ar2(canvas, false);
66
67 // create the layers
68
69 r.set(0, 0, SkIntToScalar(100), SkIntToScalar(100));
70 canvas->clipRect(r);
71
72 r.fBottom = SkIntToScalar(20);
73 canvas->saveLayer(&r, NULL);
74
75 r.fTop = SkIntToScalar(80);
76 r.fBottom = SkIntToScalar(100);
77 canvas->saveLayer(&r, NULL);
78
79 // now draw the "content"
80
81 if (true) {
82 r.set(0, 0, SkIntToScalar(100), SkIntToScalar(100));
83
84 canvas->saveLayerAlpha(&r, 0x80);
85
86 SkPaint p;
87 p.setColor(SK_ColorRED);
88 p.setAntiAlias(true);
89 canvas->drawOval(r, p);
90
91 dump_layers("inside layer alpha", canvas);
92
93 canvas->restore();
94 } else {
95 r.set(0, 0, SkIntToScalar(100), SkIntToScalar(100));
96
97 SkPaint p;
98 p.setColor(SK_ColorRED);
99 p.setAntiAlias(true);
100 canvas->drawOval(r, p);
101 }
102
103 // return;
104
105 dump_layers("outside layer alpha", canvas);
106
107 // now apply an effect
108 SkMatrix m;
109 m.setScale(SK_Scalar1, -SK_Scalar1);
110 m.postTranslate(0, SkIntToScalar(100));
111
112 SkPaint paint;
113 make_paint(&paint, m);
114 r.set(0, 0, SkIntToScalar(100), SkIntToScalar(20));
115 // SkDebugf("--------- draw top grad\n");
116 canvas->drawRect(r, paint);
117
118 r.fTop = SkIntToScalar(80);
119 r.fBottom = SkIntToScalar(100);
120 // SkDebugf("--------- draw bot grad\n");
121 canvas->drawRect(r, paint);
122 }
123
124 class RedFilter : public SkDrawFilter {
125 public:
filter(SkPaint * p,SkDrawFilter::Type)126 virtual bool filter(SkPaint* p, SkDrawFilter::Type) SK_OVERRIDE {
127 fColor = p->getColor();
128 if (fColor == SK_ColorRED) {
129 p->setColor(SK_ColorGREEN);
130 }
131 return true;
132 }
133
134 private:
135 SkColor fColor;
136 };
137
138 class LayersView : public SkView {
139 public:
LayersView()140 LayersView() {}
141
142 protected:
143 // overrides from SkEventSink
onQuery(SkEvent * evt)144 virtual bool onQuery(SkEvent* evt) {
145 if (SampleCode::TitleQ(*evt)) {
146 SampleCode::TitleR(evt, "Layers");
147 return true;
148 }
149 return this->INHERITED::onQuery(evt);
150 }
151
drawBG(SkCanvas * canvas)152 void drawBG(SkCanvas* canvas) {
153 canvas->drawColor(SK_ColorGRAY);
154 }
155
onDraw(SkCanvas * canvas)156 virtual void onDraw(SkCanvas* canvas) {
157 this->drawBG(canvas);
158
159 if (true) {
160 SkRect r;
161 r.set(SkIntToScalar(0), SkIntToScalar(0),
162 SkIntToScalar(220), SkIntToScalar(120));
163 SkPaint p;
164 canvas->saveLayer(&r, &p);
165 canvas->drawColor(0xFFFF0000);
166 p.setAlpha(0); // or 0
167 p.setXfermodeMode(SkXfermode::kSrc_Mode);
168 canvas->drawOval(r, p);
169 canvas->restore();
170 return;
171 }
172
173 if (false) {
174 SkRect r;
175 r.set(SkIntToScalar(0), SkIntToScalar(0),
176 SkIntToScalar(220), SkIntToScalar(120));
177 SkPaint p;
178 p.setAlpha(0x88);
179 p.setAntiAlias(true);
180
181 if (true) {
182 canvas->saveLayer(&r, &p);
183 p.setColor(0xFFFF0000);
184 canvas->drawOval(r, p);
185 canvas->restore();
186 }
187
188 p.setColor(0xFF0000FF);
189 r.offset(SkIntToScalar(20), SkIntToScalar(50));
190 canvas->drawOval(r, p);
191 }
192
193 if (false) {
194 SkPaint p;
195 p.setAlpha(0x88);
196 p.setAntiAlias(true);
197
198 canvas->translate(SkIntToScalar(300), 0);
199
200 SkRect r;
201 r.set(SkIntToScalar(0), SkIntToScalar(0),
202 SkIntToScalar(220), SkIntToScalar(60));
203
204 canvas->saveLayer(&r, &p);
205
206 r.set(SkIntToScalar(0), SkIntToScalar(0),
207 SkIntToScalar(220), SkIntToScalar(120));
208 p.setColor(SK_ColorBLUE);
209 canvas->drawOval(r, p);
210 canvas->restore();
211 return;
212 }
213
214 test_fade(canvas);
215 }
216
onFindClickHandler(SkScalar x,SkScalar y,unsigned modi)217 virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y,
218 unsigned modi) SK_OVERRIDE {
219 this->inval(NULL);
220
221 return this->INHERITED::onFindClickHandler(x, y, modi);
222 }
223
onClick(Click * click)224 virtual bool onClick(Click* click) {
225 return this->INHERITED::onClick(click);
226 }
227
handleKey(SkKey)228 virtual bool handleKey(SkKey) {
229 this->inval(NULL);
230 return true;
231 }
232
233 private:
234 typedef SkView INHERITED;
235 };
236
237 //////////////////////////////////////////////////////////////////////////////
238
MyFactory()239 static SkView* MyFactory() { return new LayersView; }
240 static SkViewRegister reg(MyFactory);
241