Files
gimp/plug-ins/script-fu/scripts/lava.scm
Alx Sa 4b54ceb023 plug-ins: Fix lava filter for non-square selections
Resolves issue #9809, fix by @mareroqpoland.
When "Separate Layer" is selected, the entire drawable is always
filled rather than using the selection. This patch uses the selection
instead (which will be "all" if there is no active selection)
2023-07-30 22:24:49 +00:00

148 lines
5.7 KiB
Scheme

; GIMP - The GNU Image Manipulation Program
; Copyright (C) 1995 Spencer Kimball and Peter Mattis
;
; Lava effect
; Copyright (c) 1997 Adrian Likins
; aklikins@eos.ncsu.edu
;
; based on a idea by Sven Riedel <lynx@heim8.tu-clausthal.de>
; tweaked a bit by Sven Neumann <neumanns@uni-duesseldorf.de>
;
; 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-lava image
drawable
seed
tile_size
mask_size
gradient
keep-selection
separate-layer
current-grad)
(let* (
(type (car (gimp-drawable-type-with-alpha drawable)))
(image-width (car (gimp-image-get-width image)))
(image-height (car (gimp-image-get-height image)))
(active-selection 0)
(selection-bounds 0)
(select-offset-x 0)
(select-offset-y 0)
(select-width 0)
(select-height 0)
(lava-layer 0)
(active-layer 0)
(selected-layers (gimp-image-get-selected-layers image))
(num-selected-layers (car selected-layers))
(selected-layers-array (cadr selected-layers))
)
(if (= num-selected-layers 1)
(begin
(gimp-context-push)
(gimp-context-set-defaults)
(gimp-image-undo-group-start image)
(if (= (car (gimp-drawable-has-alpha drawable)) FALSE)
(gimp-layer-add-alpha drawable)
)
(if (= (car (gimp-selection-is-empty image)) TRUE)
(gimp-image-select-item image CHANNEL-OP-REPLACE drawable)
)
(set! active-selection (car (gimp-selection-save image)))
(gimp-image-set-selected-layers image 1 (make-vector 1 drawable))
(set! selection-bounds (gimp-selection-bounds image))
(set! select-offset-x (cadr selection-bounds))
(set! select-offset-y (caddr selection-bounds))
(set! select-width (- (cadr (cddr selection-bounds)) select-offset-x))
(set! select-height (- (caddr (cddr selection-bounds)) select-offset-y))
(if (= separate-layer TRUE)
(begin
(set! lava-layer (car (gimp-layer-new image
select-width
select-height
type
"Lava Layer"
100
LAYER-MODE-NORMAL-LEGACY)))
(gimp-image-insert-layer image lava-layer 0 -1)
(gimp-layer-set-offsets lava-layer select-offset-x select-offset-y)
(gimp-selection-none image)
(gimp-drawable-edit-clear lava-layer)
(gimp-image-select-item image CHANNEL-OP-REPLACE active-selection)
(gimp-image-set-selected-layers image 1 (make-vector 1 lava-layer))
)
)
(set! selected-layers (gimp-image-get-selected-layers image))
(set! num-selected-layers (car selected-layers))
(set! selected-layers-array (cadr selected-layers))
(set! active-layer (aref selected-layers-array (- num-selected-layers 1)))
(if (= current-grad FALSE)
(gimp-context-set-gradient gradient)
)
(plug-in-solid-noise RUN-NONINTERACTIVE image active-layer FALSE TRUE seed 2 2 2)
(plug-in-cubism RUN-NONINTERACTIVE image active-layer tile_size 2.5 0)
(plug-in-oilify RUN-NONINTERACTIVE image active-layer mask_size 0)
(plug-in-edge RUN-NONINTERACTIVE image active-layer 2 0 0)
(plug-in-gauss-rle RUN-NONINTERACTIVE image active-layer 2 TRUE TRUE)
(plug-in-gradmap RUN-NONINTERACTIVE image num-selected-layers selected-layers-array)
(if (= keep-selection FALSE)
(gimp-selection-none image)
)
(gimp-image-set-selected-layers image 1 (make-vector 1 drawable))
(gimp-image-remove-channel image active-selection)
(gimp-image-undo-group-end image)
(gimp-context-pop)
(gimp-displays-flush)
)
; else
(gimp-message _"Lava works with exactly one selected layer")
)
)
)
(script-fu-register "script-fu-lava"
_"_Lava..."
_"Fill the current selection with lava"
"Adrian Likins <adrian@gimp.org>"
"Adrian Likins"
"10/12/97"
"RGB* GRAY*"
SF-IMAGE "Image" 0
SF-DRAWABLE "Drawable" 0
SF-ADJUSTMENT _"Seed" '(10 1 30000 1 10 0 1)
SF-ADJUSTMENT _"Size" '(10 0 100 1 10 0 1)
SF-ADJUSTMENT _"Roughness" '(7 3 50 1 10 0 0)
SF-GRADIENT _"Gradient" "German flag smooth"
SF-TOGGLE _"Keep selection" TRUE
SF-TOGGLE _"Separate layer" TRUE
SF-TOGGLE _"Use current gradient" FALSE
)
(script-fu-menu-register "script-fu-lava"
"<Image>/Filters/Render")