summaryrefslogtreecommitdiffstats
path: root/plug-ins/script-fu/scripts/carve-it.scm
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--plug-ins/script-fu/scripts/carve-it.scm205
1 files changed, 205 insertions, 0 deletions
diff --git a/plug-ins/script-fu/scripts/carve-it.scm b/plug-ins/script-fu/scripts/carve-it.scm
new file mode 100644
index 0000000..a88fa08
--- /dev/null
+++ b/plug-ins/script-fu/scripts/carve-it.scm
@@ -0,0 +1,205 @@
+; CARVE-IT
+; Carving, embossing, & stamping
+; Process taken from "The Photoshop 3 WOW! Book"
+; http://www.peachpit.com
+; This script requires a grayscale image containing a single layer.
+; This layer is used as the mask for the carving effect
+; NOTE: This script requires the image to be carved to either be an
+; RGB color or grayscale image with a single layer. An indexed file
+; can not be used due to the use of gimp-drawable-histogram and
+; gimp-drawable-levels.
+
+
+(define (carve-scale val scale)
+ (* (sqrt val) scale))
+
+(define (calculate-inset-gamma img layer)
+ (let* ((stats (gimp-drawable-histogram layer 0 0.0 1.0))
+ (mean (car stats)))
+ (cond ((< mean 127) (+ 1.0 (* 0.5 (/ (- 127 mean) 127.0))))
+ ((>= mean 127) (- 1.0 (* 0.5 (/ (- mean 127) 127.0)))))))
+
+
+(define (copy-layer-carve-it dest-image dest-drawable source-image source-drawable)
+ (gimp-selection-all dest-image)
+ (gimp-drawable-edit-clear dest-drawable)
+ (gimp-selection-none dest-image)
+ (gimp-selection-all source-image)
+ (gimp-edit-copy source-drawable)
+ (let ((floating-sel (car (gimp-edit-paste dest-drawable FALSE))))
+ (gimp-floating-sel-anchor floating-sel)))
+
+
+
+(define (script-fu-carve-it mask-img mask-drawable bg-layer carve-white)
+ (let* (
+ (width (car (gimp-drawable-width mask-drawable)))
+ (height (car (gimp-drawable-height mask-drawable)))
+ (type (car (gimp-drawable-type bg-layer)))
+ (img (car (gimp-image-new width height (cond ((= type RGB-IMAGE) RGB)
+ ((= type RGBA-IMAGE) RGB)
+ ((= type GRAY-IMAGE) GRAY)
+ ((= type GRAYA-IMAGE) GRAY)
+ ((= type INDEXED-IMAGE) INDEXED)
+ ((= type INDEXEDA-IMAGE) INDEXED)))))
+ (size (min width height))
+ (offx (carve-scale size 0.33))
+ (offy (carve-scale size 0.25))
+ (feather (carve-scale size 0.3))
+ (brush-size (carve-scale size 0.3))
+ (brush-name (car (gimp-brush-new "Carve It")))
+ (mask-fs 0)
+ (mask (car (gimp-channel-new img width height "Engraving Mask" 50 '(0 0 0))))
+ (inset-gamma (calculate-inset-gamma (car (gimp-item-get-image bg-layer)) bg-layer))
+ (mask-fat 0)
+ (mask-emboss 0)
+ (mask-highlight 0)
+ (mask-shadow 0)
+ (shadow-layer 0)
+ (highlight-layer 0)
+ (cast-shadow-layer 0)
+ (csl-mask 0)
+ (inset-layer 0)
+ (il-mask 0)
+ (bg-width (car (gimp-drawable-width bg-layer)))
+ (bg-height (car (gimp-drawable-height bg-layer)))
+ (bg-type (car (gimp-drawable-type bg-layer)))
+ (bg-image (car (gimp-item-get-image bg-layer)))
+ (layer1 (car (gimp-layer-new img bg-width bg-height bg-type "Layer1" 100 LAYER-MODE-NORMAL)))
+ )
+
+ (gimp-context-push)
+ (gimp-context-set-defaults)
+
+ (gimp-image-undo-disable img)
+
+ (gimp-image-insert-layer img layer1 0 0)
+
+ (gimp-selection-all img)
+ (gimp-drawable-edit-clear layer1)
+ (gimp-selection-none img)
+ (copy-layer-carve-it img layer1 bg-image bg-layer)
+
+ (gimp-edit-copy mask-drawable)
+ (gimp-image-insert-channel img mask -1 0)
+
+ (plug-in-tile RUN-NONINTERACTIVE img layer1 width height FALSE)
+ (set! mask-fs (car (gimp-edit-paste mask FALSE)))
+ (gimp-floating-sel-anchor mask-fs)
+ (if (= carve-white FALSE)
+ (gimp-drawable-invert mask FALSE))
+
+ (set! mask-fat (car (gimp-channel-copy mask)))
+ (gimp-image-insert-channel img mask-fat -1 0)
+ (gimp-image-select-item img CHANNEL-OP-REPLACE mask-fat)
+
+ (gimp-brush-set-shape brush-name BRUSH-GENERATED-CIRCLE)
+ (gimp-brush-set-spikes brush-name 2)
+ (gimp-brush-set-hardness brush-name 1.0)
+ (gimp-brush-set-spacing brush-name 25)
+ (gimp-brush-set-aspect-ratio brush-name 1)
+ (gimp-brush-set-angle brush-name 0)
+ (cond (<= brush-size 17) (gimp-brush-set-radius brush-name (\ brush-size 2))
+ (else gimp-brush-set-radius brush-name (\ 19 2)))
+ (gimp-context-set-brush brush-name)
+
+ (gimp-context-set-foreground '(255 255 255))
+ (gimp-drawable-edit-stroke-selection mask-fat)
+ (gimp-selection-none img)
+
+ (set! mask-emboss (car (gimp-channel-copy mask-fat)))
+ (gimp-image-insert-channel img mask-emboss -1 0)
+ (plug-in-gauss-rle RUN-NONINTERACTIVE img mask-emboss feather TRUE TRUE)
+ (plug-in-emboss RUN-NONINTERACTIVE img mask-emboss 315.0 45.0 7 TRUE)
+
+ (gimp-context-set-background '(180 180 180))
+ (gimp-image-select-item img CHANNEL-OP-REPLACE mask-fat)
+ (gimp-selection-invert img)
+ (gimp-drawable-edit-fill mask-emboss FILL-BACKGROUND)
+ (gimp-image-select-item img CHANNEL-OP-REPLACE mask)
+ (gimp-drawable-edit-fill mask-emboss FILL-BACKGROUND)
+ (gimp-selection-none img)
+
+ (set! mask-highlight (car (gimp-channel-copy mask-emboss)))
+ (gimp-image-insert-channel img mask-highlight -1 0)
+ (gimp-drawable-levels mask-highlight 0
+ 0.7056 1.0 TRUE
+ 1.0
+ 0.0 1.0 TRUE)
+
+ (set! mask-shadow mask-emboss)
+ (gimp-drawable-levels mask-shadow 0
+ 0.0 0.70586 TRUE
+ 1.0
+ 0.0 1.0 TRUE)
+
+ (gimp-edit-copy mask-shadow)
+ (set! shadow-layer (car (gimp-edit-paste layer1 FALSE)))
+ (gimp-floating-sel-to-layer shadow-layer)
+ (gimp-layer-set-mode shadow-layer LAYER-MODE-MULTIPLY)
+
+ (gimp-edit-copy mask-highlight)
+ (set! highlight-layer (car (gimp-edit-paste shadow-layer FALSE)))
+ (gimp-floating-sel-to-layer highlight-layer)
+ (gimp-layer-set-mode highlight-layer LAYER-MODE-SCREEN)
+
+ (gimp-edit-copy mask)
+ (set! cast-shadow-layer (car (gimp-edit-paste highlight-layer FALSE)))
+ (gimp-floating-sel-to-layer cast-shadow-layer)
+ (gimp-layer-set-mode cast-shadow-layer LAYER-MODE-MULTIPLY)
+ (gimp-layer-set-opacity cast-shadow-layer 75)
+ (plug-in-gauss-rle RUN-NONINTERACTIVE img cast-shadow-layer feather TRUE TRUE)
+ (gimp-item-transform-translate cast-shadow-layer offx offy)
+
+ (set! csl-mask (car (gimp-layer-create-mask cast-shadow-layer ADD-MASK-BLACK)))
+ (gimp-layer-add-mask cast-shadow-layer csl-mask)
+ (gimp-image-select-item img CHANNEL-OP-REPLACE mask)
+ (gimp-context-set-background '(255 255 255))
+ (gimp-drawable-edit-fill csl-mask FILL-BACKGROUND)
+
+ (set! inset-layer (car (gimp-layer-copy layer1 TRUE)))
+ (gimp-image-insert-layer img inset-layer 0 1)
+
+ (set! il-mask (car (gimp-layer-create-mask inset-layer ADD-MASK-BLACK)))
+ (gimp-layer-add-mask inset-layer il-mask)
+ (gimp-image-select-item img CHANNEL-OP-REPLACE mask)
+ (gimp-context-set-background '(255 255 255))
+ (gimp-drawable-edit-fill il-mask FILL-BACKGROUND)
+ (gimp-selection-none img)
+ (gimp-selection-none bg-image)
+ (gimp-drawable-levels inset-layer 0 0.0 1.0 TRUE inset-gamma 0.0 1.0 TRUE)
+ (gimp-image-remove-channel img mask)
+ (gimp-image-remove-channel img mask-fat)
+ (gimp-image-remove-channel img mask-highlight)
+ (gimp-image-remove-channel img mask-shadow)
+
+ (gimp-item-set-name layer1 _"Carved Surface")
+ (gimp-item-set-name shadow-layer _"Bevel Shadow")
+ (gimp-item-set-name highlight-layer _"Bevel Highlight")
+ (gimp-item-set-name cast-shadow-layer _"Cast Shadow")
+ (gimp-item-set-name inset-layer _"Inset")
+
+ (gimp-brush-delete brush-name)
+
+ (gimp-display-new img)
+ (gimp-image-undo-enable img)
+
+ (gimp-context-pop)
+ )
+)
+
+(script-fu-register "script-fu-carve-it"
+ _"Stencil C_arve..."
+ _"Use the specified drawable as a stencil to carve from the specified image."
+ "Spencer Kimball"
+ "Spencer Kimball"
+ "1997"
+ "GRAY"
+ SF-IMAGE "Mask image" 0
+ SF-DRAWABLE "Mask drawable" 0
+ SF-DRAWABLE _"Image to carve" 0
+ SF-TOGGLE _"Carve white areas" TRUE
+)
+
+(script-fu-menu-register "script-fu-carve-it"
+ "<Image>/Filters/Decor")