解説記事:GIMPのソースコード解析

最終更新日:


0.全体の構成

GIMP 2.6.4のソースコードを対象にします。

ルートディレクトリ: main.c、app.c、などのメイン処理。
core: メニュー、ダイアログ、などの全体(デスクトップ)の管理に関する処理。
base: 
gui: 画面構成(メニュー、アイコン、など)に関する処理。GUIライブラリであるGTKとのインターフェース。
display: 画面描画に関する処理。GUIライブラリであるGTKとのインターフェース。
composite: MMX/SSEなどのH/Wアクセラレータの抽象化層。
actions: 
config: 
dialogs: 
file: 
menus: 
paint: 
paint-funcs: 
pdb: 
plug-in: 
text: 
tools: 
vectors: 
widgets: 
xcf: 


1.メイン (main.c)

一番最初に呼ばれる処理。

スレッドの初期化、アプリケーション(app.c)の初期化、システム用シグナルハンドラの初期化、アプリケーションの起動、などを行う。

注:GIMPのシグナルはUNIX/Linuxのシグナルとは異なることに注意 (http://library.gnome.org/devel/gtk-tutorial/stable/x159.html を参照)。 また、GIMPのイベントは、マウスやキーの押下状態などの処理がなされた場合に発行されるもの。 ユーザー側が指定可能な、GIMPのシグナルのインターフェースとして、 シグナルの登録(connect)・解除(disconnect)、シグナルのブロック(block)・ブロック解除(unblock)、 シグナルの発行許可(emit)・発行禁止(stop)、があります。


2.アプリケーションメイン (app.c)

GUIの初期化、アプリケーションのインスタンスの生成、基底(base)モジュールの初期化、 GEGLの初期化、アプリケーションの初期化、リソースのロード、メインループ(g_main_loop_new)の起動、などを行う。

メインループ(g_main_loop_new)はGLibと呼ばれるライブラリで定義されています (http://library.gnome.org/devel/glib/stable/glib.html参照)。 GLibは、ユーティリティーやメインループの抽象化、データタイプの定義、などを行います。

メインループはglib/gmain.cで定義されており、 初期状態→<準備>→準備完了→<要求受付>→ポーリング→<要求確認>→通知→<初期化>→初期状態→・・・ のようなループを繰り返します。スレッドが有効な環境では、まずスレッドのオーナーになる(コンテキストを取得する)まで待ちます。


11. シグナルの作成 (core/gimp.c)

アプリケーションの初期化などを行う。

initialize、restore、exit、buffer-changed、image-opendの5つのシグナル(イベント)を作成。


12. コンテキストの処理 (core/gimpcontext.c)

image-changed、display-changed、tool-changed、paint-info-changed、foreground-changed、background-changed、opacity-changed、paint-mode-changed、brush-changed、pattern-changed、gradient-changed、palette-changed、font-changed、buffer-changed、imagefile-changed、template-changed、といったシグナル(イベント)を作成。


参考資料