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