Files
gimp/plug-ins/script-fu/scripts/tileblur.scm
lloyd konneker 1846f91305 Fix #6026, SF scripts use v3 API for multilayer gimp-edit-copy, -cut, -paste.
Why: in v3 the signature for gimp-edit-foo PDB procedures changed to support multilayer selection.

This finishes the task for ScriptFu scripts in the GIMP repo.
This is not a complete list, since some calls were changed incidentally by prior commits.
You can grep for "edit-copy" etc. in script-fu/scripts to find instances.

This also makes incidental changes, to script calls to plug-in-tile,
which now also has a changed signature to support multilayer.

The changes are simple code transformations.
The changes to gimp-edit-paste calls are more complex,
a mixed bag of a few lines transformed to more lines.
I did not try to understand the larger logic of the changed plugins.
I did not test the changed plugins functionally.
I used a harness to call each changed plugin with improvised parameters,
only checking that the test plugin did not throw runtime errors,
not checking that they produced correct images.

As noted in the issue, this might be undone if the original signatures
for gimp-edit-foo are restored as convenience functions.
2022-05-06 20:44:33 +00:00

88 lines
3.0 KiB
Scheme

; Chris Gutteridge (cjg@ecs.soton.ac.uk)
; At ECS Dept, University of Southampton, England.
; 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 3 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.
;
; You should have received a copy of the GNU General Public License
; along with this program. If not, see <https://www.gnu.org/licenses/>.
(define (script-fu-tile-blur inImage inLayer inRadius inVert inHoriz inType)
(let* (
(theImage inImage)
(theLayer inLayer)
(theHeight (car (gimp-drawable-get-height theLayer)))
(theWidth (car (gimp-drawable-get-width theLayer)))
)
(define (pasteat xoff yoff)
(let* (
(pasted (gimp-edit-paste theLayer FALSE))
(num-pasted (car pasted))
(floating-sel (aref (cadr pasted) (- num-pasted 1)))
)
(gimp-layer-set-offsets floating-sel (* xoff theWidth) (* yoff theHeight) )
(gimp-floating-sel-anchor floating-sel)
)
)
(gimp-context-push)
(gimp-context-set-feather FALSE)
(gimp-image-undo-group-start theImage)
(gimp-layer-resize theLayer (* 3 theWidth) (* 3 theHeight) 0 0)
(gimp-image-select-rectangle theImage CHANNEL-OP-REPLACE 0 0 theWidth theHeight)
(gimp-edit-cut 1 (vector theLayer))
(gimp-selection-none theImage)
(gimp-layer-set-offsets theLayer theWidth theHeight)
(pasteat 1 1) (pasteat 1 2) (pasteat 1 3)
(pasteat 2 1) (pasteat 2 2) (pasteat 2 3)
(pasteat 3 1) (pasteat 3 2) (pasteat 3 3)
(gimp-selection-none theImage)
(if (= inType 0)
(plug-in-gauss-iir RUN-NONINTERACTIVE
theImage theLayer inRadius inHoriz inVert)
(plug-in-gauss-rle RUN-NONINTERACTIVE
theImage theLayer inRadius inHoriz inVert)
)
(gimp-layer-resize theLayer
theWidth theHeight (- 0 theWidth) (- 0 theHeight))
(gimp-layer-set-offsets theLayer 0 0)
(gimp-image-undo-group-end theImage)
(gimp-displays-flush)
(gimp-context-pop)
)
)
(script-fu-register "script-fu-tile-blur"
_"_Tileable Blur..."
_"Blur the edges of an image so the result tiles seamlessly"
"Chris Gutteridge"
"1998, Chris Gutteridge / ECS dept, University of Southampton, England."
"25th April 1998"
"RGB*"
SF-IMAGE "The Image" 0
SF-DRAWABLE "The Layer" 0
SF-ADJUSTMENT _"Radius" '(5 0 128 1 1 0 0)
SF-TOGGLE _"Blur vertically" TRUE
SF-TOGGLE _"Blur horizontally" TRUE
SF-OPTION _"Blur type" '(_"IIR" _"RLE")
)
(script-fu-menu-register "script-fu-tile-blur"
"<Image>/Filters/Blur")