0

Gtk+ 3 移行ガイドでは、GdkEventExpose.regionフィールドを使用して、ウィジェットを再レンダリングするためのきめ細かい領域を提供する方法を示しています。Inkscape では既にこのようなことを行っており、描画キャンバスに過度の量の複雑なものをレンダリングすることを回避しています。

ただし、ガイドの例では、古い Gtk+ 2 の公開イベント ハンドラーに対してこれを行う方法を示しています。

ではなく、パラメーターとして「準備が整った」Cairo コンテキストを受け取る新しい Gtk+ 3 描画ハンドラーで同等のことを行うにはどうすればよいGdkEventExposeですか?

1つの可能性は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_tto をクリップします。GdkEventExpose.region

次に_gtk_widget_draw_internal()、実際の描画シグナルを発する呼び出しを呼び出します。

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

私が見る限り、クリップ領域に直接アクセスできるものは何もありません。ユーザーデータとして cairo コンテキストに追加されますgtk_widget_send_expose()GdkEventただし、関連するすべての関数と変数が静的であるため、これにはアクセスできません。したがって、使用する必要がありますcairo_copy_clip_rectangle_list()

ただし、これは非常に効率が悪いように思えます。最初gdk_cairo_regionに領域を への呼び出しの数にcairo_rectangle変換し、次に cairo がこれを内部表現から に変換しcairo_rectangle_list_tます (何らかの理由でクリップが領域でない場合、これは失敗する可能性があります)。これが遅いことがわかった場合は、これに対するショートカットを gtk に直接追加するのが理にかなっているかもしれません。

于 2012-12-31T11:32:30.187 に答える