40
40
; Creates a single weaving tile
42
42
(define (create-weave-tile ribbon-width
46
46
(let* ((tile-size (+ (* 2 ribbon-width) (* 2 ribbon-spacing)))
47
(darkness (* 255 (/ (- 100 shadow-darkness) 100)))
48
(img (car (gimp-image-new tile-size tile-size RGB)))
49
(drawable (car (gimp-layer-new img tile-size tile-size RGB-IMAGE
50
"Weave tile" 100 NORMAL-MODE))))
47
(darkness (* 255 (/ (- 100 shadow-darkness) 100)))
48
(img (car (gimp-image-new tile-size tile-size RGB)))
49
(drawable (car (gimp-layer-new img tile-size tile-size RGB-IMAGE
50
"Weave tile" 100 NORMAL-MODE))))
51
51
(gimp-image-undo-disable img)
52
52
(gimp-image-add-layer img drawable 0)
60
60
(gimp-context-set-background (list darkness darkness darkness))
62
62
(gimp-rect-select img
65
(+ (* 2 ribbon-spacing) ribbon-width)
65
(+ (* 2 ribbon-spacing) ribbon-width)
71
71
(gimp-edit-blend drawable FG-BG-RGB-MODE NORMAL-MODE
72
GRADIENT-BILINEAR 100 (- 100 shadow-depth) REPEAT-NONE FALSE
74
(/ (+ (* 2 ribbon-spacing) ribbon-width -1) 2) 0 0 0)
72
GRADIENT-BILINEAR 100 (- 100 shadow-depth) REPEAT-NONE FALSE
74
(/ (+ (* 2 ribbon-spacing) ribbon-width -1) 2) 0 0 0)
76
76
; Create main vertical ribbon
78
78
(gimp-rect-select img
79
(+ (* 2 ribbon-spacing) ribbon-width)
82
(+ (* 2 ribbon-spacing) ribbon-width)
79
(+ (* 2 ribbon-spacing) ribbon-width)
82
(+ (* 2 ribbon-spacing) ribbon-width)
87
87
(gimp-edit-blend drawable FG-BG-RGB-MODE NORMAL-MODE
88
GRADIENT-BILINEAR 100 (- 100 shadow-depth) REPEAT-NONE FALSE
90
0 (/ (+ (* 2 ribbon-spacing) ribbon-width -1) 2) 0 0)
88
GRADIENT-BILINEAR 100 (- 100 shadow-depth) REPEAT-NONE FALSE
90
0 (/ (+ (* 2 ribbon-spacing) ribbon-width -1) 2) 0 0)
92
92
; Create the secondary horizontal ribbon
94
94
(copy-rectangle img
98
(+ ribbon-width ribbon-spacing)
100
(+ ribbon-width ribbon-spacing)
101
(+ (* 2 ribbon-spacing) ribbon-width))
98
(+ ribbon-width ribbon-spacing)
100
(+ ribbon-width ribbon-spacing)
101
(+ (* 2 ribbon-spacing) ribbon-width))
103
103
(copy-rectangle img
105
(+ ribbon-width ribbon-spacing)
110
(+ (* 2 ribbon-spacing) ribbon-width))
105
(+ ribbon-width ribbon-spacing)
110
(+ (* 2 ribbon-spacing) ribbon-width))
112
112
; Create the secondary vertical ribbon
114
114
(copy-rectangle img
116
(+ (* 2 ribbon-spacing) ribbon-width)
119
(+ ribbon-width ribbon-spacing)
121
(+ ribbon-width ribbon-spacing))
116
(+ (* 2 ribbon-spacing) ribbon-width)
119
(+ ribbon-width ribbon-spacing)
121
(+ ribbon-width ribbon-spacing))
123
123
(copy-rectangle img
125
(+ (* 2 ribbon-spacing) ribbon-width)
126
(+ ribbon-width ribbon-spacing)
125
(+ (* 2 ribbon-spacing) ribbon-width)
126
(+ ribbon-width ribbon-spacing)
138
138
; Creates a complete weaving mask
140
140
(define (create-weave width
146
146
(let* ((tile (create-weave-tile ribbon-width ribbon-spacing shadow-darkness
148
(tile-img (car tile))
149
(tile-layer (cadr tile))
150
(weaving (plug-in-tile 1 tile-img tile-layer width height TRUE)))
148
(tile-img (car tile))
149
(tile-layer (cadr tile))
150
(weaving (plug-in-tile 1 tile-img tile-layer width height TRUE)))
151
151
(gimp-image-delete tile-img)
154
154
; Creates a single tile for masking
156
156
(define (create-mask-tile ribbon-width
170
170
(let* ((tile-size (+ (* 2 ribbon-width) (* 2 ribbon-spacing)))
171
(img (car (gimp-image-new tile-size tile-size RGB)))
172
(drawable (car (gimp-layer-new img tile-size tile-size RGB-IMAGE
173
"Mask" 100 NORMAL-MODE))))
171
(img (car (gimp-image-new tile-size tile-size RGB)))
172
(drawable (car (gimp-layer-new img tile-size tile-size RGB-IMAGE
173
"Mask" 100 NORMAL-MODE))))
174
174
(gimp-image-undo-disable img)
175
175
(gimp-image-add-layer img drawable 0)
192
192
; Creates a complete mask image
194
194
(define (create-mask final-width
210
210
(let* ((tile (create-mask-tile ribbon-width ribbon-spacing
211
r1-x1 r1-y1 r1-width r1-height
212
r2-x1 r2-y1 r2-width r2-height
213
r3-x1 r3-y1 r3-width r3-height))
214
(tile-img (car tile))
215
(tile-layer (cadr tile))
216
(mask (plug-in-tile 1 tile-img tile-layer final-width final-height
211
r1-x1 r1-y1 r1-width r1-height
212
r2-x1 r2-y1 r2-width r2-height
213
r3-x1 r3-y1 r3-width r3-height))
214
(tile-img (car tile))
215
(tile-layer (cadr tile))
216
(mask (plug-in-tile 1 tile-img tile-layer final-width final-height
218
218
(gimp-image-delete tile-img)
221
221
; Creates the mask for horizontal ribbons
223
223
(define (create-horizontal-mask ribbon-width
227
227
(create-mask final-width
233
(+ (* 2 ribbon-spacing) ribbon-width)
236
(+ (* 2 ribbon-spacing) ribbon-width)
239
(+ ribbon-width ribbon-spacing)
240
(+ (* 2 ribbon-spacing) ribbon-width)
241
(+ ribbon-width ribbon-spacing)
233
(+ (* 2 ribbon-spacing) ribbon-width)
236
(+ (* 2 ribbon-spacing) ribbon-width)
239
(+ ribbon-width ribbon-spacing)
240
(+ (* 2 ribbon-spacing) ribbon-width)
241
(+ ribbon-width ribbon-spacing)
244
244
; Creates the mask for vertical ribbons
246
246
(define (create-vertical-mask ribbon-width
250
250
(create-mask final-width
254
(+ (* 2 ribbon-spacing) ribbon-width)
257
(+ (* 2 ribbon-spacing) ribbon-width)
263
(+ ribbon-width ribbon-spacing)
265
(+ ribbon-width ribbon-spacing)))
254
(+ (* 2 ribbon-spacing) ribbon-width)
257
(+ (* 2 ribbon-spacing) ribbon-width)
263
(+ ribbon-width ribbon-spacing)
265
(+ ribbon-width ribbon-spacing)))
267
267
; Adds a threads layer at a certain orientation to the specified image
269
269
(define (create-threads-layer img
275
275
(let* ((drawable (car (gimp-layer-new img width height RGBA-IMAGE
276
"Threads" 100 NORMAL-MODE)))
277
(dense (/ density 100.0)))
276
"Threads" 100 NORMAL-MODE)))
277
(dense (/ density 100.0)))
278
278
(gimp-image-add-layer img drawable -1)
279
279
(gimp-context-set-background '(255 255 255))
280
280
(gimp-edit-fill drawable BACKGROUND-FILL)
281
281
(plug-in-noisify 1 img drawable FALSE dense dense dense dense)
282
282
(plug-in-c-astretch 1 img drawable)
283
283
(cond ((eq? orientation 'horizontal)
284
(plug-in-gauss-rle 1 img drawable length TRUE FALSE))
285
((eq? orientation 'vertical)
286
(plug-in-gauss-rle 1 img drawable length FALSE TRUE)))
284
(plug-in-gauss-rle 1 img drawable length TRUE FALSE))
285
((eq? orientation 'vertical)
286
(plug-in-gauss-rle 1 img drawable length FALSE TRUE)))
287
287
(plug-in-c-astretch 1 img drawable)
290
290
(define (create-complete-weave width
299
299
(let* ((weave (create-weave width height ribbon-width ribbon-spacing
300
shadow-darkness shadow-depth))
302
(w-layer (cadr weave))
304
(h-layer (create-threads-layer w-img width height thread-length
305
thread-density 'horizontal))
306
(h-mask (car (gimp-layer-create-mask h-layer ADD-WHITE-MASK)))
308
(v-layer (create-threads-layer w-img width height thread-length
309
thread-density 'vertical))
310
(v-mask (car (gimp-layer-create-mask v-layer ADD-WHITE-MASK)))
312
(hmask (create-horizontal-mask ribbon-width ribbon-spacing
315
(hm-layer (cadr hmask))
317
(vmask (create-vertical-mask ribbon-width ribbon-spacing width height))
319
(vm-layer (cadr vmask)))
300
shadow-darkness shadow-depth))
302
(w-layer (cadr weave))
304
(h-layer (create-threads-layer w-img width height thread-length
305
thread-density 'horizontal))
306
(h-mask (car (gimp-layer-create-mask h-layer ADD-WHITE-MASK)))
308
(v-layer (create-threads-layer w-img width height thread-length
309
thread-density 'vertical))
310
(v-mask (car (gimp-layer-create-mask v-layer ADD-WHITE-MASK)))
312
(hmask (create-horizontal-mask ribbon-width ribbon-spacing
315
(hm-layer (cadr hmask))
317
(vmask (create-vertical-mask ribbon-width ribbon-spacing width height))
319
(vm-layer (cadr vmask)))
321
321
(gimp-layer-add-mask h-layer h-mask)
322
322
(gimp-selection-all hm-img)
338
338
; (gimp-display-new (car (gimp-image-duplicate w-img)))
341
(car (gimp-image-flatten w-img)))))
341
(car (gimp-image-flatten w-img)))))
343
343
; The main weave function
345
345
(define (script-fu-weave img
354
(let* ((d-img (car (gimp-drawable-get-image drawable)))
355
(d-width (car (gimp-drawable-width drawable)))
356
(d-height (car (gimp-drawable-height drawable)))
357
(d-offsets (gimp-drawable-offsets drawable))
355
(d-img (car (gimp-drawable-get-image drawable)))
356
(d-width (car (gimp-drawable-width drawable)))
357
(d-height (car (gimp-drawable-height drawable)))
358
(d-offsets (gimp-drawable-offsets drawable))
359
(weaving (create-complete-weave d-width
368
(w-img (car weaving))
369
(w-layer (cadr weaving)))
360
(weaving (create-complete-weave d-width
369
(w-img (car weaving))
370
(w-layer (cadr weaving))
371
373
(gimp-context-push)
375
377
(gimp-image-delete w-img)
376
378
(let ((floating-sel (car (gimp-edit-paste drawable FALSE))))
377
379
(gimp-layer-set-offsets floating-sel
380
382
(gimp-layer-set-mode floating-sel MULTIPLY-MODE)
381
(gimp-floating-sel-to-layer floating-sel))
383
(gimp-floating-sel-to-layer floating-sel)
383
386
(gimp-displays-flush)
388
392
(script-fu-register "script-fu-weave"
390
"Weave effect like Alien Skin"
391
"Federico Mena Quintero"
392
"Federico Mena Quintero"
395
SF-IMAGE "Image to Weave" 0
396
SF-DRAWABLE "Drawable to Weave" 0
397
SF-ADJUSTMENT _"Ribbon width" '(30 0 256 1 10 1 1)
398
SF-ADJUSTMENT _"Ribbon spacing" '(10 0 256 1 10 1 1)
399
SF-ADJUSTMENT _"Shadow darkness" '(75 0 100 1 10 1 1)
400
SF-ADJUSTMENT _"Shadow depth" '(75 0 100 1 10 1 1)
401
SF-ADJUSTMENT _"Thread length" '(200 0 256 1 10 1 1)
402
SF-ADJUSTMENT _"Thread density" '(50 0 100 1 10 1 1)
403
SF-ADJUSTMENT _"Thread intensity" '(100 0 100 1 10 1 1))
394
_"Create a new layer filled with a weave effect to be used as an overlay or bump map"
395
"Federico Mena Quintero"
396
"Federico Mena Quintero"
399
SF-IMAGE "Image to Weave" 0
400
SF-DRAWABLE "Drawable to Weave" 0
401
SF-ADJUSTMENT _"Ribbon width" '(30 0 256 1 10 1 1)
402
SF-ADJUSTMENT _"Ribbon spacing" '(10 0 256 1 10 1 1)
403
SF-ADJUSTMENT _"Shadow darkness" '(75 0 100 1 10 1 1)
404
SF-ADJUSTMENT _"Shadow depth" '(75 0 100 1 10 1 1)
405
SF-ADJUSTMENT _"Thread length" '(200 0 256 1 10 1 1)
406
SF-ADJUSTMENT _"Thread density" '(50 0 100 1 10 1 1)
407
SF-ADJUSTMENT _"Thread intensity" '(100 0 100 1 10 1 1)
405
410
(script-fu-menu-register "script-fu-weave"
406
_"<Image>/Script-Fu/Alchemy")
411
"<Image>/Filters/Artistic")