SkCanvas状态栈flag

状态栈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,
             
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值