我可能缺少一些关于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_group
和cairo_pop_group
,它将创建一个新组并允许绘制到它,然后获得绘制结果作为模式,然后可以将其设置为源。Cairo以cairo_pop_group_to_source
的形式为后者提供了便利功能,该功能会弹出组并将其设置为源,并为您执行内存管理。