C 如何确定Gtk+中的非矩形绘图区域;3和开罗?

C 如何确定Gtk+中的非矩形绘图区域;3和开罗?,c,gtk,cairo,gtk3,inkscape,C,Gtk,Cairo,Gtk3,Inkscape,显示了如何使用GdkEventExpose.region字段为重新呈现小部件提供细粒度区域。我们已经在Inkscape中执行了类似的操作,以避免在绘图画布上渲染过多的复杂内容 但是,本指南中的示例演示了如何对旧的Gtk+2 expose_事件处理程序执行此操作 如何在新的Gtk+3绘图处理程序中执行等效操作,该处理程序接收一个“ready clipped”Cairo上下文作为参数,而不是一个GdkEventExpose 我想一种可能是在“ready clipped”cairo上下文中使用cair

显示了如何使用
GdkEventExpose.region
字段为重新呈现小部件提供细粒度区域。我们已经在Inkscape中执行了类似的操作,以避免在绘图画布上渲染过多的复杂内容

但是,本指南中的示例演示了如何对旧的Gtk+2 expose_事件处理程序执行此操作

如何在新的Gtk+3绘图处理程序中执行等效操作,该处理程序接收一个“ready clipped”Cairo上下文作为参数,而不是一个
GdkEventExpose


我想一种可能是在“ready clipped”cairo上下文中使用
cairo\u copy\u clip\u rectangle\u list
,以获得组成要绘制区域的矩形列表。有没有人有使用这个的经验?这似乎是一种明智的方法吗?

因为我没有多少线索,所以我决定检查源代码。GDK在窗口上发出一个
GDK_EXPOSE
事件,并为此创建
GdkEventExpose
实例

然后通过
gtk\u widget\u send\u expose()在gtk/gtkmain.c中处理此事件:

此函数将
cairo\u t
剪辑为
GdkEventExpose.region
,如您在文档中所了解的

然后调用
\u gtk\u widget\u draw\u internal()

就我所见,这里没有任何东西可以让你直接访问剪辑区域。在
gtk\u widget\u send\u expose()
中,
GdkEvent
作为用户数据添加到cairo上下文中。但是,这是不可访问的,因为所有涉及的函数和变量都是静态的。因此,您必须使用
cairo\u copy\u clip\u rectangle\u list()


然而,这听起来相当低效。首先
gdk\u cairo\u region
将该区域转换为对
cairo\u rectangle
的多次调用,然后cairo将其从内部表示转换为
cairo\u rectangle\u list\t
(如果剪辑出于某种原因不是区域,则可能会失败)。如果您认为这很慢,那么直接将一些快捷方式添加到gtk可能是有意义的。

是的,您应该在小部件的::draw()信号处理程序中获得的cairo上使用cairo\u copy\u clip\u rectangle\u list()。有关示例,请参见此提交:

谢谢。。。只是刚刚发现了这个答案!我最终使用您指出的方法实现了它:)