• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #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"
16 #include "SkTime.h"
17 #include "SkTypeface.h"
18 #include "SkUtils.h"
19 #include "SkKey.h"
20 #include "SkXfermode.h"
21 #include "SkDrawFilter.h"
22 
make_paint(SkPaint * paint)23 static 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();
29     paint->setXfermodeMode(SkXfermode::kDstIn_Mode);
30 }
31 
dump_layers(const char label[],SkCanvas * canvas)32 static 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
test_fade(SkCanvas * canvas)49 static 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 
119 class RedFilter : public SkDrawFilter {
120 public:
filter(SkCanvas *,SkPaint * p,SkDrawFilter::Type)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     }
restore(SkCanvas *,SkPaint * p,SkDrawFilter::Type)128     virtual void restore(SkCanvas*, SkPaint* p, SkDrawFilter::Type) {
129         p->setColor(fColor);
130     }
131 
132 private:
133     SkColor fColor;
134 };
135 
136 class LayersView : public SkView {
137 public:
LayersView()138 	LayersView() {}
139 
140 protected:
141     // overrides from SkEventSink
onQuery(SkEvent * evt)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 
drawBG(SkCanvas * canvas)150     void drawBG(SkCanvas* canvas) {
151         canvas->drawColor(SK_ColorGRAY);
152     }
153 
onDraw(SkCanvas * canvas)154     virtual void onDraw(SkCanvas* canvas) {
155         this->drawBG(canvas);
156 
157         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);
164             p.setAlpha(0);  // or 0
165             p.setXfermodeMode(SkXfermode::kSrc_Mode);
166             canvas->drawOval(r, p);
167             canvas->restore();
168             return;
169         }
170 
171         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);
242         p.setXfermodeMode(SkXfermode::kDstIn_Mode);
243         canvas->drawRect(bounds, p);
244 
245         canvas->restore();
246     }
247 
onFindClickHandler(SkScalar x,SkScalar y)248     virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) {
249         this->inval(NULL);
250 
251         return this->INHERITED::onFindClickHandler(x, y);
252     }
253 
onClick(Click * click)254     virtual bool onClick(Click* click) {
255         return this->INHERITED::onClick(click);
256     }
257 
handleKey(SkKey key)258 	virtual bool handleKey(SkKey key) {
259         this->inval(NULL);
260         return true;
261     }
262 
263 private:
264     typedef SkView INHERITED;
265 };
266 
267 //////////////////////////////////////////////////////////////////////////////
268 
MyFactory()269 static SkView* MyFactory() { return new LayersView; }
270 static SkViewRegister reg(MyFactory);
271 
272