开罗:抓住整个画作作为一种模式

时间:2016-03-13 12:03:04

标签: c++ graphics cairo

我可能遗漏了关于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_);

2 个答案:

答案 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_groupcairo_pop_group,它们将创建一个新的组并允许一个组使用它,并且然后随后将绘制结果作为图案,然后可以将其设置为源。 Cairo以cairo_pop_group_to_source的形式为后者提供一种便利功能,该功能会弹出该组并将其设置为源,并为您执行内存管理。