状态栈flag
SkCanvas类在save()时会保存matrix,clip或者matrix和clip都保存,这是依赖于以下这三种flag决定的。save()默认flag是kMatrixClip_SaveFlag。
SkCanvas::kMatrix_SaveFlag
SkCanvas::kClip_SaveFlag
SkCanvas::kMatrixClip_SaveFlag
根据canvasstate.cpp例子来解释这几个flag的不同。
首先在CanvasStateGM类的构造函数中构造了两种paint和两个rect,分别代表蓝色的矩形轮廓和红色的填充矩形;同时还构造了用于clip的三角形path。
CanvasStateGM() {
fSize.set(SkIntToScalar(WIDTH), SkIntToScalar(HEIGHT));
fFillPaint.setColor(SK_ColorRED);
fFillPaint.setStyle(SkPaint::kFill_Style);
fStrokePaint.setColor(SK_ColorBLUE);
fStrokePaint.setStyle(SkPaint::kStroke_Style);
fStrokePaint.setStrokeWidth(1);
//用于clip的三角形path
fPath.moveTo(25, 25);
fPath.lineTo(125, 25);
fPath.lineTo(75, 125);
fPath.close();
fOutlineRect = SkRect::MakeXYWH(1, 1, WIDTH-2, HEIGHT-2);//轮廓,左上角(1,1)宽高(148*148)
fFillRect = SkRect::MakeXYWH(10, 10, WIDTH-20, HEIGHT-20);//填充,左上角(10,10)宽高(130*130)
}
然后在onDraw()方法中分别演示这三种flag的不同行为,为了方便解释我修改了一下这个方法。
virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
SkCanvas::SaveFlags flags[] = { SkCanvas::kMatrix_SaveFlag,
SkCanvas::kClip_SaveFlag,
SkCanvas::kMatrixClip_SaveFlag };
for (int i = 0; i < static_cast<int>(SK_ARRAY_COUNT(flags)); ++i) {
this->drawTestPattern(i, 0, canvas, flags[i],
SkToBool(1), SkToBool(1));
}
#endif
}
实际的绘制函数为:
void drawTestPattern(int x, int y, SkCanvas* canvas,