GIMP Script-fu

Artifact [b1eedfed7c]
Login

Artifact [b1eedfed7c]

Artifact b1eedfed7c61979320e4ad1064366f496624421e:


; 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.

; pre-2.8 COMPATIBILITY
  (when (not (defined? 'gimp-item-get-visible))
    (define gimp-item-get-visible gimp-drawable-get-visible)
    (define (gimp-item-is-group item) 0) ; no layer groups
    (define (gimp-image-insert-item image layer IGNORED position)
      (gimp-image-add-layer image layer position) ))
    
(define (script-fu-sg-shadow-all-layers image
                                        drawable
                                        shadow-transl-x
                                        shadow-transl-y
                                        shadow-blur
                                        shadow-color
                                        shadow-opacity
                                        allow-resize)
  (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 ((visibles (get-visibles image)))
    (map (lambda (x) (gimp-item-set-visible x FALSE))
         visibles )
    (let loop ((layers visibles))
      (unless (null? layers)
        (gimp-item-set-visible (car layers) TRUE)
        (gimp-image-set-active-layer image (car layers))
        (if (= TRUE (car (gimp-item-is-group (car layers))))
          (let ((layer (car (gimp-layer-new-from-visible image image "temp")) ))
            (gimp-image-insert-layer image layer 0 -1)
            (script-fu-drop-shadow image 
                                   layer
                                   shadow-transl-x
                                   shadow-transl-y
                                   shadow-blur
                                   shadow-color
                                   shadow-opacity
                                   allow-resize )
            (gimp-image-remove-layer image layer)
            (gimp-image-lower-item-to-bottom 
                image 
                (vector-ref (cadr (gimp-item-get-children (car layers)))
                            0 )))
          (script-fu-drop-shadow image 
                                 (car layers)
                                 shadow-transl-x
                                 shadow-transl-y
                                 shadow-blur
                                 shadow-color
                                 shadow-opacity
                                 allow-resize ))
        (gimp-item-set-visible (car layers) FALSE)
        (loop (cdr layers)) ))
    (map (lambda (x) (gimp-item-set-visible x TRUE))
         visibles ))
  (gimp-image-undo-group-end image)
  (gimp-displays-flush)
  )

(script-fu-register "script-fu-sg-shadow-all-layers"
 "Shadow All Layers" 
 "Apply Drop Shadow to all visible layers."
 "Saul Goode"
 "Saul Goode"
 "July 2013"
 "*"
  SF-IMAGE      "Image"           0
  SF-DRAWABLE   "Drawable"        0
  SF-ADJUSTMENT _"Offset X"       '(4 -4096 4096 1 10 0 1)
  SF-ADJUSTMENT _"Offset Y"       '(4 -4096 4096 1 10 0 1)
  SF-ADJUSTMENT _"Blur radius"    '(15 0 1024 1 10 0 1)
  SF-COLOR      _"Color"          "black"
  SF-ADJUSTMENT _"Opacity"        '(60 0 100 1 10 0 0)
  SF-TOGGLE     _"Allow resizing" TRUE
  )
(script-fu-menu-register "script-fu-sg-shadow-all-layers"
  "<Image>/Filters/Light and Shadow"
  )