;; Camo - This is a script for The GIMP to generate a camouflage pattern
;; Copyright (C) 2010 William Morrison
;;
;; 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 .
;; A helper function to apply one layer of colour
(define (camo-help img clr iterations cutoff size)
(let* ((newlayer 0) (fgcolor 0))
(set! fgcolor (car (gimp-context-get-foreground)));preserving the foreground colour
;; Create the new layer and the mask
(set! newlayer (car (gimp-layer-new img 1 1 0 "Camo" 100 0 )))
(gimp-image-add-layer img newlayer -1)
(gimp-layer-resize-to-image-size newlayer)
(gimp-context-set-foreground clr)
(gimp-drawable-fill newlayer 0)
(gimp-layer-add-mask newlayer (car (gimp-layer-create-mask newlayer 0)))
;; Generate the basic smooth camo shapes
(plug-in-solid-noise 1 img (car (gimp-layer-get-mask newlayer)) 0 0 (random 65535) 1 size size)
(gimp-equalize (car (gimp-layer-get-mask newlayer)) 0)
(gimp-threshold (car (gimp-layer-get-mask newlayer)) cutoff 255)
;; Roughen the edges with the Pick filter
(while (and (> iterations 0) (not (= 0 cutoff)))
(plug-in-randomize-pick 1 img (car (gimp-layer-get-mask newlayer)) 100 50 1 0)
(set! iterations (- iterations 1))
)
(plug-in-gauss 1 img (car (gimp-layer-get-mask newlayer)) 5 5 0)
(gimp-threshold (car (gimp-layer-get-mask newlayer)) 128 255)
;; Merge the layer if needed, and restore the foreground colour
(if (not (= 0 cutoff)) (gimp-image-merge-down img newlayer 1) ())
(gimp-context-set-foreground fgcolor)
)
)
(define (script-fu-camo-1 img clr1 use1 clr2 use2 clr3 use3 clr4 use4 clr5 use5 size iterations)
(let* ((divs 5) (count 0))
(gimp-image-undo-group-start img)
(set! divs (+ use1 use2 use3 use4 use5)) ; the number of colours being used
;; Generate the spots for each colour. All the divs and count stuff is for making sure there's an even distriution of colour
(if (= 1 use1) (camo-help img clr1 iterations (- 255 (* (- divs count) (/ 255 divs))) size) (set! count (- count 1)))
(set! count (+ count 1))
(if (= 1 use2) (camo-help img clr2 iterations (- 255 (* (- divs count) (/ 255 divs))) size) (set! count (- count 1)))
(set! count (+ count 1))
(if (= 1 use3) (camo-help img clr3 iterations (- 255 (* (- divs count) (/ 255 divs))) size) (set! count (- count 1)))
(set! count (+ count 1))
(if (= 1 use4) (camo-help img clr4 iterations (- 255 (* (- divs count) (/ 255 divs))) size) (set! count (- count 1)))
(set! count (+ count 1))
(if (= 1 use5) (camo-help img clr5 iterations (- 255 (* (- divs count) (/ 255 divs))) size) (set! count (- count 1)))
(gimp-image-undo-group-end img)
; Update the display
(gimp-displays-flush)
)
)
(script-fu-register "script-fu-camo-1"
"Camo..."
"Generates a layer filled with a camouflage pattern. Be aware that roughening the edges can be very slow."
"Will Morrison"
"GNU General Public License"
"2010"
"RGB*"
SF-IMAGE "Image" 0
SF-COLOR "Color 1" '(136 125 52) SF-TOGGLE "Use colour 1" 1
SF-COLOR "Color 2" '(62 82 22) SF-TOGGLE "Use colour 2" 1
SF-COLOR "Color 3" '(82 56 11) SF-TOGGLE "Use colour 3" 1
SF-COLOR "Color 4" '(50 28 0) SF-TOGGLE "Use colour 4" 1
SF-COLOR "Color 5" '(0 0 0) SF-TOGGLE "Use colour 5" 1
SF-ADJUSTMENT "Size" '(5 0.1 16 1 3 1 0)
SF-ADJUSTMENT "Roughness" '(1 0 10 1 3 0 0)
)
(script-fu-menu-register "script-fu-camo-1"
"/Filters/Will's Script Pack")