Home | History | Annotate | Download | only in samplecode
      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