我想用skia实现两个复杂形状的alpha遮罩。
形状1:复杂的绘制操作,具有多个画布保存和恢复。在示例文本中(“Skia”)。
Shape 2:遮罩层,复杂的绘图操作,多个画布保存和恢复。例如,它是一个矩形。
最终结果:仅绘制相交处,但仅使用形状 1 像素。
如果不涉及位图操作,我无法实现此结果。 有没有有效的解决方案可以在不绘制位图(从画布表面拍摄快照)的情况下实现它?
void draw(SkCanvas *canvas)
{
SkFont font1;
font1.setSize(100);
font1.setEdging(SkFont::Edging::kAntiAlias);
// clear canvas, transparent
canvas->clear(SK_ColorTRANSPARENT);
sk_sp<SkTextBlob> blob1 = SkTextBlob::MakeFromString("Skia", font1);
SkPaint paint1;
paint1.setAntiAlias(true);
paint1.setColor(SkColorSetARGB(0xFF, 0x42, 0x85, 0xF4));
// Text draw
canvas->drawTextBlob(blob1.get(), 0, 100, paint1);
SkPaint p;
p.setColor(SK_ColorRED);
p.setAntiAlias(true);
canvas->saveLayer(nullptr, nullptr);
// canvas bounds, 400x400
canvas->drawRect(SkRect::MakeXYWH(0, 0, 400, 400), p);
p.setBlendMode(SkBlendMode::kClear);
// Alpha drawing is complex operation with multiple save and restore
// There can be multiple draw commands
canvas->drawRect(SkRect::MakeXYWH(0, 0, 400, 50), p);
canvas->restore();
}
经过一些改变后我能够实现它
void draw(SkCanvas *canvas)
{
SkFont font1;
font1.setSize(100);
font1.setEdging(SkFont::Edging::kAntiAlias);
// clear canvas, transparent
canvas->clear(SK_ColorTRANSPARENT);
sk_sp<SkTextBlob> blob1 = SkTextBlob::MakeFromString("Skia", font1);
SkPaint paint1;
paint1.setAntiAlias(true);
paint1.setColor(SkColorSetARGB(0xFF, 0x42, 0x85, 0xF4));
// Text draw
canvas->drawTextBlob(blob1.get(), 0, 100, paint1);
SkPaint p;
p.setColor(SK_ColorRED);
p.setAntiAlias(true);
p.setBlendMode(SkBlendMode::kDstOut);
canvas->saveLayer(nullptr, &p);
canvas->clear(SK_ColorWHITE);
p.setBlendMode(SkBlendMode::kClear);
canvas->drawRect(SkRect::MakeXYWH(0, 0, 400, 70), p);
canvas->restore();
}