New Layer From Selected Area
* Tested in GIMP 2.99.14 *
I’ll often need to create a new layer of a certain area, in normal or multiply mode, with a particular name. I’ve hotkeyed this plug-in to do that. Includes an add mask option, which is on by default
To download the plug-in…
…follow the link, right click, Save As…
Creates a new layer, above the active layer, of the same size as the selection
#!/usr/bin/env gimp-script-fu-interpreter-3.0
(define debug #f)
(define (script-fu-new-layer-from-selection img drwbls name mde mskB mskW)
(let*
(
(msk 0)(pVec 0)(pos 0)(actP 0)(actL (vector-ref drwbls 0))(wdth 0)(hgt 0)
)
(gimp-image-undo-group-start img)
;(gimp-context-push)
(if (= mde 1) (set! mde 30)
(set! mde 28)
)
(if (= (car(gimp-selection-is-empty img)) 1)(gimp-selection-all img))
(if (= (car (gimp-item-id-is-layer-mask actL)) 1)
(set! actL (car(gimp-layer-from-mask actL)))
)
(if (= mskB 1)(set! msk ADD-MASK-BLACK))
(if (= mskW 1)(set! msk ADD-MASK-WHITE))
(set! pos (car (gimp-image-get-item-position img actL)))
(set! actP (car (gimp-item-get-parent actL)))
(set! pVec (list->vector (gimp-selection-bounds img)))
(set! wdth (- (vector-ref pVec 3) (vector-ref pVec 1)))
(set! hgt (- (vector-ref pVec 4) (vector-ref pVec 2)))
(set! actL (car(gimp-layer-new img wdth hgt RGBA-IMAGE name 100 mde)))
(gimp-layer-set-offsets actL (vector-ref pVec 1) (vector-ref pVec 2))
(gimp-context-set-foreground (list 70 70 70))
(gimp-context-set-opacity 100)
(gimp-image-insert-layer img actL actP pos)
(gimp-drawable-edit-fill actL FILL-FOREGROUND)
(gimp-layer-set-composite-space actL LAYER-COLOR-SPACE-RGB-PERCEPTUAL)
(when (= mskB 1)
(gimp-layer-set-edit-mask actL (add-mask actL msk))
(gimp-context-set-foreground (list 255 255 255))
)
(gimp-image-set-selected-layers img 1 (vector actL))
(gimp-selection-none img)
(gimp-image-undo-group-end img)
(gimp-displays-flush)
(when (and (= mskB 0) (= mskW 0))
;(gimp-context-pop) always popping?
)
)
)
(script-fu-register-filter "script-fu-new-layer-from-selection"
"Layer From Selection"
"creates a new layer from the selection area size"
"Mark Sweeney"
"Under GNU GENERAL PUBLIC LICENSE Version 3"
"2023"
"*"
SF-ONE-DRAWABLE
SF-STRING "name" "newLayer"
SF-TOGGLE "multiply" 1
SF-TOGGLE "add black mask" 1
SF-TOGGLE "add white mask" 0
)
(script-fu-menu-register "script-fu-new-layer-from-selection" "<Image>/Layer")
; copyright 2023, Mark Sweeney, Under GNU GENERAL PUBLIC LICENSE Version 3
; utility functions
(define (boolean->string bool) (if bool "#t" "#f"))
(define (exit msg)
(gimp-message-set-handler 0)
(gimp-message (string-append " >>> " msg " <<<"))
(gimp-message-set-handler 2)
(quit)
)
(define (here x)(gimp-message(string-append " >>> " (number->string x) " <<<")))
; adds a mask to a layer of a given type;
; ADD-MASK-WHITE
; ADD-MASK-BLACK
; ADD-MASK-ALPHA
; ADD-MASK-ALPHA-TRANSFER
; ADD-MASK-SELECTION
; ADD-MASK-COPY
; ADD-MASK-CHANNEL
; returns the mask id
(define (add-mask actL type)
(let*
(
(mask (car (gimp-layer-get-mask actL)))
)
(when (< mask 0)
(set! mask (car (gimp-layer-create-mask actL type)))
(gimp-layer-add-mask actL mask)
(set! mask (car (gimp-layer-get-mask actL)))
)
mask
)
)