Skia 库无法使用 alpha 屏蔽

问题描述 投票:0回答:1

我想用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();
}

示例:400x400 画布

rendering alphablending skia
1个回答
0
投票

经过一些改变后我能够实现它

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();
}
© www.soinside.com 2019 - 2024. All rights reserved.