GIMP Script-fu

Artifact Content
Login

Artifact f81f476d508010f1dde9190a3ff47afc602425fc:


; This program is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation; either version 2 of the License, or
; (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
; GNU General Public License for more details.

(define (script-fu-sg-anim-settings image drawable req-delay req-mode)
  (define (get-visibles image)
    (let loop ((layers (vector->list (cadr (gimp-image-get-layers image))))
               (visibles '()) )
      (if (null? layers)
        (if (null? visibles)
          visibles             ; 'reverse' can't handle NIL
          (reverse visibles) ) ; retain top-to-bottom order
        (loop (cdr layers)
              (if (zero? (car (gimp-drawable-get-visible (car layers))))
                visibles
                (cons (car layers) visibles) )))))
  (gimp-image-undo-group-start image)
  (let ((layers (get-visibles image)))
    (if (zero? (length layers))
      (gimp-message "Need at least one visible layer")
      (while (pair? layers)
        (let* ((full-name (strbreakup (car (gimp-drawable-get-name (car layers))) "("))
               (layer-name (car full-name))
               (par-name "")
               (mode "")
               (delay "") )
          (cond
            ((or (= req-mode 0) (= req-mode 3))
              (set! mode "") )
            ((= req-mode 1)
              (set! mode " (combine)") )
            ((= req-mode 2)
              (set! mode " (replace)") ))
          (set! full-name (cdr full-name))
          (while (pair? full-name) ;; for each parenthetical, see if it is a delay or a mode
            (let ((option (string-trim (car (strbreakup (car full-name) ")")))))
              (cond
                ((string-ci=? option "combine")
                  (if (= req-mode 0) ;; Keep
                    (set! mode " (combine)") ))
                ((string-ci=? option "replace")
                  (if (= req-mode 0) ;; Keep
                    (set! mode " (replace)") ))
                ((char-numeric? (string-ref option 0))
                  (if (= req-delay 0)
                    (set! delay (string-append "(" option ")"))
                    (set! delay "") )));; clear delay for -1 or for positive request
              (set! full-name (cdr full-name)) ))
          (if (> req-delay 0)
            (set! delay (string-append "(" (number->string req-delay) "ms)")) )
          (gimp-drawable-set-name (car layers) (string-append layer-name delay mode))
          (set! layers (cdr layers))
          )
        )
      )
    )
  (gimp-image-undo-group-end image)
  (gimp-displays-flush)
  )

(script-fu-register "script-fu-sg-anim-settings"
 "_Settings..." ;; might like to keep it separate from the standard plugins
 "Set the Frame delay and mode of GIF animations by renaming visible layers."
 "Saul Goode"
 "Saul Goode"
 "3/11/2006"
 "*"
 SF-IMAGE    "Image"    0
 SF-DRAWABLE "Drawable" 0
 SF-ADJUSTMENT "Delay: (1-10000 mS, 0=Keep, -1=Clear)" '( 100 -1 10000 1 10 0 1 )
 SF-OPTION "Mode:" '( "Keep" "(combine)" "(replace)" "Clear")
 )
(script-fu-menu-register "script-fu-sg-anim-settings"
  "<Image>/Filters/Animation"
  )