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

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

When creating a script, you want to give your users the ability to undo their actions, should they make a mistake. This is easily accomplished by calling the functions gimp-image-undo-group-start and gimp-image-undo-group-end around the code that manipulates the image. You can think of them as matched statements that let GIMP know when to start and stop recording manipulations on the image, so that those manipulations can later be undone.

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

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

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

今やテキストボックスを作るとっても素敵便利な[6]スクリプトができているので、 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
                           "layer 1"
                          theImageWidth
                          theImageHeight
                          RGB-IMAGE
                          100
                          LAYER-MODE-NORMAL
                         )
                     )
           )
        ) ;end of our local variables

   [Code here]
 )
      
  (script-fu-register
    "script-fu-text-box"                        ;function 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>/Filters/Tutorial")
      

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)
      

Go ahead and save your script, and try it out after restarting GIMP.

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

(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 の黒帯への道を進んでいますよ。



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