skia2/samplecode/SampleLayerMask.cpp
reed@android.com 311c82db31 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
2009-05-05 23:13:23 +00:00

74 lines
2.1 KiB
C++

#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);