我可能遗漏了关于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
)并使之前的源无法访问。如何将此代码修改为" concatenate"取而代之的是来源?我希望能够通过以下方式将整个绘图作为模式抓取:
cairo_pattern_t *p_ = cairo_get_source(g_.cr);
cairo_pattern_reference(p_);
答案 0 :(得分:0)
经过几个小时的挣扎,这就是它!所有需要做的就是修改构造函数,使其如下所示:
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_);
答案 1 :(得分:0)
对于未来的人们来说,我认为是实现此目标的“正确”方法的功能是cairo_push_group
和cairo_pop_group
,它们将创建一个新的组并允许一个组使用它,并且然后随后将绘制结果作为图案,然后可以将其设置为源。 Cairo以cairo_pop_group_to_source
的形式为后者提供一种便利功能,该功能会弹出该组并将其设置为源,并为您执行内存管理。