26
26
; 1.03 - only call blur plugin when blut-radius >= 1.0
28
28
; Copyright (C) 1997-1999 Sven Neumann <sven@gimp.org>
31
31
; Blends two or more layers over a backgound, so that an animation can
32
32
; be saved. A minimum of three layers is required.
34
(define (multi-raise-layer image layer times)
36
(gimp-image-raise-layer image layer)
37
(set! times (- times 1))))
40
34
(define (script-fu-blend-anim img
45
(let* ((max-blur (max max-blur 0))
46
(frames (max frames 0))
47
(image (car (gimp-image-duplicate img)))
48
(width (car (gimp-image-width image)))
49
(height (car (gimp-image-height image)))
50
(layers (gimp-image-get-layers image))
51
(num-layers (car layers))
52
(layer-array (cadr layers))
53
(slots (- num-layers 2))
54
(bg-layer (aref layer-array (- num-layers 1)))
63
(gimp-image-undo-disable image)
66
; add a copy of the lowest blend layer on top
67
(let* ((copy (car (gimp-layer-copy
68
(aref layer-array (- num-layers 2)) TRUE))))
69
(gimp-image-add-layer image copy 0)
70
(set! layers (gimp-image-get-layers image))
71
(set! num-layers (car layers))
72
(set! layer-array (cadr layers))
73
(set! slots (- num-layers 2))
74
(set! bg-layer (aref layer-array (- num-layers 1)))))
76
; make all layers invisible and check for sizes
77
(let* ((min-offset-x width)
80
(gimp-drawable-set-visible bg-layer FALSE)
81
(while (> layer-count -1)
82
(let* ((layer (aref layer-array layer-count))
83
(layer-width (+ (car (gimp-drawable-width layer))
85
(layer-height (+ (car (gimp-drawable-height layer))
87
(layer-offsets (gimp-drawable-offsets layer))
88
(layer-offset-x (- (car layer-offsets) max-blur))
89
(layer-offset-y (- (cadr layer-offsets) max-blur)))
90
(gimp-drawable-set-visible layer FALSE)
91
(set! max-width (max max-width layer-width))
92
(set! max-height (max max-height layer-height))
93
(set! min-offset-x (min min-offset-x layer-offset-x))
94
(set! min-offset-y (min min-offset-y layer-offset-y))
95
(set! layer-count (- layer-count 1))))
96
(set! offset-x (- (car (gimp-drawable-offsets bg-layer))
98
(set! offset-y (- (cadr (gimp-drawable-offsets bg-layer))
101
; create intermediate frames by merging copies of adjascent layers
102
; with the background layer
103
(let* ((layer-count slots))
104
(while (> layer-count 0)
105
(let* ((frame-count frames)
106
(lower-layer (aref layer-array layer-count))
107
(upper-layer (aref layer-array (- layer-count 1))))
108
(while (> frame-count 0)
109
(let* ((opacity (* (/ frame-count (+ frames 1)) 100))
110
(blur (/ (* opacity max-blur) 100))
111
(upper-copy (car (gimp-layer-copy upper-layer TRUE)))
112
(lower-copy (car (gimp-layer-copy lower-layer TRUE)))
113
(bg-copy (car (gimp-layer-copy bg-layer TRUE))))
114
(gimp-image-add-layer image bg-copy 0)
115
(gimp-image-add-layer image lower-copy 0)
116
(gimp-image-add-layer image upper-copy 0)
117
(gimp-drawable-set-visible upper-copy TRUE)
118
(gimp-drawable-set-visible lower-copy TRUE)
119
(gimp-drawable-set-visible bg-copy TRUE)
120
(gimp-layer-set-opacity upper-copy (- 100 opacity))
121
(gimp-layer-set-opacity lower-copy opacity)
122
(gimp-layer-set-opacity bg-copy 100)
124
(let* ((layer-width (car (gimp-drawable-width upper-copy)))
125
(layer-height (car (gimp-drawable-height upper-copy))))
126
(gimp-layer-set-preserve-trans upper-copy FALSE)
127
(gimp-layer-resize upper-copy
128
(+ layer-width (* blur 2))
129
(+ layer-height (* blur 2))
138
(set! blur (- max-blur blur))
139
(gimp-layer-set-preserve-trans lower-copy FALSE)
140
(set! layer-width (car (gimp-drawable-width
142
(set! layer-height (car (gimp-drawable-height
144
(gimp-layer-resize lower-copy
145
(+ layer-width (* blur 2))
146
(+ layer-height (* blur 2))
155
(gimp-layer-resize bg-copy
160
(let* ((merged-layer (car (gimp-image-merge-visible-layers
161
image CLIP-TO-IMAGE))))
162
(gimp-drawable-set-visible merged-layer FALSE))
163
(set! frame-count (- frame-count 1))))
164
(set! layer-count (- layer-count 1)))))
166
; merge all original blend layers but the lowest one
167
; with copies of the background layer
168
(let* ((layer-count 0))
169
(while (< layer-count slots)
170
(let* ((orig-layer (aref layer-array layer-count))
171
(bg-copy (car (gimp-layer-copy bg-layer TRUE))))
172
(gimp-image-add-layer image
174
(* layer-count (+ frames 1)))
175
(multi-raise-layer image
177
(+ (* (- slots layer-count) frames) 1))
178
(gimp-drawable-set-visible orig-layer TRUE)
179
(gimp-drawable-set-visible bg-copy TRUE)
180
(gimp-layer-resize bg-copy
185
(let* ((merged-layer (car (gimp-image-merge-visible-layers
186
image CLIP-TO-IMAGE))))
187
(gimp-drawable-set-visible merged-layer FALSE))
188
(set! layer-count (+ layer-count 1)))))
190
; merge the lowest blend layer with the background layer
191
(let* ((orig-layer (aref layer-array (- num-layers 2))))
192
(gimp-drawable-set-visible bg-layer TRUE)
193
(gimp-drawable-set-visible orig-layer TRUE)
194
(gimp-image-merge-visible-layers image CLIP-TO-IMAGE))
196
; make all layers visible again
197
(let* ((result-layers (gimp-image-get-layers image))
198
(num-result-layers (car result-layers))
199
(result-layer-array (cadr result-layers))
200
(layer-count (- num-result-layers 1)))
201
(while (> layer-count -1)
202
(let* ((layer (aref result-layer-array layer-count))
203
(name (string-append "Frame "
205
(- num-result-layers layer-count) 10))))
206
(gimp-drawable-set-visible layer TRUE)
207
(gimp-drawable-set-name layer name)
208
(set! layer-count (- layer-count 1))))
211
; remove the topmost layer
212
(gimp-image-remove-layer image (aref result-layer-array 0))))
214
(gimp-image-undo-enable image)
215
(gimp-display-new image)
216
(gimp-displays-flush))
217
(gimp-message "Blend Animation needs at least three source layers"))))
40
(define (multi-raise-layer image layer times)
42
(gimp-image-raise-layer image layer)
43
(set! times (- times 1))
48
(max-blur (max max-blur 0))
49
(frames (max frames 0))
50
(image (car (gimp-image-duplicate img)))
51
(width (car (gimp-image-width image)))
52
(height (car (gimp-image-height image)))
53
(layers (gimp-image-get-layers image))
54
(num-layers (car layers))
55
(layer-array (cadr layers))
56
(slots (- num-layers 2))
57
(bg-layer (aref layer-array (- num-layers 1)))
66
(gimp-image-undo-disable image)
69
; add a copy of the lowest blend layer on top
70
(let* ((copy (car (gimp-layer-copy
71
(aref layer-array (- num-layers 2)) TRUE))))
72
(gimp-image-add-layer image copy 0)
73
(set! layers (gimp-image-get-layers image))
74
(set! num-layers (car layers))
75
(set! layer-array (cadr layers))
76
(set! slots (- num-layers 2))
77
(set! bg-layer (aref layer-array (- num-layers 1)))))
79
; make all layers invisible and check for sizes
80
(let* ((min-offset-x width)
83
(gimp-drawable-set-visible bg-layer FALSE)
84
(while (> layer-count -1)
85
(let* ((layer (aref layer-array layer-count))
86
(layer-width (+ (car (gimp-drawable-width layer))
88
(layer-height (+ (car (gimp-drawable-height layer))
90
(layer-offsets (gimp-drawable-offsets layer))
91
(layer-offset-x (- (car layer-offsets) max-blur))
92
(layer-offset-y (- (cadr layer-offsets) max-blur)))
93
(gimp-drawable-set-visible layer FALSE)
94
(set! max-width (max max-width layer-width))
95
(set! max-height (max max-height layer-height))
96
(set! min-offset-x (min min-offset-x layer-offset-x))
97
(set! min-offset-y (min min-offset-y layer-offset-y))
98
(set! layer-count (- layer-count 1))))
99
(set! offset-x (- (car (gimp-drawable-offsets bg-layer))
101
(set! offset-y (- (cadr (gimp-drawable-offsets bg-layer))
104
; create intermediate frames by merging copies of adjascent layers
105
; with the background layer
106
(let* ((layer-count slots))
107
(while (> layer-count 0)
108
(let* ((frame-count frames)
109
(lower-layer (aref layer-array layer-count))
110
(upper-layer (aref layer-array (- layer-count 1))))
111
(while (> frame-count 0)
112
(let* ((opacity (* (/ frame-count (+ frames 1)) 100))
113
(blur (/ (* opacity max-blur) 100))
114
(upper-copy (car (gimp-layer-copy upper-layer TRUE)))
115
(lower-copy (car (gimp-layer-copy lower-layer TRUE)))
116
(bg-copy (car (gimp-layer-copy bg-layer TRUE))))
117
(gimp-image-add-layer image bg-copy 0)
118
(gimp-image-add-layer image lower-copy 0)
119
(gimp-image-add-layer image upper-copy 0)
120
(gimp-drawable-set-visible upper-copy TRUE)
121
(gimp-drawable-set-visible lower-copy TRUE)
122
(gimp-drawable-set-visible bg-copy TRUE)
123
(gimp-layer-set-opacity upper-copy (- 100 opacity))
124
(gimp-layer-set-opacity lower-copy opacity)
125
(gimp-layer-set-opacity bg-copy 100)
127
(let* ((layer-width (car (gimp-drawable-width upper-copy)))
128
(layer-height (car (gimp-drawable-height upper-copy))))
129
(gimp-layer-set-lock-alpha upper-copy FALSE)
130
(gimp-layer-resize upper-copy
131
(+ layer-width (* blur 2))
132
(+ layer-height (* blur 2))
141
(set! blur (- max-blur blur))
142
(gimp-layer-set-lock-alpha lower-copy FALSE)
143
(set! layer-width (car (gimp-drawable-width
145
(set! layer-height (car (gimp-drawable-height
147
(gimp-layer-resize lower-copy
148
(+ layer-width (* blur 2))
149
(+ layer-height (* blur 2))
158
(gimp-layer-resize bg-copy
163
(let* ((merged-layer (car (gimp-image-merge-visible-layers
164
image CLIP-TO-IMAGE))))
165
(gimp-drawable-set-visible merged-layer FALSE))
166
(set! frame-count (- frame-count 1))))
167
(set! layer-count (- layer-count 1)))))
169
; merge all original blend layers but the lowest one
170
; with copies of the background layer
171
(let* ((layer-count 0))
172
(while (< layer-count slots)
173
(let* ((orig-layer (aref layer-array layer-count))
174
(bg-copy (car (gimp-layer-copy bg-layer TRUE))))
175
(gimp-image-add-layer image
177
(* layer-count (+ frames 1)))
178
(multi-raise-layer image
180
(+ (* (- slots layer-count) frames) 1))
181
(gimp-drawable-set-visible orig-layer TRUE)
182
(gimp-drawable-set-visible bg-copy TRUE)
183
(gimp-layer-resize bg-copy
188
(let* ((merged-layer (car (gimp-image-merge-visible-layers
189
image CLIP-TO-IMAGE))))
190
(gimp-drawable-set-visible merged-layer FALSE))
191
(set! layer-count (+ layer-count 1)))))
193
; merge the lowest blend layer with the background layer
194
(let* ((orig-layer (aref layer-array (- num-layers 2))))
195
(gimp-drawable-set-visible bg-layer TRUE)
196
(gimp-drawable-set-visible orig-layer TRUE)
197
(gimp-image-merge-visible-layers image CLIP-TO-IMAGE))
199
; make all layers visible again
200
(let* ((result-layers (gimp-image-get-layers image))
201
(num-result-layers (car result-layers))
202
(result-layer-array (cadr result-layers))
203
(layer-count (- num-result-layers 1)))
204
(while (> layer-count -1)
205
(let* ((layer (aref result-layer-array layer-count))
206
(name (string-append "Frame "
208
(- num-result-layers layer-count) 10))))
209
(gimp-drawable-set-visible layer TRUE)
210
(gimp-drawable-set-name layer name)
211
(set! layer-count (- layer-count 1))))
214
; remove the topmost layer
215
(gimp-image-remove-layer image (aref result-layer-array 0))))
217
(gimp-image-undo-enable image)
218
(gimp-display-new image)
219
(gimp-displays-flush)
222
(gimp-message _"Blend Animation needs at least three source layers")
219
227
(script-fu-register "script-fu-blend-anim"
221
"Blend two or more layers over a background, so that an
222
animation can be saved"
223
"Sven Neumann <sven@gimp.org>"
228
SF-DRAWABLE "Drawable" 0
229
SF-ADJUSTMENT _"Intermediate frames" '(3 1 1024 1 10 0 1)
230
SF-ADJUSTMENT _"Max. blur radius" '(0 0 1024 1 10 0 1)
231
SF-TOGGLE _"Looped" TRUE)
229
_"Create intermediate layers to blend two or more layers over a background as an animation"
230
"Sven Neumann <sven@gimp.org>"
235
SF-DRAWABLE "Drawable" 0
236
SF-ADJUSTMENT _"Intermediate frames" '(3 1 1024 1 10 0 1)
237
SF-ADJUSTMENT _"Max. blur radius" '(0 0 1024 1 10 0 1)
238
SF-TOGGLE _"Looped" TRUE
233
241
(script-fu-menu-register "script-fu-blend-anim"
234
_"<Image>/Script-Fu/Animators")
242
"<Image>/Filters/Animation/Animators")