summaryrefslogtreecommitdiffstats
path: root/plug-ins/script-fu/scripts/ripply-anim.scm
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--plug-ins/script-fu/scripts/ripply-anim.scm83
1 files changed, 83 insertions, 0 deletions
diff --git a/plug-ins/script-fu/scripts/ripply-anim.scm b/plug-ins/script-fu/scripts/ripply-anim.scm
new file mode 100644
index 0000000..25a2462
--- /dev/null
+++ b/plug-ins/script-fu/scripts/ripply-anim.scm
@@ -0,0 +1,83 @@
+; "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 drawable displacement num-frames edge-type)
+ (let* ((width (car (gimp-drawable-width drawable)))
+ (height (car (gimp-drawable-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)
+ (plug-in-noisify RUN-NONINTERACTIVE work-image map-layer FALSE 1.0 1.0 1.0 0.0)
+ (plug-in-tile RUN-NONINTERACTIVE work-image map-layer (* width 3) (* height 3) FALSE)
+ (plug-in-gauss-iir RUN-NONINTERACTIVE work-image map-layer 35 TRUE TRUE)
+ (gimp-drawable-equalize map-layer TRUE)
+ (plug-in-gauss-rle RUN-NONINTERACTIVE work-image map-layer 5 TRUE TRUE)
+ (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)"))
+ (plug-in-displace RUN-NONINTERACTIVE work-image frame-layer
+ displacement displacement
+ TRUE TRUE map-layer map-layer (+ edge-type 1))
+ (gimp-item-set-visible frame-layer TRUE))
+ (gimp-drawable-offset map-layer
+ TRUE
+ OFFSET-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 "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-IMAGE "Image to animage" 0
+ SF-DRAWABLE "Drawable to animate" 0
+ SF-ADJUSTMENT _"Rippling 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/Animators")