以下の文章はHow to write a GIMP plug-in(developer.gimp.org)の1ページ目を勝手に訳してみたものです。間違い甚だしい訳だけどもとりあえず上げてみる。まぁ訳す作業は読むだけよりもちゃんと文章を読もうとするから読むだけより内容を理解している気がしないでもない。そんな自分の為の作業の一部というわけで。
ちなみに画像は省略してあります、また例のコードも長い物は省略しています。なので、読むときには原文とつきあわせながらの方が良いと思います。
原著者: Dave Neary(bolsh@NOSPAM.gimp.org)
この記事では、GIMPプラグインの基本的な事項を示し、libgimp APIを紹介する。また、他のスクリプト作者に自分で作ったプラグインが使えるようにするための、PDBの使い方も示す。
新しく開発を始める人はたいてい、GIMPのサイズと世間での評判に怖じ気づいてしまう。そのため、プラグインを書くことは難しいことだと考えてしまう。この記事の目的は、Cでプラグインを書くことがどれほど簡単であるかを示すことで、気遅れ(this feeling)を解消することである。
このパート(1P目)では、プラグインの基本的な事柄を示す。プラグインのインストールの仕方と、画像からデータを取得する方法やそれを直接操作する方法を示す。
GIMPスクリプトのインターフェースはProcedural database (PDB)に集中している。GIMPを起動したとき、あらかじめ設定されたスクリプトとプラグインの置き場所を確認しにいく、そして新しいスクリプトが無いかを自分に確認する。
このときプラグインは、自分自身をPDBに対して宣言する。そしてメニュー構造か入出力パラメータの中で、求められる位置情報のようなものを送り出す。
スクリプトかプラグインが他のプラグインを使いたい時、PDBを通して得る。PDBはユーザが意識しないレベルで一方から、または他方からのパラメータの伝達を管理する。
プラグインから操作できる内部関数は、coreでまずまとめられなければならない。coreはPDBでその関数を登録し、次にlibgimpがそれらを通常の関数のように呼ばれるようにする。
以下、まず最初のプラグインとしてHello, Worldを作ってみよう。
簡単なGIMPプラグインをコンパイルできるようにするには、libgimp headerと、GIMP関連ユーティリティであるgimptoolが必要である。
このユーティリティによって、プラグインを個人のディレクトリ(~/.gimp-2.0/plug-ins)か、システムのデフォルトディレクトリのどちらかにインストールできるようになる。
書式は以下の通りである。
gimptool --install plugin.c or gimptool --install-admin plugin.c
このユーティリティはオプションによってインストールスクリプトになれば、プラグインをアンインストールするのにも使える。
GIMPプラグインは通常、3つの異なる振る舞いをする。エッジ検出のように、プラグインは画像データを取得し、それを修正し、そして修正された画像を返すことができる。またいくつかのscript-fuやjpeg画像読み込みプラグインといったファイル読み込みプラグインのように、画像を生成して返すこともできる。そして、ファイル保存プラグインのように画像を取得し、対象データを修正することなく処理を行うものもある。
#include <libgimp/gimp.h>
このヘッダーは全ての基本的なプラグインの要素を利用可能にしてくれる。
GimpPlugInInfo PLUG_IN_INFO = { init, quit, query, run };
このstructureはPLUG_IN_INFOという名前を持たなければならない。このstructureは、4つの関数へのポインタを含んでいる、この関数はプラグインの生成と同時に呼び出される。initとquitはオプショナル(あってもなくても良い)である、必要でないときはNULLを与えておけば良い、しかし最後の二つは必ず必要である。
init()関数はGIMPが起動したときに呼び出される。この関数は通常使われない。プラグインの中には、init()関数を、コアが行わない補助的な検索をするために使うものもある。init()関数は標準的なGIMPプラグインでは使われていない。しかし役立つこともある、例えば、いくつかのファイルのあるところから条件付でprocedure(手続き)を登録したい場合などに使える。
quit()関数はほとんどのプラグインで使われていない。quit()関数は、リソースを解放するためにGIMP終了時に呼び出される。quit()関数はscript-fuプラグインの中で使われている。
query()関数は、そのプラグインが初めて現れたとき(インストールされたとき)呼び出される。プラグインが変更されたときも同様に呼び出される。
run()関数は、プラグインの中で中心となるものである。run()関数はプラグインが実行するかどうかたずねられたとき呼び出される。run ()関数は、対話的な方法を始めるかスクリプトによって、その時決定されるプラグイン名(プラグインがいくつかの手続きを登録するように)、入力パラメータや出力パラメータへのポインタを取得する。関数のプロトタイプを以下に示す。
void run (const gchar *name, gint nparams, const GimpParam *param, gint *nreturn_vals, GimpParam **return_vals);
MAINはCのマクロである。引数の初期化を行うおまじないである。これによって、PLUG_IN_INFOを適切なタイミングで呼び出すことができる。プラグインには必要な処理である。
query()は登録手続きと、入力引数の定義を扱う。これらの情報は立ち上がり時間を短縮するために保存され、プラグインに変更があった場合のみ再読み込みされる。
今回作成する"Hello World!"プラグインのquery()関数は次のようになる。
static void query (void) { ... }
GimpParamDefは3つの事柄を含んでいる。一つ目は引数の型、二つ目はその名前、三つ目はパラメータに関する記述である。
gimp_install_procedureはprocedure名、いくらかの記述とヘルプとなる文字列、プラグインがどこに入るべきかを示すメニューのパスを定義する。
"RGB*, GRAY*"という記述は、処理されたimageの型を宣言する。この記述はRGB, INDEXED または GRAY を選択できる、この時アルファ値を持たせたりすることもできる。つまり、"RGB*, GRAY*"はRGB, RGBA, GRAYまたはGRAYのimageの型を表している。
"GIMP_PLUGIN"は、このprocedureを外部対応するために宣言する、そしてGIMPのコアで実行されない。
ではrun()関数の殻を追加して、必要な要素を持たせたプラグインを確認してみる、そして、"Xtns->Plug-in Details"でPDBに登録されるか確認する。
PLUG_IN_INFOで求められているもう一つの関数がrun()である。プラグインの中心はrun()である。
出力値(プロトタイプでの return_vals)は、少なくともプラグインの状態に関係する一つの値は持つべきである。通常、この変数は"GIMP_PDB_SUCCESS"で保持するだろう。
Run-mode プラグインは様々なやり方で動作させることができる。GIMPを対話的に動作させているなら(通常起動)、GIMPメニューから動作させることができる、またscriptやbatchとして(まとめて)処理できるし、"フィルタ->再適用"としても使える。
入力引数"run_mode"は次の中から一つ適用できる。:"GIMP_RUN_INTERACTIVE", "GIMP_RUN_NONINTERACTIVE", "GIMP_RUN_WITH_LAST_VALS".
"GIMP_RUN_INTERACTIVE"は通常、オプションダイアログを生成する唯一のケースである、生成しない場合、直接入力引数かメモリの値を利用し処理を呼び出す。
今回のテストプラグインでは、単純に"Hello, World!"というメッセージを含むダイアログを表示するようにする。嬉しいことに、これはGTK+ではとても簡単なことである。以下にその関数を示す。
static void run(const gchar *name, ... { ... }
プラグインを走らせてみると、以下のように動作する。
次回は、より役立つプラグインを作成する。プラグインでimageデータを受け取るやり方を扱う。プラグインをよりよく使う為に、タイルを詰めていく画像処理を扱うことで、GIMPのimage構造をどのように使うのか示す。
この和訳文書はcreative commons : 帰属 - 非営利 - 同一条件許諾 2.5でライセンスされてます。
(2005/11/12 追記)2P目の私的和訳を以下のリンク先に作成しました。
tdiaryの形式にたぶん合わせて書いてみたけど、これじゃあRSSアグリゲータで見てたりすると項目が不自然に増えてしまうなぁ...。やっぱり別ページにしよう。