GIMP Script-fu

Artifact [6b3b7ce501]
Login

Artifact 6b3b7ce501bacfe547e697787df337d6366b14ed:


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

; Scale each of the rows of the current layer to fit the selection
;

(define (script-fu-sg-contour-fill image drawable)
  (let  ((bounds (gimp-selection-bounds image)))
    (unless (zero? (car bounds))
      (gimp-image-undo-group-start image)
      (set! bounds (cdr bounds))
      (let* ((contour-layer (car (gimp-layer-copy drawable TRUE)))
             (orig-sel (car (gimp-selection-save image)))
             (offset-y (cadr bounds))
             (offset-x (car bounds))
             (width (- (caddr bounds) (car bounds)))
             (height (- (cadddr bounds) (cadr bounds)))
             )
        (gimp-image-add-layer image contour-layer -1)
        (gimp-layer-scale-full contour-layer 
                               width
                               height
                               TRUE
                               INTERPOLATION-CUBIC )
        (gimp-layer-set-offsets contour-layer 0 0)
        (let loop ((row height))
          (unless (zero? row)
            (gimp-selection-load orig-sel)
            (gimp-rect-select image offset-x (- (+ offset-y row) 1) width 1 CHANNEL-OP-INTERSECT 0 0)
            (set! bounds (gimp-selection-bounds image))
            (gimp-rect-select image 0 (- row 1) width 1 CHANNEL-OP-REPLACE 0 0)
            (if (zero? (car bounds))
              (gimp-edit-clear contour-layer)
              (unless (zero? (car (gimp-drawable-mask-intersect contour-layer)))
                (let ((floating-sel (car (gimp-selection-float contour-layer 0 0))))
                  (gimp-layer-scale-full floating-sel 
                                         (- (cadddr bounds) (cadr bounds) )
                                         1
                                         FALSE
                                         INTERPOLATION-CUBIC )
                  (gimp-layer-set-offsets floating-sel (- (cadr bounds) offset-x) (- row 1))
                  (gimp-floating-sel-anchor floating-sel) )))
            (loop (- row 1)) ))
        (gimp-layer-set-offsets contour-layer offset-x offset-y)
        (gimp-selection-load orig-sel)
        (gimp-selection-invert image)
        (gimp-edit-clear contour-layer)
        (gimp-selection-invert image)
        (gimp-image-remove-channel image orig-sel)
        (gimp-image-undo-group-end image)
        (gimp-displays-flush) ))))

(script-fu-register "script-fu-sg-contour-fill"
  "Contour Fill Selection"
  "Scale each row of layer to fit selection"
  "Saul Goode"
  "Saul Goode"
  "Feb 2012"
  "RGB*"
  SF-IMAGE    "Image"    0
  SF-DRAWABLE "Drawable"  0 )
  
(script-fu-menu-register "script-fu-sg-contour-fill"
  "<Image>/Filters/Distorts" )