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