Gimp/plug-ins/script-fu/scripts/ripply-anim.scm
Jehan e2d7cc163e app, pdb, plug-ins: replace (plug-in-displace).
For plug-in writers reference, these are equivalent:

- (plug-in-displace RUN-NONINTERACTIVE work-image frame-layer
-                   x-displacement y-displacement
-                   TRUE TRUE aux1 aux2 abyss))
+ (let* ((abyss "black")
+        (filter (car (gimp-drawable-filter-new frame-layer "gegl:displace" ""))))
+
+   (if (= edge-type 1) (set! abyss "loop"))
+   (if (= edge-type 2) (set! abyss "clamp"))
+
+   (gimp-drawable-filter-configure filter LAYER-MODE-REPLACE 1.0
+                                   "amount-x" x-displacement "amount-x" y-displacement "abyss-policy" abyss
+                                   "sampler-type" "cubic" "displace-mode" "cartesian")
+   (gimp-drawable-filter-set-aux-input filter "aux" aux1)
+   (gimp-drawable-filter-set-aux-input filter "aux2" aux2)
+   (gimp-drawable-merge-filter frame-layer filter)
+ )

I also changed a test which (I think) was just a no-op since do-x and
do-y were 0 0 (hence FALSE). Therefore the whole filter processing was
ignored. Note though that unlike the rippling animation filter, I
haven't tested the test script.
2024-12-17 16:24:54 +00:00

96 lines
4.6 KiB
Scheme

; "Rippling Image" animation generator (ripply-anim.scm)
; Adam D. Moss (adam@foxbox.org)
; 97/05/18
; Revised by Saul Goode April 2015.
;
; Designed to be used in conjunction with a plugin capable
; of saving animations (i.e. the GIF plugin).
;
(define (script-fu-ripply-anim image drawables displacement num-frames edge-type)
(let* ((drawable (vector-ref (car (gimp-image-get-selected-drawables image)) 0))
(width (car (gimp-drawable-get-width drawable)))
(height (car (gimp-drawable-get-height drawable)))
(work-image (car (gimp-image-new width
height
(quotient (car (gimp-drawable-type drawable))
2))))
(map-layer (car (gimp-layer-new work-image
width
height
(car (gimp-drawable-type drawable))
"Ripple Map"
100
LAYER-MODE-NORMAL))))
(gimp-context-push)
(gimp-context-set-paint-mode LAYER-MODE-NORMAL)
(gimp-context-set-opacity 100.0)
(gimp-image-undo-disable work-image)
; Create a tile-able displacement map in the first layer
(gimp-context-set-background '(127 127 127))
(gimp-image-insert-layer work-image map-layer 0 0)
(gimp-drawable-edit-fill map-layer FILL-BACKGROUND)
(gimp-drawable-merge-new-filter map-layer "gegl:noise-rgb" 0 LAYER-MODE-REPLACE 1.0
"independent" FALSE "red" 1.0 "alpha" 0.0
"correlated" FALSE "seed" (msrg-rand) "linear" TRUE)
(plug-in-tile RUN-NONINTERACTIVE work-image (vector map-layer) (* width 3) (* height 3) FALSE)
(gimp-drawable-merge-new-filter map-layer "gegl:gaussian-blur" 0 LAYER-MODE-REPLACE 1.0 "std-dev-x" 11.2 "std-dev-y" 11.2 "filter" "auto")
(gimp-drawable-equalize map-layer TRUE)
(gimp-drawable-merge-new-filter map-layer "gegl:gaussian-blur" 0 LAYER-MODE-REPLACE 1.0 "std-dev-x" 1.6 "std-dev-y" 1.6 "filter" "auto")
(gimp-drawable-equalize map-layer TRUE)
(gimp-image-crop work-image width height width height)
; Create the frame layers
(let loop ((remaining-frames num-frames))
(unless (zero? remaining-frames)
(let ((frame-layer (car (gimp-layer-new-from-drawable drawable work-image))))
(gimp-image-insert-layer work-image frame-layer 0 0)
(gimp-item-set-name frame-layer
(string-append "Frame "
(number->string (+ 1 (- num-frames
remaining-frames)))
" (replace)"))
(let* ((abyss "black")
(filter (car (gimp-drawable-filter-new frame-layer "gegl:displace" ""))))
(if (= edge-type 0) (set! abyss "loop"))
(if (= edge-type 1) (set! abyss "clamp"))
(gimp-drawable-filter-configure filter LAYER-MODE-REPLACE 1.0
"amount-x" displacement "amount-x" displacement "abyss-policy" abyss
"sampler-type" "cubic" "displace-mode" "cartesian")
(gimp-drawable-filter-set-aux-input filter "aux" map-layer)
(gimp-drawable-filter-set-aux-input filter "aux2" map-layer)
(gimp-drawable-merge-filter frame-layer filter)
)
(gimp-item-set-visible frame-layer TRUE))
(gimp-drawable-offset map-layer
TRUE
OFFSET-COLOR
(car (gimp-context-get-background))
(/ width num-frames)
(/ height num-frames))
(loop (- remaining-frames 1))))
(gimp-image-remove-layer work-image map-layer)
(gimp-image-undo-enable work-image)
(gimp-display-new work-image)
(gimp-context-pop)))
(script-fu-register-filter "script-fu-ripply-anim"
_"_Rippling..."
_"Create a multi-layer image by adding a ripple effect to the current layer"
"Adam D. Moss (adam@foxbox.org), Saul Goode"
"Adam D. Moss, Saul Goode"
"1997, 2015"
"RGB* GRAY*"
SF-ONE-DRAWABLE
SF-ADJUSTMENT _"Ri_ppling strength" '(3 0 256 1 10 1 0)
SF-ADJUSTMENT _"_Number of frames" '(15 0 256 1 10 0 1)
SF-OPTION _"Edge _behavior" '(_"Wrap" _"Smear" _"Black")
)
(script-fu-menu-register "script-fu-ripply-anim"
"<Image>/Filters/Animation/")