开罗:将整幅画作为图案抓取



我可能缺少一些关于cairo的概念。我使用以下帮助程序类进行绘制:

struct GroupLock {
    GroupLock(Graphics &g) : g_(g) {
        cairo_push_group(g_.cr);
    }
    ~GroupLock() {
        cairo_pop_group_to_source(g_.cr);
        cairo_paint(g_.cr);
        cairo_surface_flush(g_.surface);
        XFlush(g_.display);
    }
private:
    Graphics &g_;
};

我所有的绘图函数都是这样的:

void drawSomething(Graphics &g) {
    GroupLock lock{g}; (void)lock;
    ... // some drawing
}

每次调用此类绘图函数都会设置(通过使用GroupLock),并使前一个无法访问。如何修改此代码以"连接"?我希望能够通过执行以下操作将整个绘图作为图案抓取:

cairo_pattern_t *p_ = cairo_get_source(g_.cr);
cairo_pattern_reference(p_);

经过几个小时的挣扎,它来了!所有需要做的就是将构造函数修改为如下所示:

p_ = cairo_get_source(g_.cr);
cairo_pattern_reference(p_);
cairo_push_group(g_.cr);
cairo_set_source (g_.cr, p_);
cairo_paint(g_.cr);
cairo_pattern_destroy(p_);

对于未来的人们想知道,我认为是"正确"方法的功能是cairo_push_groupcairo_pop_group,它将创建一个新组并允许绘制到它,然后获得绘制结果作为模式,然后可以将其设置为源。Cairo以cairo_pop_group_to_source的形式为后者提供了便利功能,该功能会弹出组并将其设置为源,并为您执行内存管理。

相关内容

  • 没有找到相关文章

最新更新