cairo图形库:我如何在两个xlib表面之间传输数据?



我想使用Cairo图形库将一个X11窗口的内容复制到另一个X11窗口。我用cairo_xlib_surface_create()创建了两个曲面。现在我想从源表面(位置xs,ys,大小ws,hs)复制一个区域到目标表面上的给定位置(位置xd,yd),在那里它也应该是可见的。

我该如何做到这一点?我是否要像下面这个示例一样浏览Cairo图像表面:https://stackoverflow.com/a/18290221/3852630?这是从源X11表面到图像表面;如何从图像表面复制回目标X11表面?我该如何考虑上面的区域呢?

或者是通过cairo_surface_map_to_image()的方式,我将X11表面映射到图像表面?但如何从那里开始,如何在图像表面之间传输数据?

或者我滥用了Cairo,最好直接通过X11实现,就像这样:https://stackoverflow.com/a/4965236/3852630?

谢谢你的帮助!

Cairo并不关心您拥有什么样的表面。下面的函数应该在两个cairo_surface_t之间复制一个矩形区域。变量名应该和你的问题一样。

// Untested, treat this as pseudo-code
void copy_some_area(cairo_surface_t* source, int xs, int ys, int ws, int hs,
cairo_surface_t* target, int xd, int yd) {
cairo_t *cr = cairo_create (target);
cairo_set_source_surface (cr, source, xd - xs, yd - ys);
cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
cairo_rectangle (cr, xd, yd, ws, hs);
cairo_fill (cr);
cairo_destroy (cr);
}

这个函数:

  • 创建cairo上下文
  • 使用源表面作为上下文的源,以便两个表面之间的偏移是所需的(cairo_set_source_surface获得表面左上角应该出现的坐标)。
  • 告诉cairo "just copy"没有任何alpha混合或东西
  • 通知cairo应该填充的矩形
  • 填充矩形
  • 通过再次破坏上下文来清理

它也应该是可见的。

嗯,也许你还想调用cairo_surface_flush(target);,以确保真的,真的,真的确定cairo确实画了这幅画,而不是为了以后记住它。

相关内容

  • 没有找到相关文章

最新更新