3.4. はじめての Script-Fu スクリプト
| 3. Script-Fu 作成演習 |

### 3.4. はじめての Script-Fu スクリプト

ひと息ついて休みをとる必要はないですか。 大丈夫ですね。 よろしい、ではいよいよはじめての Script-Fu スクリプトを書く第 4 段階に進みましょう。

#### 3.4.1. テキストボックススクリプトを作成

GIMPを使った私の経験では一番多い使い道のひとつがウェブ用にテキストの入ったロゴやら何やらの作成でした。 でもみなさんにとっては新規画像をどれ位の寸法で作ったら良いか全然判らないはずです。 テキストに使いたい文字の大きさが判ってもそれが画像をどれ位占めるのか見当がつきません。

Script-Fu の達人も入門者のみなさんも Script-Fu を使ったら簡単かつ自動的にこの問題を解決できるとすぐ気付くはずです。

したがってテキストボックスという名前でスクリプトを書いて、 これに画像を作らせ、 テキストを与えたらちょうどぴったり囲む頃合いの寸法になるようなスクリプトにしましょう。 それから好みのフォントやフォントサイズや文字色が選べるようにしましょう。

#### 3.4.2. スクリプトを書いて保存

ここまで私たちは「Script-Fu コンソール」を使ってきました。 しかし今からスクリプトはテキストファイルに書くことにします。

自作のスクリプトをどこに置くかは好みの設定の問題でもあります。 もしGIMPの標準のスクリプト用ディレクトリーを操作できる権限をお持ちならそこに保管することもできます。 でも私なら自作のスクリプトは個人用スクリプト保管ディレクトリーに収めるようにして、 GIMP提供の同梱スクリプトとは混ぜないようにします。

ホームディレクトリー内にGIMPが作成する `.gimp-2.6` ディレクトリーに `scripts` フォルダーができているのをお確かめください。[9] GIMPは必ず `.gimp-2.6` ディレクトリー内で `scripts` フォルダーを探し、 このディレクトリーパスを Script-Fu データベースに入れます。 個人用のスクリプトはここに入れるべきでしょう。

#### 3.4.3. 肝心要

どんな Script-Fu スクリプトもそのメイン関数として少なくとも 1 つの関数を定義します。 この作業にとりかかりましょう。

またどんな Script-Fu もプロシージャーデータベースに登録してGIMPから呼び出せるようにもしなければなりません。

ではメイン関数をまず定義しましょう。

            (define (script-fu-text-box inText inFont inFontSize inTextColor))

この式で `script-fu-text-box` という名前の関数を定義し、 テキストや書体や書体の寸法や文字色を受け入れる 4 つのパラメーターをとることにします。 関数は今のところ中身がないので何もできません。 ここまではよろしいですか。 目新しいところはまだありません。

#### 3.4.4. 命名規則

Scheme の変数や関数の名前は小文字の英字を適宜ハイフンでつないだ表現が好まれているようです。 それで私も同じ規則でこの関数の名前をつけました。 ただしパラメーターについてはその規則から外れた方法をとることにします。 私は変数やパラメーターにはもっと説明的な書き方をするのが好きなので、 パラメーターの頭に「in」をつけて関数が受け取った変数だとすぐ判るようにして、 他のところで作った変数と区別します。 またスクリプト内で定義した変数の頭には「the」をつけます。

GIMPでは Script-Fu スクリプトの関数名を `script-fu-abc` とする習慣になっています。 こうするとプロシージャーデータベースを検索するとき関数名で整列させると script-fu ではじまる名前でまとまるからです。 またこの方法はプラグインと区別するのにも役立ちます。

#### 3.4.5. 関数を登録

ではこの関数をGIMPに登録しましょう。 この操作には `script-fu-register` という関数を起用します。 GIMPはスクリプトを見るとこの関数を実行しプロシージャーデータベースに登録させます。 この関数の実行コードはスクリプトのどの位置に置いても構いませんが、 私なら他のコードを全部書き終えたあとの最後に置きます。

関数を登録している様子をつぎに示します。 パラメーターに関してはまもなく説明します。

      (script-fu-register
        "script-fu-text-box"                        ;func name
        "Text Box"                                  ;menu label
        "Creates a simple text box, sized to fit\
          around the user's choice of text,\
          font, font size, and color."              ;description
        "Michael Terry"                             ;author
        "copyright 1997, Michael Terry;\
          2009, the GIMP Documentation Team"        ;copyright notice
        "October 27, 1997"                          ;date created
        ""                     ;image type that the script works on
        SF-STRING      "Text"          "Text Box"   ;a string variable
        SF-FONT        "Font"          "Charter"    ;a font variable
        SF-ADJUSTMENT  "Font size"     '(50 1 1000 1 10 0 1)
                                                    ;a spin-button
        SF-COLOR       "Color"         '(0 0 0)     ;color variable
      )
      (script-fu-menu-register "script-fu-text-box" "<Image>/File/Create/Text")

以上の関数をテキストファイルにして `.scm` という拡張子をつけた名前で保存し、 スクリプトの個人用フォルダーに置いたら、 画像ウィンドウのメニューより フィルター → Script-Fu → スクリプトを再読み込み を実行してください。 すると作成したばかりのスクリプトが ファイル → 画像の生成 → Text → Text Box としてメニューに出現します。

この新しいスクリプトは実行しても何も起こりません。 もちろんメニューを辿れば説明文が表示されますし、 呼び出せばウィンドウも現れます。 スクリプトの登録が反映されたからなのですが、 何が起きたかの情報についてはあとで詳しく説明します。

最後にプロシージャーブラウザーを画像ウィンドウのメニューより ヘルプ → プロシージャーブラウザー と辿って開き、 作ったばかりのスクリプトがデータベースに登録されていることをご確認ください。

#### 3.4.6. スクリプトを登録するための工程

GIMPにスクリプトを登録するために登録関数 `script-fu-register` を起用しますが、 これには 7 つの必須パラメーターとスクリプト独自のパラメーター、 そして説明文とそれぞれのパラメーターの初期設定値を加えることになります。

必須のパラメーター

- 関数の name (名前) を定めました。 スクリプトを起用したときに呼び出される関数がこれです。 スクリプトへの入口の役目を果たしています。 同じファイル内に他にも関数を書き加えることになるかもしれないので、 GIMPがどの関数をまず呼び出すべきか判断できるよう、 こうして定義することが重要です。 先の例で登録したのは text-box というたったひとつの関数です。

- スクリプトを挿入するメニュー内での 位置 を定めます。 スクリプトの位置を Unix 風のパス表記で正確に指定してください。 パスのはじめ (ルート) には `<Image>` が指定できます。[10]

  既存の画像を加工しないスクリプトを書いた場合 (このテキストボックスのような画像を新たに作成するスクリプトもこの分類に含まれる)、 GIMPの分類に従いそのスクリプトを ファイル → 画像の生成 サブメニュー内に置きたいと考えるはずです。

  それとは反対に画像を編集・加工する目的のスクリプトを書いた場合は画像ウィンドウのメニューの ファイル メニューや、 標準にはない Script-Fu メニューの中に置こうと考えるはずです。 いずれにしろ位置の定義はどのメニューのどのサブメニュー内にするかということに絞られます。 以上の理由から、 画像ウィンドウのメニューの ファイル メニューの 画像の生成 サブメニューの中にText サブメニューを設け、 このテキストボックススクリプトをその中に収めることにしましょう。[11] つまり ファイル → 画像の生成 → Text → Text Box という位置になります。

  もうお気付きだとは思いますが 画像の生成 以下に Text サブメニューがまだできていません。 存在しないメニューやサブメニューを使った場合はGIMPが自動的にそのメニューを作成します。

- スクリプトの 説明 文をつけると、 プロシージャーブラウザーで表示されます。

- あなたのお名前 はスクリプトの作者を書きます。

- 著作権 を明示します。

- スクリプトの 作成日 には作成した日付か最近の改訂日付を記します。

- スクリプトが作動できる画像の 形式 を定めます。 適合できる 「画像の形式」 を RGB、 RGBA、 GRAY、 GRAYA、 INDEXED、 INDEXEDA のなかから選びます (複数可)。 しかし今回の例では画像を生成するスクリプトを書いているので画像の形式を設定する必要はありません。

図13.4 メニューにこのスクリプトが現れた様子

#### 3.4.7. スクリプトのパラメーターを登録

必須のパラメーターを列挙したので、 ここでスクリプトが使うパラメーターについて一覧表にまとめておきます。 これらの媒介変数を紹介するにあたりその型式がわかるようにしました。 これはスクリプトが呼ばれると現れるダイアログを構成するために使います。 また変数には初期設定値を与えておきます。

この節で行なわれる登録処理にはつぎの型式が関わります。

パラメーターの型 | 説明 | 例
--- | --- | ---
`SF-IMAGE` | 既に開いてある画像を操作するためのスクリプトを作るときは、 必須のパラメーターの直後にこのパラメーターを置かねばなりません。 GIMPは画像を参照するための情報をこのパラメーターに乗せてスクリプトに渡します。 | 3
`SF-DRAWABLE` | 既に開いてある画像を操作するためのスクリプトを作るときは、 `SF-IMAGE` 型のパラメーターのつぎにこのパラメーターを置かなくてはなりません。 これは活性レイヤーを参照します。 GIMPは活性レイヤーを参照するための情報をこのパラメーターに乗せてスクリプトに渡します。 | 17
`SF-VALUE` | 数値と文字列の両方を受け入れる型です。 初期設定のテキストを渡すとき引用符をエスケープ処理しなければならなくなるので、 文字列には `SF-STRING` 型の方が適しています。 | 42
`SF-STRING` | 文字列を収める変数です。 | "Some text"
`SF-COLOR` | このパラメーターが要求する色の情報を示します。 | '(0 102 255)
`SF-TOGGLE` | 真理 2 値をとるチェックボックスを表示します。 | 有効なら TRUE、 無効なら FALSE

#### 3.4.8. Script-Fu パラメーターAPI[12]

| 注記
上記のパラメーター型に加え、 操作盤ダイアログ上に使えるさらに多くの相互対話モード用ウィジェットの型があります。 GIMPのソースコードとともに配布されているテスト用スクリプト `plug-ins/script-fu/scripts/test-sphere.scm` にそういったパラメーターの説明や使用例があります。

パラメーターの型 | 説明
--- | ---
`SF-ADJUSTMENT` | ダイアログ上に値を調節するためのウィジェットを作成します。
    SF-ADJUSTMENT "label" '(value lower upper step_inc page_inc digits type)
ウィジェット変数表
要素 | 説明
--- | ---
"`label`" | ウィジェットの前に貼られる語句
`value` | 当初の数値 デフォルト
`lower`; `upper` | 最低値と最高値 (選べる値の範囲)
`step_inc` | 最小変動値、 公差
`page_inc` | PgUp キーと PgDn キーによる操作での公差
`digits` | 小数点以下の桁数 (十進数)
`type` | スライダーは `SF-SLIDER` もしくは 0、 スピンボックスは `SF-SPINNER` もしくは 1
`SF-COLOR` | ダイアログにカラーボタンを作成します。
    SF-COLOR "label" '(red green blue)
もしくは
    SF-COLOR "label" "color"
ウィジェット変数表
要素 | 説明
--- | ---
"`label`" | ウィジェットの前に貼られる語句
'(`red green blue`) | 赤・緑・青の 3 つの成分
"`color`" | CSS notatation の色名
`SF-FONT` | ダイアログにフォント選択ウィジェットを作成します。 フォント名を文字列変数形式で返します。 GIMPにはこの返し値を手軽に扱えるテキスト処理プロシージャーが 2 つ備わっています。 `(gimp-text-fontname image drawable x-pos y-pos text border antialias size unit font)` `(gimp-text-get-extents-fontname text size unit font)` いずれも `fontname` に得られたフォント名を入れます。 フォントの大きさには有益な値を設定しておくと良いでしょう。 24 ピクセルがおすすめです。
    SF-FONT "label" "fontname"
ウィジェット変数表
要素 | 説明
--- | ---
"`label`" | ウィジェットの前に貼られる語句
"`fontname`" | 初期状態でのフォント名
`SF-BRUSH` | ダイアログにブラシ選択ウィジェットを作成します。 このウィジェットは縮小見本表示があります。 ここはクリックしたまま待つと大きく表示されます。 さらに ... のラベルがついたボタンが作られます。 このボタンをクリックするとブラシ選択ダイアログが開かれ、 ブラシを選んだりその特徴を変更できるしくみになっています。
    SF-BRUSH "label" '("Brush Name" opacity spacing mode)
ウィジェット変数表
要素 | 説明
--- | ---
"`label`" | ウィジェットの前に貼られる語句
"`brush name`" | ブラシの名前。 例えば "Circle (03)"
`opacity` | 不透明度 (0-100)
`spacing` | 間隔 (対ブラシ高さ%)
`mode` | 描画モード番号。 例えば 0 なら標準モード
例えば「`SF-BRUSH "Brush" '("Circle (03)" 100 44 0)`」として呼び出してダイアログで何も変更しなかった場合、 返ってくるパラメーターは「`'("Circle (03)" 100 44 0)`」となります。
`SF-PATTERN` | ダイアログにパターン選択ウィジェットを作成します。 このウィジェットは縮小見本表示があります。 ここはクリックしたまま待つと大きく表示されます。 さらに ... のラベルがついたボタンが作られます。 このボタンをクリックするとパターン選択ダイアログが開かれ、 パターンを選んだりその特徴を変更できるしくみになっています。
    SF-PATTERN "label" "Pattern Name"
ウィジェット変数表
要素 | 説明
--- | ---
"`label`" | ウィジェットの前に貼られる語句
"`Pattern Name`" | パターンの名前。 例えば "Maple Leaves"
スクリプトが呼び出されたときに返される値はパターンの名前をもつ文字列変数です。 例えば「SF-PATTERN "Pattern" "Maple Leaves"」として呼び出してダイアログで何も変更しなかった場合、 返ってくるパラメーターは「`"Maple Leaves"`」となります。
`SF-GRADIENT` | ダイアログにグラデーション選択ウィジェットを作成します。 グラデーションボタンが設置され現在選ばれているグラデーションが表示されます。 このボタンはクリックするとグラデーション変更ダイアログが開かれ他のグラデーションも選べるしくみになっています。
    SF-GRADIENT "label" "gradientname"
ウィジェット変数表
要素 | 説明
--- | ---
"`label`" | ウィジェットの前に貼られる語句
"`gradientname`" | 初期状態でのグラデーション名
スクリプトが呼び出されたときに返される値はグラデーションの名前をもつ文字列変数です。 例えば「`SF-GRADIENT "Gradient" "Deep Sea"`」として呼び出してダイアログで何も変更しなかった場合、 返ってくるパラメーターは「`"Deep Sea"`」となります。
`SF-PALETTE` | ダイアログにパレット選択ウィジェットを作成します。 このウィジェットは縮小見本とパレット名を表示します。 縮小見本はボタンになっておりクリックするとパレット選択ダイアログが開かれ他のパレットも選べるしくみになっています。
    SF-PALETTE "label" "Palette Name"
ウィジェット変数表
要素 | 説明
--- | ---
"`label`" | ウィジェットの前に貼られる語句
"`Palette Name`" | パレットの名前。 例えば "Named Colors"
スクリプトが呼び出されたときに返される値はパレットの名前をもつ文字列変数です。 例えば「`SF-PALETTE "Palette" "Named Colors"`」として呼び出してダイアログで何も変更しなかった場合、 返ってくるパラメーターは「`"Named Colors"`」となります。
`SF-FILENAME` | ダイアログにファイル選択ウィジェットを作成します。 ファイル名が記されたボタンが設置されます。 このボタンをクリックするとファイルブラウザーが開かれ、 ファイルを探してひとつ選ぶ操作ができるしくみになっています。
    SF-FILENAME "label" (string-append "" gimp-data-directory "path/to/file.ext")
ウィジェット変数表
要素 | 説明
--- | ---
"`label`" | ウィジェットの前に貼られる語句
"`path/to/file.ext`" | gimp-data-directory からの相対パスとファイル名
スクリプトが呼び出されたときに返される値はファイルの名前と保管場所を記した文字列変数です。
`SF-DIRNAME` | 対話式操作でのみ有益です。 ファイルではなくディレクトリーを選択するウィジェットであることのほかは `SF-FILENAME` と酷似しています。
    SF-DIRNAME "label" (string-append "" gimp-data-directory "path")
ウィジェット変数表
要素 | 説明
--- | ---
"`label`" | ウィジェットの前に貼られる語句
"`path`" | gimp-data-directory からの相対パス
スクリプトが呼び出されたときに返される値はディレクトリー名とそれまでの筋道を記した文字列変数です。
`SF-OPTION` | ダイアログに数々の選択肢からひとつを選ぶコンボボックスウィジェットを作成します。 選択肢はまとめてリストにして渡し、 ウィジェットは最初の項目を初期値として表示します。
    SF-OPTION "label" '("option 1" "option 2" [... "option n"])
ウィジェット変数表
要素 | 説明
--- | ---
"`label`" | ウィジェットの前に貼られる語句
"`option 1`" | 最初のオプション。 初期設定値となる
"`option 2`" | 第2のオプション
"`option n`" | それ以上のオプション。 無くても良いが、 いくつでも増やせる
スクリプトが呼び出されたときに返される値はオプション項目の番号です。 最初のオプションが 0 番です。
`SF-ENUM` | ダイアログに列挙型リストの選択ウィジェットを作成します。 指定された列挙型の項目を並べたコンボボックスが設けられます。 使える列挙型は登録済のものに限られ、 その名前から冒頭の「Gimp」を取り除いた語で指定します。 第 2 のパラメーターには初期設定値を、 その略称で指定します。
    SF-ENUM "label" '("enum type" "default choice")
ウィジェット変数表
要素 | 説明
--- | ---
"`label`" | ウィジェットの前に貼られる語句
"`enum type`" | 列挙型の登録名
"`default choice`" | 初期設定値。 略称で指定する
スクリプトが呼び出されたときに返される値は扱われる列挙型での値です。

[9] Mac OS X™ では `~/Library/Application Support/Gimp/scripts` です。

[10] バージョン 2.6 よりも前はツールボックスを表す `<Toolbox>` も指定できました。 ツールボックスのメニューは廃止されたので、 こちらは使わないほうが無難です。

[11] マイクテリー氏の原文はツールボックスメニュー内の Xtns 以下にスクリプトを置いていますが、 GIMP 2.6 でツールボックスメニューが廃止され画像ウィンドウのメニューに統合されました。

[12] この節は原文の演習には含まれていません。

3.3. リストにリストもそのまたリスト |  | 3.5. スクリプトを肉付け