GIMP Script-fu

Artifact [587246ef63]
Login

Artifact 587246ef63c65baab83fa4a38d312c6d6991f070:


; 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 (sg-alpha-to-svg-file image drawable constraint target-directory)
  (define (get-real-layers image . fundament)
    (let ((fundament (if (pair? fundament)
                       (car fundament)
                       #f )))
      (let loop ((children (vector->list (cadr (if fundament
                                                 (gimp-item-get-children fundament)
                                                 (gimp-image-get-layers image) ))))
                 (layers '()) )
        (if (null? children)
          layers
          (loop (cdr children)
                (if (= TRUE (car (gimp-item-is-group (car children))))
                  (append layers (get-real-layers image (car children)))
                  (append layers (list (car children))) ))))))
  (gimp-image-undo-group-start image)
  (let loop ((layers (case constraint
                        ((0) ; all layers
                          (get-real-layers image) )
                       ((1) ; visibles
                         (let loop ((layers (get-real-layers image))
                                    (visibles '()) )
                           (if (null? layers)
                             (reverse visibles)
                             (loop (cdr layers)
                                   (if (= TRUE (car (gimp-item-get-visible (car layers))))
                                     (cons (car layers) visibles)
                                     visibles )))))
                       ((2) ; linked
                         (let loop ((layers (get-real-layers image))
                                    (linkeds '()) )
                           (if (null? layers)
                             (reverse linkeds)
                             (loop (cdr layers)
                                   (if (= TRUE (car (gimp-item-get-linked (car layers))))
                                     (cons (car layers) linkeds)
                                     visibles )))))
                       ((3) ; active
                         (list drawable) ))))
    (unless (null? layers)
      (let* ((layer (car layers))
             (name (car (gimp-item-get-name layer))) )
        (gimp-image-select-item image CHANNEL-OP-REPLACE layer)
        (plug-in-sel2path-advanced RUN-NONINTERACTIVE 
                                   image
                                   layer
                                   0.50    ; align-threshold
                                   60.00   ; corner-always-threshold
                                   4       ; corner-surround
                                   100.00  ; corner-threshold
                                   0.40    ; error-threshold
                                   1       ; filter-alternative-surround
                                   10.00   ; filter-epsilon
                                   4       ; filter-iteration-count
                                   0.33    ; filter-percent
                                   3       ; filter-secondary-surround
                                   2       ; filter-surround
                                   TRUE    ; keep-knees
                                   0.010   ; line-reversion-threshold
                                   0.50    ; line-threshold
                                   0.01    ; reparameterize-improvement
                                   1.00    ; reparameterize-threshold
                                   0.10    ; subdivide-search
                                   4       ; subdivide-surround
                                   0.03    ; subdivide-threshold
                                   3       ; tangent-surround
                                   )
        (let ((path (car (gimp-image-get-active-vectors image))))
          (gimp-vectors-export-to-file image 
                                       (if (> (length (strbreakup name ".svg")) 1)
                                         name 
                                         (string-append name ".svg") )
                                       path )
          (gimp-image-remove-vectors image path)
          (loop (cdr layers)) ))))
  (gimp-image-undo-group-end image)
  )

 (script-fu-register "sg-alpha-to-svg-file"
  "Save alpha to SVG..."
  "Save alpha to SVG using layer names as filenames"
  "Saul Goode"
  "Saul Goode"
  "January 2014"
  "RGB* GRAY*"
  SF-IMAGE "Image" 0
  SF-DRAWABLE "Drawable" 0
  SF-OPTION "Layers" '("All layers" "Visible layers" "Linked layers" "Active layer")
  SF-DIRNAME "Directory" ""
  )

(script-fu-menu-register "sg-alpha-to-svg-file"
  "<Image>/Filters/Misc/" )