* 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
  )
)


<
Previous Post
Get Image Filename Information
>
Next Post
Storing Data