Top > ScriptFuClass > Repeater

CENTER:[[放課後>ScriptFuClass/Staying]] | [[Script-Fu 青空教室>ScriptFuClass]] | 
CENTER:[[居残り>ScriptFuClass/Staying]] | [[Script-Fu 青空教室>ScriptFuClass]] | 

-----

* 留年生 過去バージョンのスクリプト [#a2bfb929]

#contents


ここでは、昔のバージョンのスクリプトを新しいバージョンの GIMP でも動作するように修正する方法について述べます。

**なぜバージョン違いによってスクリプトが動作しないのか? [#sb0cc8fd]

昔の GIMP では正しく動作していたスクリプトが、新しい GIMP では動作しないということが発生することがあります。
その原因については、大きく分けて二つのケースがあります。

:1. Scrupt-Fu 内部仕様の違いのため|GIMP-2.4 以降から、Script-Fu 内部の Scheme インタプリタが SIOD から TinySchme に置き換わっています。これによりスクリプトの記述方法に若干の変更がありました。よく遭遇する変更としては、set! 構文の使える範囲が変わったことです。

:2. GIMP 関数の名前が変更になったため|新しい GIMPでは、GIMP 自体の内部関数の名前が別の名前に置き換わったものがあります。これらの関数の名前は以前のバージョンとの互換性のため、しばらくの間は新しい方と古い方の両方の関数を使用できますが警告が表示されます。そして最新のバージョンの GIMP では使用できなくなるかもしれません。


**スクリプトの修正 [#odfb6ddb]

***TinySchme の仕様に書き換える [#yee26e75]

-''set! 構文の変更''

昔のバージョンでは set! 構文で変数を事前宣言なしに使用することができていました。変数は大域変数のように自由に使えていたのですが、TinySchme では変数の有効範囲が厳密化され、変数は局所変数として使用することになります。

%%%set! で変数を使用する前に、let* や let 構文で事前に使用する変数をすべて宣言する必要があります。%%%


実際にレイヤー複製スクリプトで見ていきましょう。


エラーになる例

 (define (script-fu-duplicate-layer img layer)
 
   (set! copy-layer (car (gimp-layer-copy layer TRUE)))
   (gimp-image-add-layer img copy-layer -1)
   (gimp-displays-flush)
 )


エラーの修正例 その1

 (define (script-fu-duplicate-layer img layer)
   (let* (
          (copy-layer (car (gimp-layer-copy layer TRUE)))
         )
     (gimp-image-add-layer img copy-layer -1)
     (gimp-displays-flush)
   )
 )

エラーの修正例 その2

 (define (script-fu-duplicate-layer img layer)
   (let* (
          (copy-layer '())
         )
     (set! copy-layer (car (gimp-layer-copy layer TRUE)))
     (gimp-image-add-layer img copy-layer -1)
     (gimp-displays-flush)
   )
 )

変数 copy-layer を、エラーになる例では事前宣言なしですぐに set! で使用していました。そのためエラーとなります。

修正例その2では copy-layer を一旦 let* 構文で宣言してから、set! 構文で使用しています。(最初の宣言では '() でダミーのリストを宣言している)
この copy-layer 変数を使用できる有効範囲は let* 構文の範囲内に限ります。(局所変数の有効範囲)

局所変数の有効範囲は、修正例その1で言うと (gimp-image-add-layer と (gimp-displays-flush) の二行がありますが、その後の括弧閉じまでになります。

&br;
-''変更となった関数''

SIDO 関数から TinyScheme 関数への変更が推奨されているものです。将来の GIMP バージョンで使用できなくなります。

|変更前|変更後|h
|aset|vector-set!|
|aref|vector-ref|
|fopen|open-input-file|
|mapcar|map|
|nil|'()|
|nreverse|reverse|
|pow|expt|
|prin1|write|
|print|write (along with newline)|
|strcat|string-append|
|string-lessp|string<?|
|symbol-bound?|defined?|
|the-environment|current-environment|
|*pi*|(* 4 (atan 1.0))|
|butlast|(reverse (cdr (reverse x)))|
|cons-array|make-vector|

&br;
-''これ以外の変更要素''

これら以外の変更要素についてはこちらのサイトを読んでください。
[[http://www.gimp.org/docs/script-fu-update.html>http://www.gimp.org/docs/script-fu-update.html]]


***GIMP 関数名を新しいものに直す [#q21106c0]

GIMP 本体が持っている関数のうち、いくつかの関数は GIMP の内部仕様の変化により関数名が変更になっていることがあります。
例えば gimp-drawable-* 関数や gimp-layer/channel 関数のうちのいくつかは、別々に存在していたものが同等の働きをする gimp-item-* 関数へと一つに統合されています。

修正前

 (define (script-fu-duplicate-layer img layer)
   (let* (
          (copy-layer (car (gimp-layer-copy layer TRUE)))
         )
     (gimp-image-add-layer img copy-layer -1)
     (gimp-displays-flush)
   )
 )

修正後

 (define (script-fu-duplicate-layer img layer)
   (let* (
          (copy-layer (car (gimp-layer-copy layer TRUE)))
         )
     (gimp-image-insert-layer img copy-layer 0 -1)
     (gimp-displays-flush)
   )
 )

この修正例では gimp-image-add-layer 関数が gimp-image-insert-layer に名前が変わっています。そして関数名が変わっただけでなく、引数の数も3つから4つに増えています。具体的には parent パラメーターです。

[[gimp-image-add-layer>http://developer.gimp.org/api/2.0/libgimp/libgimp-gimpimage.html#gimp-image-add-layer]]
#ref(./gimp-image-add-layer.png,nolink)

[[gimp-image-insert-layer>http://developer.gimp.org/api/2.0/libgimp/libgimp-gimpimage.html#gimp-image-insert-layer]]
#ref(./gimp-image-insert-layer.png,nolink)

このように関数名が変わっただけでなく引数の変化にも注意しましょう。

&br;
-''非推奨な GIMP 関数''

いずれ古くなるために GIMP PDBで使用が推奨されておらず、新しい関数の使用が推奨されているものの一覧です。

[[Index of deprecated symbols>http://developer.gimp.org/api/2.0/libgimp/libgimp-index-deprecated.html]]

Backup   RSS of recent changes