GIMP Script-fu

Artifact [c6177dd543]
Login

Artifact [c6177dd543]

Artifact c6177dd543c9be50c4d51e25fcbde7282a7c4207:


; 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-pattern-border image drawable tiles-per-side expand??)
 (let* ((layer (car (gimp-image-get-active-layer image)))
         (tile 0)
         (floated 0)
         (bounds (cdr (gimp-drawable-mask-bounds layer)))
         (width (car (gimp-image-width image)))
         (height (car (gimp-image-height image)))
         (layer-width (car (gimp-drawable-width layer)))
         (layer-height (car (gimp-drawable-height layer)))
         (lx1 (car (gimp-drawable-offsets layer)))
         (ly1 (cadr (gimp-drawable-offsets layer)))
         (lx2 (+ lx1 layer-width))
         (ly2 (+ ly1 layer-height))
         (tile-width (/ layer-width (- tiles-per-side 2)))
         (tile-height (/ layer-height (- tiles-per-side 2)))
         (temp-layer 0)
         (orig-sel 0)
         (buffer "") )
    (gimp-image-undo-group-start image)
    (set! orig-sel (car (gimp-selection-save image)))
    (set! buffer (car (gimp-edit-named-copy layer "temp")))
    (set! tile (car (gimp-edit-named-paste layer buffer FALSE)))
    (gimp-floating-sel-to-layer tile)
    (gimp-layer-scale tile (ceiling tile-width) (ceiling tile-height) TRUE)
    (gimp-layer-set-offsets tile (- lx1 tile-width) (- ly1 tile-height))
    (gimp-image-set-active-layer image tile)
    (set! temp-layer (car (gimp-layer-copy tile TRUE)))
    (gimp-image-add-layer image temp-layer -1)
    (gimp-layer-set-offsets temp-layer (- lx1 tile-width) ly2)
    (set! temp-layer (car (gimp-layer-copy tile TRUE)))
    (gimp-image-add-layer image temp-layer -1)
    (gimp-layer-set-offsets temp-layer lx2 (- ly1 tile-height))
    (gimp-image-merge-down image temp-layer EXPAND-AS-NECESSARY)
    (set! temp-layer (car (gimp-layer-copy tile TRUE)))
    (gimp-image-add-layer image temp-layer -1)
    (gimp-layer-set-offsets temp-layer lx2 ly2)
    (set! temp-layer (car (gimp-image-merge-down image temp-layer EXPAND-AS-NECESSARY)))
    (let loop ((cnt (- tiles-per-side 2))
               (x1 lx1)
               (x2 lx2) )
      (if (<= cnt 0)
        #t
        (begin
          (set! temp-layer (car (gimp-layer-copy tile TRUE)))
          (gimp-image-add-layer image temp-layer -1)
          (gimp-layer-set-offsets temp-layer x1 (- ly1 tile-height))
          (gimp-image-merge-down image temp-layer EXPAND-AS-NECESSARY)
          (set! temp-layer (car (gimp-layer-copy tile TRUE)))
          (gimp-image-add-layer image temp-layer -1)
          (gimp-layer-set-offsets temp-layer x2 (- ly1 tile-height))
          (gimp-image-merge-down image temp-layer EXPAND-AS-NECESSARY)
          (set! temp-layer (car (gimp-layer-copy tile TRUE)))
          (gimp-image-add-layer image temp-layer -1)
          (gimp-layer-set-offsets temp-layer x1 ly2)
          (gimp-image-merge-down image temp-layer EXPAND-AS-NECESSARY)
          (set! temp-layer (car (gimp-layer-copy tile TRUE)))
          (gimp-image-add-layer image temp-layer -1)
          (gimp-layer-set-offsets temp-layer x2 ly2)
          (gimp-image-merge-down image temp-layer EXPAND-AS-NECESSARY)
          (loop (- cnt 1) (+ x1 tile-width) (- x2 tile-width)) ) ) )

    (let loop ((cnt (- tiles-per-side 2))
               (y1 ly1)
               (y2 ly2) )
      (if (<= cnt 0)
        #t
        (begin
          (set! temp-layer (car (gimp-layer-copy tile TRUE)))
          (gimp-image-add-layer image temp-layer -1)
          (gimp-layer-set-offsets temp-layer (- lx1 tile-width) y1)
          (gimp-image-merge-down image temp-layer EXPAND-AS-NECESSARY)
          (set! temp-layer (car (gimp-layer-copy tile TRUE)))
          (gimp-image-add-layer image temp-layer -1)
          (gimp-layer-set-offsets temp-layer (- lx1 tile-width) y2)
          (gimp-image-merge-down image temp-layer EXPAND-AS-NECESSARY)
          (set! temp-layer (car (gimp-layer-copy tile TRUE)))
          (gimp-image-add-layer image temp-layer -1)
          (gimp-layer-set-offsets temp-layer lx2 y1)
          (gimp-image-merge-down image temp-layer EXPAND-AS-NECESSARY)
          (set! temp-layer (car (gimp-layer-copy tile TRUE)))
          (gimp-image-add-layer image temp-layer -1)
          (gimp-layer-set-offsets temp-layer lx2 y2)
          (gimp-image-merge-down image temp-layer EXPAND-AS-NECESSARY)
          (loop (- cnt 1) (+ y1 tile-height) (- y2 tile-height)) )))
    (set! temp-layer
          (car (gimp-image-merge-down image
                                      (car (gimp-image-get-active-layer image))
                                      EXPAND-AS-NECESSARY )))
    (unless (zero? expand??)
      (let ((x1 (min 0 (car  (gimp-drawable-offsets temp-layer))))
            (y1 (min 0 (cadr (gimp-drawable-offsets temp-layer))))
            (x2 (max width (+ (car  (gimp-drawable-offsets temp-layer))
                              (car (gimp-drawable-width  temp-layer)) )))
            (y2 (max height (+ (cadr (gimp-drawable-offsets temp-layer))
                               (car (gimp-drawable-height temp-layer)) ))) )
        (gimp-image-resize image (- x2 x1) (- y2 y1) (- x1) (- y1)) ))
    (gimp-drawable-set-name temp-layer "Border")
    (gimp-image-lower-layer image temp-layer)
    (gimp-selection-load orig-sel)
    (gimp-image-remove-channel image orig-sel)
    (gimp-buffer-delete buffer)
    (gimp-displays-flush)
    (gimp-image-undo-group-end image)
    )
  )

(script-fu-register "script-fu-sg-pattern-border"
 "Pattern border..."
 "Create border around layer using scaled selected region"
 "Saul Goode"
 "Saul Goode"
 "April 2011"
 "RGB*,GRAY*"
 SF-IMAGE    "Image"    0
 SF-DRAWABLE "Drawable" 0
 SF-ADJUSTMENT "Tiles per side" '(6 3 20 1 1 0 0)
 SF-TOGGLE "Expand as necessary?" TRUE
 )
(script-fu-menu-register "script-fu-sg-pattern-border"
 "<Image>/Filters/Decor"
 )