; This program is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License Version 3.
; This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
; See the attached file or the link below.
; http://www.gnu.org/licenses/gpl-3.0.html
;
; Copyright (C) 2012 鉄(Tetsu) <web@ironsand.net>
; Webpage : http://gimp.ironsand.net/ (lang:jp)
;透明度を設定してlayerを返す
(define (fe-layer-set-opacity layer opacity)
(gimp-layer-set-opacity layer opacity)
layer)
;gimp-image-add-layerの処理後に追加したlayerを返すようにする
(define (fe-image-add-layer img layer position)
(gimp-image-add-layer img layer position)
layer)
;2つのレイヤーを指定した透明度で合成して作成
(define (fe-add-merged-transparent-layers img layer1 layer2 opacity1 opacity2)
(fe-image-add-layer img
(fe-layer-set-opacity
(car (gimp-layer-copy layer1 TRUE))
opacity1)
0)
(gimp-image-merge-down img (fe-image-add-layer img
(fe-layer-set-opacity
(car (gimp-layer-copy layer2 TRUE))
opacity2)
0) EXPAND-AS-NECESSARY))
(define (fe-opacity-list num)
(let ((quo (quotient 100 (+ 1 num)))
(re (remainder 100 (+ 1 num)))
(vec (make-vector (+ num 2) 0))
(i 1))
(while (< i (+ num 1))
(vector-set! vec i (+ (* quo i) (quotient re 2)))
(set! i (+ i 1)))
(vector-set! vec (+ num 1) 100)
(vector->list vec)))
(define (fe-add-reverse-opacity-list opacities)
(append opacities (cdr (reverse opacities))))
(define (script-fu-fe-gifanime-morph img drawable num time howlongstop fadeout?)
(if (= 2 (car (gimp-image-get-layers img)))
(begin
(let ((layer1 (vector-ref (car (cdr (gimp-image-get-layers img))) 0))
(layer2 (vector-ref (car (cdr (gimp-image-get-layers img))) 1)))
(gimp-image-undo-group-start img)
(map (lambda (opacity)
(fe-add-merged-transparent-layers img layer1 layer2 (- 100 opacity) opacity))
(if (eqv? fadeout? TRUE)
(fe-add-reverse-opacity-list (fe-opacity-list num))
(reverse (fe-opacity-list num)))
)
;レイヤーにGifアニメに必要な名前をつける
(let ((i 0)
(layers (cadr (gimp-image-get-layers img)))
(layer-num (- (car (gimp-image-get-layers img)) 2)))
(while (< i layer-num)
(gimp-drawable-set-name (vector-ref layers i)
(string-append "Frame " (number->string (- layer-num i)) " ("
(number->string (if (or (= (- layer-num (+ num 2)) i);変化後の画像でちょっと止める
(= (- layer-num 1) i))
howlongstop time))
"ms)"))
(set! i (+ i 1))))
(gimp-image-remove-layer img layer1)
(gimp-image-remove-layer img layer2)
(plug-in-animationoptimize 1 img (vector-ref (cadr (gimp-image-get-layers img)) 0))
(gimp-displays-flush)
(gimp-image-undo-group-end img)))))
(script-fu-register
"script-fu-fe-gifanime-morph"
"<Image>/Filters/Animation/Gif Anime Morph"
"Gif Anime Morph"
"Tetsu" ; Writer
"Tetsu" ; Copywrite
"2012/06"
""
SF-IMAGE "Image" 0
SF-DRAWABLE "Drawable" 0
SF-ADJUSTMENT "枚数" '(5 1 30 1 10 0 1)
SF-ADJUSTMENT "変化時間(ms)" '(200 50 3000 1 10 0 1)
SF-ADJUSTMENT "画像を止める時間(ms)" '(1500 100 10000 1 10 0 1)
SF-TOGGLE "フェードアウトもする" TRUE
)