3.6. テキストボックススクリプトを拡張
| 3. Script-Fu 作成演習 |

### 3.6. テキストボックススクリプトを拡張

#### 3.6.1. 取り消し機能の正しい取扱い

スクリプトを作成すると、 取り消し機能をつけて失敗から戻れるようにしたくなります。 これは簡単で、 画像を操作するコードを `gimp-undo-push-group-start` と `gimp-undo-push-group-end` の両関数で挟めばできます。 考え方としては画像上で行なわれる操作の記録を開始し終了する時点を GIMP に知らせて、 あとでその操作を取り消せるようにしている対の式だと見て間違いありません。

新しい画像を丸ごと生成するスクリプトならこの機能を使う意味がありません。 なぜなら既存の画像を変更しているわけではないからです。 しかし反対に既存の画像を変更するスクリプトならこの機能を使いたいのは当然です。

この両関数を使う限りスクリプトの動作の取り消しはほとんど完全無欠に行なえます。

#### 3.6.2. もう少しスクリプトを拡張

今やテキストボックスを作るとっても素敵便利な[15]スクリプトができているので、 2 つの機能を追加してやりましょう。

- 現在はテキストの周りをぴったり囲む大きさに画像が調節されます。 ドロップシャドウみたいな特殊効果がつけば他のスクリプトなら自動的に寸法を必要なだけ増やせるのに、 余地も調節機能も全くありません。そこでテキストまわりに余裕をもたせて、 しかもその幅をユーザーがテキストの結果的な大きさに対する比率で指定できるようにします。

- このスクリプトはテキストを扱う他のスクリプトから簡単に利用されるようにもできます。 スクリプトが生成した画像やレイヤーを返すよう関数を改造し、 他のスクリプトがこのスクリプトを呼び出して生成させた画像やレイヤーを利用できるように拡張しましょう。

#### 3.6.3. パラメーターと登録関数の変更

テキスト周りの余裕を設定できるよう、 メイン関数にパラメーターを追加して登録関数を変更します。

      (define (script-fu-text-box inTest inFont inFontSize inTextColor inBufferAmount)
      (let*
            (
               ; define our local variables
               ; create a new image: (新しい画像を作る局所変数を定義する)
               (theImageWidth  10)
               (theImageHeight 10)
               (theImage (car
                              (gimp-image-new
                               theImageWidth
                               theImageHeight
                               RGB
                              )
                         )
               )
               (theText)          ;a declaration for the text (テキストの定義)
                                  ;we create later (あとで作成するつもり)

               (theBuffer)        ;added (追加行)

               (theLayer
                         (car
                             (gimp-layer-new
                              theImage
                              theImageWidth
                              theImageHeight
                              RGB-IMAGE
                              "layer 1"
                              100
                              NORMAL
                             )
                         )
               )
            ) ;end of our local variables

       [Code here] (ここに中身のコードを書く)
     )

      (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
        SF-ADJUSTMENT  "Buffer amount" '(35 0 100 1 10 1 0)
                                                    ;a slider
      )
      (script-fu-menu-register "script-fu-text-box" "<Image>/Font/Create/Text")

#### 3.6.4. 新しいコードの追加

画像の寸法を変更する前と、 スクリプトの最後の 2 箇所にコードを追加してゆきます。 後者はできたばかりの新しい画像とそのレイヤーとテキストを返すためのコードです。

テキストの高さと幅が判ったら、 ユーザーが指定したテキスト周りの余裕の量 (`inBufferAmount`) に基づいてその大きさを変更します。 入力された値が正しく 0% から 100% までの範囲に収まっているかどうか確かめるエラーチェックについては、 何が起きても深刻にはなりえず、 また余裕の量に 200% などという法外な値をユーザーに指定させまいとする理由も見当たらないことから、 一切検査しません。

            (set! theBuffer (* theImageHeight (/ inBufferAmount 100) ) )

            (set! theImageHeight (+ theImageHeight theBuffer theBuffer) )
            (set! theImageWidth  (+ theImageWidth  theBuffer theBuffer) )

このコードが行なっているのはテキストの高さに基づいて余裕の量を算出し、 新たにできた画像の高さや幅にそれぞれ 2 度ずつ加えていることだけです。 縦にも横にも 2 度ずつ加算している理由は、 余裕の幅をテキストの両側に加える必要があるからです。

画像の寸法が変更できて余裕の幅がとれるようになったので、 つぎは画像の中央にテキストを配置しなくてはなりません。 これは (x, y) 座標で表すと (`theBuffer`, `theBuffer`) の位置にテキストを移動すればよろしい。 この処理の行を画像とレイヤーのサイズ変更のあとに加えました。

            (gimp-layer-set-offsets theText theBuffer theBuffer)

ここまでできたらスクリプトを保存して、 データベースを読み込み直してから試してみましょう。

もう残された課題は画像とレイヤーとテキストレイヤーの情報を返す処理だけです。

    (list theImage theLayer theText)

これが関数の最後に置かれる行です。 これで他のスクリプトから利用できるようになります。

他のスクリプトからテキストボックススクリプトを使う場合はつぎのようなコードを書くことになります。

            (set! theResult (script-fu-text-box
                             "Some text"
                             "Charter" "30"
                             '(0 0 0)
                             "35"
                            )
            )
            (gimp-image-flatten (car theResult))

おめでとう。 あなたは Script-Fu の黒帯への道を進んでいますよ。

[15] handy-dandy ⊇ オテテミテテアテテゴッコ

3.5. スクリプトを肉付け |  | 3.7. スクリプト作品とその稼動の様子

Bugzilla にてエラー報告