aboutsummaryrefslogtreecommitdiff
path: root/samplecode/SampleLayerMask.cpp
diff options
context:
space:
mode:
authorreed@android.com <reed@android.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2009-05-05 23:13:23 +0000
committerreed@android.com <reed@android.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2009-05-05 23:13:23 +0000
commit311c82db3115fc6810855cbcc42a6bc6fbd48265 (patch)
tree2183ec768b21bda915011bacc4740a353aa2c684 /samplecode/SampleLayerMask.cpp
parent7a561082645315215949fb7ad9c80c883ffd89ad (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.cpp73
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);
+