0

Gtk+ 3 迁移指南展示了如何使用该字段GdkEventExpose.region为重新渲染小部件提供细粒度区域。我们已经在 Inkscape 中做了类似的事情,以避免在我们的绘图画布上渲染过多复杂的东西。

但是,指南中的示例显示了如何为旧的 Gtk+ 2 的expose_event 处理程序执行此操作。

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

我想一种可能性是cairo_copy_clip_rectangle_list在“准备好的”开罗上下文中使用来获取构成要绘制的区域的矩形列表。有没有人有使用这个的经验?这似乎是一种明智的做法?

4

2 回答 2

1

是的,您应该在小部件的 ::draw() 信号处理程序中获得的 cairo_t 上使用 cairo_copy_clip_rectangle_list() 。请参阅此提交以获取示例: http ://git.gnome.org/browse/vte/commit/?id=21a064ac8b5925108b0ab9bd6516664c8cd3e268

于 2013-02-21T18:57:41.857 回答
0

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

然后通过以下方式在 gtk/gtkmain.c 中处理此事件gtk_widget_send_expose()

http://git.gnome.org/browse/gtk+/tree/gtk/gtkwidget.c?id=eecb9607a5c0ee38eadb446545beccd0922cb0b8#n6104

正如您在文档中所学的那样,此函数将 剪辑cairo_t到。GdkEventExpose.region

然后调用_gtk_widget_draw_internal()which 发出实际的绘图信号:

http://git.gnome.org/browse/gtk+/tree/gtk/gtkwidget.c?id=eecb9607a5c0ee38eadb446545beccd0922cb0b8#n5726

据我所知,这里没有任何内容可以让您直接访问剪辑区域。在gtk_widget_send_expose()作为用户GdkEvent数据添加到 cairo 上下文中。但是,这是不可访问的,因为所有涉及的函数和变量都是静态的。所以你必须使用cairo_copy_clip_rectangle_list().

然而,这听起来非常低效。首先gdk_cairo_region将区域转换为对的多个调用cairo_rectangle,然后 cairo 将其从其内部表示转换为 a cairo_rectangle_list_t(如果剪辑由于某种原因不是区域,则可能会失败)。如果您发现这很慢,那么将一些快捷方式直接添加到 gtk 可能是有意义的。

于 2012-12-31T11:32:30.187 回答