Ghost Layer
* Tested in GIMP 2.99.14 *
A little time-saver to set up a pencil layer for inking. The plug-in should appear in the Layer menu.
To download ghostLayer.scm
…follow the link, right click the page, Save as ghostLayer.scm, in a folder called ghostLayer, in a GIMP plug-ins location.
In Linux, set the file to be executable.
#!/usr/bin/env gimp-script-fu-interpreter-3.0
(define debug #f)
(define (script-fu-ghostLayer img drawables)
(let*
(
(ghostOpacity 70) ; default opacity value for ghosting
(actL (vector-ref drawables 0))(inkL 0) (unlck 0)(whtL 0)
(nme (car (gimp-item-get-name actL)))
(ghostName (string-append "ghosted-original-" nme ))
(blankName (string-append "ghost-opacity-" nme ))
(mde LAYER-MODE-MULTIPLY)(vis 1)(ghstGrp 0)
(isGrp (car (gimp-item-is-group actL)))
)
(when (= isGrp 0)
(gimp-image-undo-group-start img)
(gimp-item-set-lock-content actL 0)
(set! inkL (duplicate-layer img actL "tmpNme" 100 mde vis))
(gimp-drawable-fill inkL FILL-WHITE)
(gimp-item-set-name actL ghostName)
(gimp-item-set-name inkL nme)
(set! mde LAYER-MODE-NORMAL)
(set! whtL (duplicate-layer img inkL blankName ghostOpacity mde vis))
(set! ghstGrp (layer-group img (vector whtL actL)))
(gimp-item-set-expanded ghstGrp 0)
(gimp-item-set-lock-content ghstGrp 1)
(gimp-image-raise-item img inkL)
(gimp-image-set-selected-layers img 1 (vector inkL))
(gimp-displays-flush)
(gimp-image-undo-group-end img)
)
(when (= isGrp 1) (gimp-message " not ghosting a group "))
)
)
(script-fu-register-filter "script-fu-ghostLayer"
"Ghost Layer"
"Turns a layer into a underlay ghost, puts a blank multiply layer on top"
"Mark Sweeney"
"Under GNU GENERAL PUBLIC LICENSE Version 3"
"2023"
"*"
SF-ONE-DRAWABLE
)
(script-fu-menu-register "script-fu-ghostLayer" "<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) " <<<")))
; duplicates a layer and assigns specific attributes
; (source image, source layer, new layer name, opacity, mode, visibility)
; returns the new layer id
(define (duplicate-layer img srcL name opac mode vis)
(let*
(
(actL 0)
(parent 0)
(pos 0)
(compSpc 0)
)
; what's the layers composite space?
(set! compSpc (car(gimp-layer-get-composite-space srcL)))
(set! parent (car (gimp-item-get-parent srcL)))
(set! pos (car (gimp-image-get-item-position img srcL)))
(set! actL (car (gimp-layer-new-from-drawable srcL img)))
(gimp-image-insert-layer img actL parent pos)
(gimp-layer-set-opacity actL opac)
(gimp-layer-set-mode actL mode)
(gimp-item-set-name actL name)
(gimp-item-set-visible actL vis)
; restore composite space, due to it being reset to linear by mode change
(gimp-layer-set-composite-space actL compSpc)
actL
)
)
; puts a list of layers in a group based on the stack pos of the first element
; (source image, list/vector of layers)
; returns the new group id
(define (layer-group img drwbls)
(let*
(
(mde LAYER-MODE-NORMAL) ; LAYER-MODE-NORMAL ; LAYER-MODE-MULTIPLY
(nme "groupNme")
(numDraw 0)(actL 0)(parent 0)(i 0)(pos 0)(grp 0)
)
(if (list? drwbls) (set! drwbls (list->vector drwbls)))
(set! numDraw (vector-length drwbls))
(set! actL (vector-ref drwbls 0))
(set! parent (car (gimp-item-get-parent actL)))
(set! pos (car (gimp-image-get-item-position img actL)))
(set! i (- numDraw 1))
(set! grp (car (gimp-layer-group-new img)))
(gimp-image-insert-layer img grp parent pos)
(gimp-item-set-name grp nme)
(gimp-layer-set-mode grp mde)
(gimp-layer-set-composite-space grp LAYER-COLOR-SPACE-RGB-PERCEPTUAL)
(while (> i -1)
(set! actL (vector-ref drwbls i))
(gimp-image-reorder-item img actL grp 0)
(set! i (- i 1))
)
grp
)
)