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