10
10
; ************************************************************************
13
(if (not (symbol-bound? 'script-fu-hsv-graph-scale (the-environment)))
13
(if (not (symbol-bound? 'script-fu-hsv-graph-scale (current-environment)))
14
14
(define script-fu-hsv-graph-scale 1))
15
(if (not (symbol-bound? 'script-fu-hsv-graph-opacity (the-environment)))
15
(if (not (symbol-bound? 'script-fu-hsv-graph-opacity (current-environment)))
16
16
(define script-fu-hsv-graph-opacity 100))
17
(if (not (symbol-bound? 'script-fu-hsv-graph-bounds? (the-environment)))
17
(if (not (symbol-bound? 'script-fu-hsv-graph-bounds? (current-environment)))
18
18
(define script-fu-hsv-graph-bounds? TRUE))
19
(if (not (symbol-bound? 'script-fu-hsv-graph-left2right? (the-environment)))
19
(if (not (symbol-bound? 'script-fu-hsv-graph-left2right? (current-environment)))
20
20
(define script-fu-hsv-graph-left2right? FALSE))
21
(if (not (symbol-bound? 'script-fu-hsv-graph-beg-x (the-environment)))
21
(if (not (symbol-bound? 'script-fu-hsv-graph-beg-x (current-environment)))
22
22
(define script-fu-hsv-graph-beg-x 0))
23
(if (not (symbol-bound? 'script-fu-hsv-graph-beg-y (the-environment)))
23
(if (not (symbol-bound? 'script-fu-hsv-graph-beg-y (current-environment)))
24
24
(define script-fu-hsv-graph-beg-y 0))
25
(if (not (symbol-bound? 'script-fu-hsv-graph-end-x (the-environment)))
25
(if (not (symbol-bound? 'script-fu-hsv-graph-end-x (current-environment)))
26
26
(define script-fu-hsv-graph-end-x 1))
27
(if (not (symbol-bound? 'script-fu-hsv-graph-end-y (the-environment)))
27
(if (not (symbol-bound? 'script-fu-hsv-graph-end-y (current-environment)))
28
28
(define script-fu-hsv-graph-end-y 1))
30
30
(define (script-fu-hsv-graph img drawable scale opacity bounds?
31
left2right? beg-x beg-y end-x end-y)
31
left2right? beg-x beg-y end-x end-y)
32
32
(define (floor x) (- x (fmod x 1)))
34
34
(define (set-point! fvec index x y)
35
35
(aset fvec (* 2 index) x)
36
36
(aset fvec (+ (* 2 index) 1) y)
39
40
(define (plot-dot img drawable x y)
40
(gimp-pencil drawable 1 (set-point! *pos* 0 x y)))
41
(gimp-pencil drawable 1 (set-point! *pos* 0 x y))
42
44
(define (rgb-to-hsv rgb hsv)
43
(let* ((red (floor (nth 0 rgb)))
44
(green (floor (nth 1 rgb)))
45
(blue (floor (nth 2 rgb)))
48
(minv (min red (min green blue)))
49
(maxv (max red (max green blue)))
46
(red (floor (nth 0 rgb)))
47
(green (floor (nth 1 rgb)))
48
(blue (floor (nth 2 rgb)))
51
(minv (min red (min green blue)))
52
(maxv (max red (max green blue)))
52
56
(if (not (= 0 maxv))
53
(set! s (/ (* (- maxv minv) 255.0) maxv))
57
(set! s (/ (* (- maxv minv) 255.0) maxv))
58
(set! delta (- maxv minv))
60
(set! h (/ (- green blue) delta)))
62
(set! h (+ 2.0 (/ (- blue red) delta))))
64
(set! h (+ 4.0 (/ (- red green) delta)))))
69
(set! h (- h 255.0)))))
63
(set! delta (- maxv minv))
65
(set! h (/ (- green blue) delta)))
67
(set! h (+ 2.0 (/ (- blue red) delta))))
69
(set! h (+ 4.0 (/ (- red green) delta)))))
74
(set! h (- h 255.0))))
70
76
(set-car! hsv (floor h))
71
77
(set-car! (cdr hsv) (floor s))
72
(set-car! (cddr hsv) (floor v))))
78
(set-car! (cddr hsv) (floor v))
75
83
;; filled-index (integer)
76
84
;; size as number of points (integer)
77
85
;; vector (which size is 2 * size)
78
86
(define (make-segment length x y)
83
(let ((vec (cons-array (* 2 length) 'double)))
87
(if (< 64 length) (set! length 64))
88
(if (< length 5) (set! length 5))
90
(vec (cons-array (* 2 length) 'double)))
89
98
(define (segment-filled-size segment) (car segment))
91
100
(define (segment-strokes segment) (caddr segment))
93
102
(define (fill-segment! segment new-x new-y)
94
104
(define (shift-segment! segment)
99
(while (< base offset)
101
(aref vec (* 2 (- size (- offset base)))))
102
(aset vec (+ (* 2 base) 1)
103
(aref vec (+ (* 2 (- size (- offset base))) 1)))
104
(set! base (+ base 1)))
105
(set-car! segment base)))
106
(size (cadr segment))
107
(vec (caddr segment))
109
(while (< base offset)
111
(aref vec (* 2 (- size (- offset base)))))
112
(aset vec (+ (* 2 base) 1)
113
(aref vec (+ (* 2 (- size (- offset base))) 1)))
114
(set! base (+ base 1)))
115
(set-car! segment base))
106
118
(let ((base (car segment))
107
(size (cadr segment))
108
(vec (caddr segment)))
119
(size (cadr segment))
120
(vec (caddr segment)))
111
(shift-segment! segment)
112
(set! base (segment-filled-size segment))))
123
(shift-segment! segment)
124
(set! base (segment-filled-size segment))))
113
125
(if (and (= new-x (aref vec (* 2 (- base 1))))
114
(= new-y (aref vec (+ (* 2 (- base 1)) 1))))
117
(aset vec (* 2 base) new-x)
118
(aset vec (+ (* 2 base) 1) new-y)
119
(set! base (+ base 1))
125
(set-car! segment base)
126
(= new-y (aref vec (+ (* 2 (- base 1)) 1))))
129
(aset vec (* 2 base) new-x)
130
(aset vec (+ (* 2 base) 1) new-y)
131
(set! base (+ base 1))
137
(set-car! segment base)
128
142
(define (draw-segment img drawable segment limit rgb)
129
143
(gimp-context-set-foreground rgb)
130
(gimp-airbrush drawable 100 (* 2 limit) (segment-strokes segment)))
144
(gimp-airbrush drawable 100 (* 2 limit) (segment-strokes segment))
132
147
(define red-color '(255 10 10))
133
148
(define green-color '(10 255 10))
143
158
(define (fill-dot img drawable x y segment color)
144
159
(if (fill-segment! segment x y)
146
(gimp-context-set-foreground color)
147
(draw-segment img drawable segment (segment-max-size segment) color)
161
(gimp-context-set-foreground color)
162
(draw-segment img drawable segment (segment-max-size segment) color)
151
167
(define (fill-color-band img drawable x scale x-base y-base color)
152
168
(gimp-context-set-foreground color)
153
169
(gimp-rect-select img (+ x-base (* scale x)) 0 scale y-base CHANNEL-OP-REPLACE FALSE 0)
154
170
(gimp-edit-bucket-fill drawable FG-BUCKET-FILL NORMAL-MODE 100 0 FALSE 0 0)
155
(gimp-selection-none img))
171
(gimp-selection-none img)
157
174
(define (plot-hsv img drawable x scale x-base y-base hsv)
158
175
(let ((real-x (* scale x))
162
179
(fill-dot img drawable (+ x-base real-x) (- y-base h)
163
hue-segment red-color)
180
hue-segment red-color)
164
181
(fill-dot img drawable (+ x-base real-x) (- y-base s)
165
saturation-segment green-color)
182
saturation-segment green-color)
166
183
(if (fill-dot img drawable (+ x-base real-x) (- y-base v)
167
value-segment blue-color)
168
(gimp-displays-flush))))
184
value-segment blue-color)
185
(gimp-displays-flush)))
170
188
(define (plot-rgb img drawable x scale x-base y-base hsv)
171
189
(let ((real-x (* scale x))
175
193
(fill-dot img drawable (+ x-base real-x) (- y-base h)
176
red-segment red-color)
194
red-segment red-color)
177
195
(fill-dot img drawable (+ x-base real-x) (- y-base s)
178
green-segment green-color)
196
green-segment green-color)
179
197
(if (fill-dot img drawable (+ x-base real-x) (- y-base v)
180
blue-segment blue-color)
181
(gimp-displays-flush))))
198
blue-segment blue-color)
199
(gimp-displays-flush)))
183
202
(define (clamp-value x minv maxv)
190
210
;; start of script-fu-hsv-graph
191
211
(if (= TRUE bounds?)
192
212
(if (= TRUE (car (gimp-selection-bounds img)))
193
(let ((results (gimp-selection-bounds img)))
194
(set! beg-x (nth (if (= TRUE left2right?) 1 3) results))
195
(set! beg-y (nth 2 results))
196
(set! end-x (nth (if (= TRUE left2right?) 3 1) results))
197
(set! end-y (nth 4 results)))
198
(let ((offsets (gimp-drawable-offsets drawable)))
199
(set! beg-x (if (= TRUE left2right?)
201
(- (+ (nth 0 offsets)
202
(car (gimp-drawable-width drawable)))
204
(set! beg-y (nth 1 offsets))
205
(set! end-x (if (= TRUE left2right?)
206
(- (+ (nth 0 offsets)
207
(car (gimp-drawable-width drawable)))
210
(set! end-y (- (+ (nth 1 offsets)
211
(car (gimp-drawable-height drawable)))
213
(let ((results (gimp-selection-bounds img)))
214
(set! beg-x (nth (if (= TRUE left2right?) 1 3) results))
215
(set! beg-y (nth 2 results))
216
(set! end-x (nth (if (= TRUE left2right?) 3 1) results))
217
(set! end-y (nth 4 results)))
218
(let ((offsets (gimp-drawable-offsets drawable)))
219
(set! beg-x (if (= TRUE left2right?)
221
(- (+ (nth 0 offsets)
222
(car (gimp-drawable-width drawable)))
224
(set! beg-y (nth 1 offsets))
225
(set! end-x (if (= TRUE left2right?)
226
(- (+ (nth 0 offsets)
227
(car (gimp-drawable-width drawable)))
230
(set! end-y (- (+ (nth 1 offsets)
231
(car (gimp-drawable-height drawable)))
213
233
(let ((offsets (gimp-drawable-offsets drawable)))
214
(set! beg-x (clamp-value beg-x 0
216
(car (gimp-drawable-width drawable)))))
217
(set! end-x (clamp-value end-x 0
219
(car (gimp-drawable-width drawable)))))
220
(set! beg-y (clamp-value beg-y 0
222
(car (gimp-drawable-height drawable)))))
223
(set! end-y (clamp-value end-y 0
225
(car (gimp-drawable-height drawable)))))))
234
(set! beg-x (clamp-value beg-x 0
236
(car (gimp-drawable-width drawable)))))
237
(set! end-x (clamp-value end-x 0
239
(car (gimp-drawable-width drawable)))))
240
(set! beg-y (clamp-value beg-y 0
242
(car (gimp-drawable-height drawable)))))
243
(set! end-y (clamp-value end-y 0
245
(car (gimp-drawable-height drawable)))))))
226
246
(set! opacity (clamp-value opacity 0 100))
227
247
(let* ((x-len (- end-x beg-x))
228
(y-len (- end-y beg-y))
229
(limit (pow (+ (pow x-len 2) (pow y-len 2)) 0.5))
230
(gimg-width (* limit scale))
232
(gimg (car (gimp-image-new (+ (* 2 border-size) gimg-width)
233
(+ (* 2 border-size) gimg-height) RGB)))
234
(bglayer (car (gimp-layer-new gimg
235
(+ (* 2 border-size) gimg-width)
236
(+ (* 2 border-size) gimg-height)
237
1 "Background" 100 NORMAL-MODE)))
238
(hsv-layer (car (gimp-layer-new gimg
239
(+ (* 2 border-size) gimg-width)
240
(+ (* 2 border-size) gimg-height)
241
RGBA-IMAGE "HSV Graph" 100 NORMAL-MODE)))
242
(rgb-layer (car (gimp-layer-new gimg
243
(+ (* 2 border-size) gimg-width)
244
(+ (* 2 border-size) gimg-height)
245
RGBA-IMAGE "RGB Graph" 100 NORMAL-MODE)))
246
(clayer (car (gimp-layer-new gimg gimg-width 40 RGBA-IMAGE
247
"Color Sampled" opacity NORMAL-MODE)))
251
(y-base (+ gimg-height border-size))
248
(y-len (- end-y beg-y))
249
(limit (pow (+ (pow x-len 2) (pow y-len 2)) 0.5))
250
(gimg-width (* limit scale))
252
(gimg (car (gimp-image-new (+ (* 2 border-size) gimg-width)
253
(+ (* 2 border-size) gimg-height) RGB)))
254
(bglayer (car (gimp-layer-new gimg
255
(+ (* 2 border-size) gimg-width)
256
(+ (* 2 border-size) gimg-height)
257
1 "Background" 100 NORMAL-MODE)))
258
(hsv-layer (car (gimp-layer-new gimg
259
(+ (* 2 border-size) gimg-width)
260
(+ (* 2 border-size) gimg-height)
261
RGBA-IMAGE "HSV Graph" 100 NORMAL-MODE)))
262
(rgb-layer (car (gimp-layer-new gimg
263
(+ (* 2 border-size) gimg-width)
264
(+ (* 2 border-size) gimg-height)
265
RGBA-IMAGE "RGB Graph" 100 NORMAL-MODE)))
266
(clayer (car (gimp-layer-new gimg gimg-width 40 RGBA-IMAGE
267
"Color Sampled" opacity NORMAL-MODE)))
271
(y-base (+ gimg-height border-size))
254
274
(gimp-context-push)
291
311
(lambda (segment color)
292
312
(if (< 1 (segment-filled-size segment))
294
(gimp-context-set-foreground color)
295
(draw-segment gimg hsv-layer segment (segment-filled-size segment)
314
(gimp-context-set-foreground color)
315
(draw-segment gimg hsv-layer segment (segment-filled-size segment)
297
317
(list hue-segment saturation-segment value-segment)
298
318
(list red-color green-color blue-color))
300
320
(lambda (segment color)
301
321
(if (< 1 (segment-filled-size segment))
303
(gimp-context-set-foreground color)
304
(draw-segment gimg rgb-layer segment (segment-filled-size segment)
323
(gimp-context-set-foreground color)
324
(draw-segment gimg rgb-layer segment (segment-filled-size segment)
306
326
(list red-segment green-segment blue-segment)
307
327
(list red-color green-color blue-color))
308
328
(gimp-context-set-foreground '(255 255 255))
309
329
(let ((text-layer (car (gimp-text-fontname gimg -1 0 0
310
"Red: Hue, Green: Sat, Blue: Val"
313
(offset-y (- y-base (car (gimp-drawable-height clayer)))))
330
"Red: Hue, Green: Sat, Blue: Val"
333
(offset-y (- y-base (car (gimp-drawable-height clayer)))))
314
334
(gimp-layer-set-mode text-layer DIFFERENCE-MODE)
315
335
(gimp-layer-translate clayer 0 offset-y)
316
336
(gimp-layer-translate text-layer border-size (+ offset-y 15)))
328
348
(set! script-fu-hsv-graph-end-y end-y)
329
349
(gimp-displays-flush)
333
355
(script-fu-register "script-fu-hsv-graph"
334
_"Draw _HSV Graph..."
335
"Draph the graph of H/S/V values on the drawable"
336
"Shuji Narazaki <narazaki@InetQ.or.jp>"
340
SF-IMAGE "Image to analyze" 0
341
SF-DRAWABLE "Drawable to analyze" 0
342
SF-ADJUSTMENT _"Graph scale" (cons script-fu-hsv-graph-scale '(0.1 5 0.1 1 1 1))
343
SF-ADJUSTMENT _"BG opacity" (cons script-fu-hsv-graph-opacity '(0 100 1 10 0 1))
344
SF-TOGGLE _"Use selection bounds instead of belows" script-fu-hsv-graph-bounds?
345
SF-TOGGLE _"From top-left to bottom-right" script-fu-hsv-graph-left2right?
346
SF-ADJUSTMENT _"Start X" (cons script-fu-hsv-graph-beg-x '(0 5000 1 10 0 1))
347
SF-ADJUSTMENT _"Start Y" (cons script-fu-hsv-graph-beg-y '(0 5000 1 10 0 1))
348
SF-ADJUSTMENT _"End X" (cons script-fu-hsv-graph-end-x '(0 5000 1 10 0 1))
349
SF-ADJUSTMENT _"End Y" (cons script-fu-hsv-graph-end-y '(0 5000 1 10 0 1)))
356
_"Draw _HSV Graph..."
357
_"Create a graph of the Hue, Saturation, and Value distributions"
358
"Shuji Narazaki <narazaki@InetQ.or.jp>"
362
SF-IMAGE "Image to analyze" 0
363
SF-DRAWABLE "Drawable to analyze" 0
364
SF-ADJUSTMENT _"Graph scale" '(1 0.1 5 0.1 1 1 1)
365
SF-ADJUSTMENT _"BG opacity" '(100 0 100 1 10 0 1)
366
SF-TOGGLE _"Use selection bounds instead of values below" TRUE
367
SF-TOGGLE _"From top-left to bottom-right" FALSE
368
SF-ADJUSTMENT _"Start X" '(0 0 5000 1 10 0 1)
369
SF-ADJUSTMENT _"Start Y" '(0 0 5000 1 10 0 1)
370
SF-ADJUSTMENT _"End X" '(1 0 5000 1 10 0 1)
371
SF-ADJUSTMENT _"End Y" '(1 0 5000 1 10 0 1)
351
374
(script-fu-menu-register "script-fu-hsv-graph"
352
_"<Image>/Script-Fu/Utils")
375
"<Image>/Colors/Info")