blob: 8cbe76d34032ce97765e94428bb29013c80a6eaf [file] [log] [blame]
reed@android.com311c82d2009-05-05 23:13:23 +00001#include "SampleCode.h"
2#include "SkCanvas.h"
3#include "SkPaint.h"
4#include "SkPorterDuff.h"
5#include "SkView.h"
6
7///////////////////////////////////////////////////////////////////////////////
8
9class LayerMaskView : public SkView {
10public:
11 LayerMaskView() {}
12
13protected:
14 // overrides from SkEventSink
15 virtual bool onQuery(SkEvent* evt) {
16 if (SampleCode::TitleQ(*evt)) {
17 SampleCode::TitleR(evt, "LayerMask");
18 return true;
19 }
20 return this->INHERITED::onQuery(evt);
21 }
22
23 void drawMask(SkCanvas* canvas, const SkRect& r) {
24 SkPaint paint;
25 paint.setAntiAlias(true);
26
27 if (true) {
28 SkBitmap mask;
29 int w = SkScalarRound(r.width());
30 int h = SkScalarRound(r.height());
31 mask.setConfig(SkBitmap::kARGB_8888_Config, w, h);
32 mask.allocPixels();
33 mask.eraseColor(0);
34 SkCanvas c(mask);
35 SkRect bounds = r;
36 bounds.offset(-bounds.fLeft, -bounds.fTop);
37 c.drawOval(bounds, paint);
38
39 paint.setPorterDuffXfermode(SkPorterDuff::kDstIn_Mode);
40 canvas->drawBitmap(mask, r.fLeft, r.fTop, &paint);
41 } else {
42 SkPath p;
43 p.addOval(r);
44 p.setFillType(SkPath::kInverseWinding_FillType);
45 paint.setPorterDuffXfermode(SkPorterDuff::kDstOut_Mode);
46 canvas->drawPath(p, paint);
47 }
48 }
49
50 void drawBG(SkCanvas* canvas) {
51 canvas->drawColor(0xFFDDDDDD);
52 }
53
54 virtual void onDraw(SkCanvas* canvas) {
55 this->drawBG(canvas);
56
57 SkRect r;
58 r.set(SkIntToScalar(20), SkIntToScalar(20), SkIntToScalar(120), SkIntToScalar(120));
59 canvas->saveLayer(&r, NULL, SkCanvas::kARGB_ClipLayer_SaveFlag);
60 canvas->drawColor(SK_ColorRED);
61 drawMask(canvas, r);
62 canvas->restore();
63 }
64
65private:
66 typedef SkView INHERITED;
67};
68
69///////////////////////////////////////////////////////////////////////////////
70
71static SkView* MyFactory() { return new LayerMaskView; }
72static SkViewRegister reg(MyFactory);
73