diff options
| author | reed@android.com <reed@android.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2009-05-05 23:13:23 +0000 |
|---|---|---|
| committer | reed@android.com <reed@android.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2009-05-05 23:13:23 +0000 |
| commit | 311c82db3115fc6810855cbcc42a6bc6fbd48265 (patch) | |
| tree | 2183ec768b21bda915011bacc4740a353aa2c684 /samplecode/SampleLayerMask.cpp | |
| parent | 7a561082645315215949fb7ad9c80c883ffd89ad (diff) | |
fix copyTo to only copy the minimum pixels per row, and to lock the src before
trying to access its colorTable. Update unittest for copyTo. Add sample for
using a mask to clip a layer.
git-svn-id: http://skia.googlecode.com/svn/trunk@168 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'samplecode/SampleLayerMask.cpp')
| -rw-r--r-- | samplecode/SampleLayerMask.cpp | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/samplecode/SampleLayerMask.cpp b/samplecode/SampleLayerMask.cpp new file mode 100644 index 0000000000..8cbe76d340 --- /dev/null +++ b/samplecode/SampleLayerMask.cpp @@ -0,0 +1,73 @@ +#include "SampleCode.h" +#include "SkCanvas.h" +#include "SkPaint.h" +#include "SkPorterDuff.h" +#include "SkView.h" + +/////////////////////////////////////////////////////////////////////////////// + +class LayerMaskView : public SkView { +public: + LayerMaskView() {} + +protected: + // overrides from SkEventSink + virtual bool onQuery(SkEvent* evt) { + if (SampleCode::TitleQ(*evt)) { + SampleCode::TitleR(evt, "LayerMask"); + return true; + } + return this->INHERITED::onQuery(evt); + } + + void drawMask(SkCanvas* canvas, const SkRect& r) { + SkPaint paint; + paint.setAntiAlias(true); + + if (true) { + SkBitmap mask; + int w = SkScalarRound(r.width()); + int h = SkScalarRound(r.height()); + mask.setConfig(SkBitmap::kARGB_8888_Config, w, h); + mask.allocPixels(); + mask.eraseColor(0); + SkCanvas c(mask); + SkRect bounds = r; + bounds.offset(-bounds.fLeft, -bounds.fTop); + c.drawOval(bounds, paint); + + paint.setPorterDuffXfermode(SkPorterDuff::kDstIn_Mode); + canvas->drawBitmap(mask, r.fLeft, r.fTop, &paint); + } else { + SkPath p; + p.addOval(r); + p.setFillType(SkPath::kInverseWinding_FillType); + paint.setPorterDuffXfermode(SkPorterDuff::kDstOut_Mode); + canvas->drawPath(p, paint); + } + } + + void drawBG(SkCanvas* canvas) { + canvas->drawColor(0xFFDDDDDD); + } + + virtual void onDraw(SkCanvas* canvas) { + this->drawBG(canvas); + + SkRect r; + r.set(SkIntToScalar(20), SkIntToScalar(20), SkIntToScalar(120), SkIntToScalar(120)); + canvas->saveLayer(&r, NULL, SkCanvas::kARGB_ClipLayer_SaveFlag); + canvas->drawColor(SK_ColorRED); + drawMask(canvas, r); + canvas->restore(); + } + +private: + typedef SkView INHERITED; +}; + +/////////////////////////////////////////////////////////////////////////////// + +static SkView* MyFactory() { return new LayerMaskView; } +static SkViewRegister reg(MyFactory); + |
