; 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"
)