[Bio] / FigKernelPackages / gjocolorlib.pm Repository:
ViewVC logotype

Annotation of /FigKernelPackages/gjocolorlib.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (view) (download) (as text)

1 : overbeek 1.1 package gjocolorlib;
2 :    
3 :     use strict;
4 :     eval { use Data::Dumper };
5 :    
6 :     # Invoke with:
7 :     #
8 :     # use gjocolorlib;
9 :     #
10 :     # Based on component values from 0 to 1:
11 :     #
12 :     # $rgb = [ $red, $green, $blue ]
13 :     # $hsb = [ $hue, $saturation, $brightness ]
14 :     # $cmy = [ $cyan, $magenta, $yellow ]
15 :     # $cmyk = [ $cyan, $magenta, $yellow, $black ]
16 :    
17 :     # Exported functions:
18 :     #
19 :     # $rgb = hsb2rgb( $hsb )
20 :     # @rgb = hsb2rgb( @hsb )
21 :     # $rgb = cmy2rgb( $cmy )
22 :     # @rgb = cmy2rgb( @cmy )
23 :     # $rgb = cmyk2rgb( $cmyk )
24 :     # @rgb = cmyk2rgb( @cmyk )
25 :     # $rgb = html2rgb( $html )
26 :     # @rgb = html2rgb( $html )
27 :     # $gray = rgb2gray( $rgb )
28 :     # $gray = rgb2gray( @rgb )
29 :     # $html = rgb2html( $rgb )
30 :     # $html = rgb2html( @rgb )
31 :     # $name = rgb2name( $rgb )
32 :     # $name = rgb2name( @rgb )
33 :     #
34 :     # $rgb = blend_rgb_colors( $color1, $color2, ... )
35 :     # @rgb = blend_rgb_colors( $color1, $color2, ... )
36 :     # $html = blend_html_colors( $color1, $color2, ... )
37 :    
38 :    
39 :     require Exporter;
40 :    
41 :     our @ISA = qw(Exporter);
42 :     our @EXPORT = qw(
43 :     hsb2rgb
44 :     cmy2rgb
45 :     cmyk2rgb
46 :     html2rgb
47 :     rgb2gray
48 :     rgb2html
49 :     rgb2name
50 :     blend_rgb_colors
51 :     blend_html_colors
52 :     );
53 :     our @EXPORT_OK = qw(
54 :     UI_Orange
55 :     UI_Formal_Orange
56 :     UI_Blue
57 :     UI_Formal_Blue
58 :     );
59 :    
60 :    
61 :     my $UI_Orange = [ 1, 102/255, 0 ];
62 :     my $UI_Formal_Orange = [ 204/255, 102/255, 0 ];
63 :     my $UI_Blue = [ 0, 51/255, 102/255 ];
64 :     my $UI_Formal_Blue = [ 51/255, 51/255, 102/255 ];
65 :    
66 :     sub floor {
67 :     my $x = $_[0];
68 :     defined( $x ) || return undef;
69 :     ( $x >= 0 ) || ( int($x) == $x ) ? int( $x ) : -1 - int( - $x )
70 :     }
71 :     sub min { my ( $a, $b ) = @_; ( $a < $b ) ? $a : $b }
72 :     sub max { my ( $a, $b ) = @_; ( $a > $b ) ? $a : $b }
73 :    
74 :    
75 :     # Convert HSB to RGB:
76 :     # Here, hue is taken to be in range 0 - 1;
77 :     # It is sometimes 0 - 6 and sometimes 0 - 2*pi
78 :    
79 :     sub hsb2rgb {
80 :     my ( $h, $s, $br ) = @_;
81 :     if ( ref( $h ) eq "ARRAY" ) { ( $h, $s, $br ) = @$h }
82 :     defined( $h ) && defined( $s ) && defined( $br ) || return undef;
83 :    
84 :     $h = 6 * ($h - floor($h)); # Hue is made cyclic modulo 1
85 :     if ( $s > 1 ) { $s = 1 } elsif ( $s < 0 ) { $s = 0 } # 0 <= s <= 1
86 :     if ( $br > 1 ) { $br = 1 } elsif ( $br < 0 ) { $br = 0 } # 0 <= br <= 1
87 :     my ( $r, $g, $b ) = ( $h <= 3 ) ? ( ( $h <= 1 ) ? ( 1, $h, 0 )
88 :     : ( $h <= 2 ) ? ( 2 - $h, 1, 0 )
89 :     : ( 0, 1, $h - 2 )
90 :     )
91 :     : ( ( $h <= 4 ) ? ( 0, 4 - $h, 1 )
92 :     : ( $h <= 5 ) ? ( $h - 4, 0, 1 )
93 :     : ( 1, 0, 6 - $h )
94 :     );
95 :     my @rgb = ( ( $r * $s + 1 - $s ) * $br,
96 :     ( $g * $s + 1 - $s ) * $br,
97 :     ( $b * $s + 1 - $s ) * $br
98 :     );
99 :     wantarray() ? @rgb : \@rgb
100 :     }
101 :    
102 :    
103 :     # Convert CMY to RGB:
104 :    
105 :     sub cmy2rgb {
106 :     my ( $c, $m, $y ) = @_;
107 :     if ( ref( $c ) eq "ARRAY" ) { ( $c, $m, $y ) = @$c }
108 :     defined( $c ) && defined( $m ) && defined( $y ) || return undef;
109 :     if ( $c > 1 ) { $c = 1 } elsif ( $c < 0 ) { $c = 0 }
110 :     if ( $m > 1 ) { $m = 1 } elsif ( $m < 0 ) { $m = 0 }
111 :     if ( $y > 1 ) { $y = 1 } elsif ( $y < 0 ) { $y = 0 }
112 :     wantarray() ? ( 1 - $c, 1 - $m, 1 - $y ) : [ 1 - $c, 1 - $m, 1 - $y ]
113 :     }
114 :    
115 :    
116 :     # Convert CMYK to RGB:
117 :    
118 :     sub cmyk2rgb {
119 :     my ( $c, $m, $y, $k ) = @_;
120 :     if ( ref( $c ) eq "ARRAY" ) { ( $c, $m, $y, $k ) = @$c }
121 :     defined( $c ) && defined( $m ) && defined( $y ) && defined( $k ) || return undef;
122 :     if ( $c > 1 ) { $c = 1 } elsif ( $c < 0 ) { $c = 0 }
123 :     if ( $m > 1 ) { $m = 1 } elsif ( $m < 0 ) { $m = 0 }
124 :     if ( $y > 1 ) { $y = 1 } elsif ( $y < 0 ) { $y = 0 }
125 :     my $br = ($k < 0) ? 1 : ($k > 1) ? 0 : 1 - $k;
126 :     my @rgb = ( ( 1 - $c ) * $br, ( 1 - $m ) * $br, ( 1 - $y ) * $br );
127 :     wantarray() ? @rgb : \@rgb
128 :     }
129 :    
130 :     # Named colors:
131 :    
132 :     my %name2html = map { lc }
133 :     ( Black => '#000000',
134 :     Blue => '#0000FF',
135 :     CadetBlue3 => '#77BFC7',
136 :     CadetBlue4 => '#4C787E',
137 :     Chartreuse => '#8AFB17',
138 :     Chartreuse2 => '#7FE817',
139 :     Chartreuse3 => '#6CC417',
140 :     Chartreuse4 => '#437C17',
141 :     Chocolate => '#C85A17',
142 :     Coral => '#F76541',
143 :     Coral2 => '#E55B3C',
144 :     Coral3 => '#C34A2C',
145 :     CornflowerBlue => '#151B8D',
146 :     Cyan => '#00FFFF',
147 :     Cyan1 => '#57FEFF',
148 :     Cyan2 => '#50EBEC',
149 :     Cyan3 => '#46C7C7',
150 :     Cyan4 => '#307D7E',
151 :     DarkGoldenrod => '#AF7817',
152 :     DarkGoldenrod1 => '#FBB117',
153 :     DarkGoldenrod2 => '#E8A317',
154 :     DarkGoldenrod3 => '#C58917',
155 :     DarkGoldenrod4 => '#7F5217',
156 :     DarkGreen => '#254117',
157 :     DarkOliveGreen1 => '#CCFB5D',
158 :     DarkOliveGreen2 => '#BCE954',
159 :     DarkOliveGreen3 => '#A0C544',
160 :     DarkOliveGreen4 => '#667C26',
161 :     DarkOrange => '#F88017',
162 :     DarkOrange1 => '#F87217',
163 :     DarkOrange2 => '#E56717',
164 :     DarkOrange3 => '#7E3117',
165 :     DarkOrange3 => '#C35617',
166 :     DarkOrchid => '#7D1B7E',
167 :     DarkOrchid1 => '#B041FF',
168 :     DarkOrchid2 => '#A23BEC',
169 :     DarkOrchid3 => '#8B31C7',
170 :     DarkOrchid4 => '#571B7e',
171 :     DarkSalmon => '#E18B6B',
172 :     DarkSeaGreen => '#8BB381',
173 :     DarkSeaGreen1 => '#C3FDB8',
174 :     DarkSeaGreen2 => '#B5EAAA',
175 :     DarkSeaGreen3 => '#99C68E',
176 :     DarkSeaGreen4 => '#617C58',
177 :     DarkSlateBlue => '#2B3856',
178 :     DarkSlateGray => '#25383C',
179 :     DarkSlateGray1 => '#9AFEFF',
180 :     DarkSlateGray2 => '#8EEBEC',
181 :     DarkSlateGray3 => '#78c7c7',
182 :     DarkSlateGray4 => '#4C7D7E',
183 :     DarkTurquoise => '#3B9C9C',
184 :     DarkViolet => '#842DCE',
185 :     DeepPink => '#F52887',
186 :     DeepPink2 => '#E4287C',
187 :     DeepPink3 => '#C12267',
188 :     DeepPink4 => '#7D053F',
189 :     DeepSkyBlue => '#3BB9FF',
190 :     DeepSkyBlue2 => '#38ACEC',
191 :     DeepSkyBlue3 => '#3090C7',
192 :     DeepSkyBlue4 => '#25587E',
193 :     DimGray => '#463E41',
194 :     DodgerBlue => '#1589FF',
195 :     DodgerBlue2 => '#157DEC',
196 :     DodgerBlue3 => '#1569C7',
197 :     DodgerBlue4 => '#153E7E',
198 :     Firebrick => '#800517',
199 :     Firebrick1 => '#F62817',
200 :     Firebrick2 => '#E42217',
201 :     Firebrick3 => '#C11B17',
202 :     ForestGreen => '#4E9258',
203 :     Gold => '#D4A017',
204 :     Gold1 => '#FDD017',
205 :     Gold2 => '#EAC117',
206 :     Gold3 => '#C7A317',
207 :     Gold4 => '#806517',
208 :     Goldenrod => '#EDDA74',
209 :     Goldenrod1 => '#FBB917',
210 :     Goldenrod2 => '#E9AB17',
211 :     Goldenrod3 => '#C68E17',
212 :     Goldenrod4 => '#805817',
213 :     Gray => '#736F6E',
214 :     Gray0 => '#150517',
215 :     Gray18 => '#250517',
216 :     Gray21 => '#2B1B17',
217 :     Gray23 => '#302217',
218 :     Gray24 => '#302226',
219 :     Gray25 => '#342826',
220 :     Gray26 => '#34282C',
221 :     Gray27 => '#382D2C',
222 :     Gray28 => '#3b3131',
223 :     Gray29 => '#3E3535',
224 :     Gray30 => '#413839',
225 :     Gray31 => '#41383C',
226 :     Gray32 => '#463E3F',
227 :     Gray34 => '#4A4344',
228 :     Gray35 => '#4C4646',
229 :     Gray36 => '#4E4848',
230 :     Gray37 => '#504A4B',
231 :     Gray38 => '#544E4F',
232 :     Gray39 => '#565051',
233 :     Gray40 => '#595454',
234 :     Gray41 => '#5C5858',
235 :     Gray42 => '#5F5A59',
236 :     Gray43 => '#625D5D',
237 :     Gray44 => '#646060',
238 :     Gray45 => '#666362',
239 :     Gray46 => '#696565',
240 :     Gray47 => '#6D6968',
241 :     Gray48 => '#6E6A6B',
242 :     Gray49 => '#726E6D',
243 :     Gray50 => '#747170',
244 :     Green => '#00FF00',
245 :     Green1 => '#5FFB17',
246 :     Green2 => '#59E817',
247 :     Green3 => '#4CC417',
248 :     Green4 => '#347C17',
249 :     GreenYellow => '#B1FB17',
250 :     HotPink => '#F660AB',
251 :     HotPink1 => '#F665AB',
252 :     HotPink2 => '#E45E9D',
253 :     HotPink3 => '#C25283',
254 :     HotPink4 => '#7D2252',
255 :     IndianRed1 => '#F75D59',
256 :     IndianRed2 => '#E55451',
257 :     IndianRed3 => '#C24641',
258 :     IndianRed4 => '#7E2217',
259 :     Khaki => '#ADA96E',
260 :     Khaki1 => '#FFF380',
261 :     Khaki2 => '#EDE275',
262 :     Khaki3 => '#C9BE62',
263 :     Khaki4 => '#827839',
264 :     Lavendar => '#E3E4FA',
265 :     LavendarBlush => '#FDEEF4',
266 :     LavendarBlush2 => '#EBDDE2',
267 :     LavendarBlush3 => '#C8BBBE',
268 :     LavendarBlush4 => '#817679',
269 :     LawnGreen => '#87F717',
270 :     LemonChiffon => '#FFF8C6',
271 :     LemonChiffon2 => '#ECE5B6',
272 :     LemonChiffon3 => '#C9C299',
273 :     LemonChiffon4 => '#827B60',
274 :     LightBlue => '#ADDFFF',
275 :     LightBlue1 => '#BDEDFF',
276 :     LightBlue2 => '#AFDCEC',
277 :     LightBlue3 => '#95B9C7',
278 :     LightBlue4 => '#5E767E',
279 :     LightCoral => '#E77471',
280 :     LightCyan => '#E0FFFF',
281 :     LightCyan2 => '#CFECEC',
282 :     LightCyan3 => '#AFC7C7',
283 :     LightCyan4 => '#717D7D',
284 :     LightGolden2 => '#ECD672',
285 :     LightGoldenrod => '#ECD872',
286 :     LightGoldenrod1 => '#FFE87C',
287 :     LightGoldenrod3 => '#C8B560',
288 :     LightGoldenrod4 => '#817339',
289 :     LightGoldenrodYellow => '#FAF8CC',
290 :     LightPink => '#FAAFBA',
291 :     LightPink1 => '#F9A7B0',
292 :     LightPink2 => '#E799A3',
293 :     LightPink3 => '#C48189',
294 :     LightPink4 => '#7F4E52',
295 :     LightSalmon => '#F9966B',
296 :     LightSalmon2 => '#E78A61',
297 :     LightSalmon3 => '#C47451',
298 :     LightSalmon4 => '#7F462C',
299 :     LightSeaGreen => '#3EA99F',
300 :     LightSkyBlue => '#82CAFA',
301 :     LightSkyBlue2 => '#A0CFEC',
302 :     LightSkyBlue3 => '#87AFC7',
303 :     LightSkyBlue4 => '#566D7E',
304 :     LightSlateBlue => '#736AFF',
305 :     LightSlateGray => '#6D7B8D',
306 :     LightSteelBlue => '#728FCE',
307 :     LightSteelBlue1 => '#C6DEFF',
308 :     LightSteelBlue2 => '#B7CEEC',
309 :     LightSteelBlue4 => '#646D7E',
310 :     LimeGreen => '#41A317',
311 :     Magenta => '#FF00FF',
312 :     Magenta1 => '#F433FF',
313 :     Magenta2 => '#E238EC',
314 :     Magenta3 => '#C031C7',
315 :     Maroon => '#810541',
316 :     Maroon1 => '#F535AA',
317 :     Maroon2 => '#E3319D',
318 :     Maroon3 => '#C12283',
319 :     Maroon4 => '#7D0552',
320 :     MediumAquamarine => '#348781',
321 :     MediumForestGreen => '#347235',
322 :     MediumOrchid => '#B048B5',
323 :     MediumOrchid1 => '#D462FF',
324 :     MediumOrchid2 => '#C45AEC',
325 :     MediumOrchid3 => '#A74AC7',
326 :     MediumOrchid4 => '#6A287E',
327 :     MediumPurple => '#8467D7',
328 :     MediumPurple1 => '#9E7BFF',
329 :     MediumPurple2 => '#9172EC',
330 :     MediumPurple3 => '#7A5DC7',
331 :     MediumPurple4 => '#4E387E',
332 :     MediumSeaGreen => '#306754',
333 :     MediumSlateBlue => '#5E5A80',
334 :     MediumSpringGreen => '#348017',
335 :     MediumTurquoise => '#48CCCD',
336 :     MediumVioletRed => '#CA226B',
337 :     MidnightBlue => '#151B54',
338 :     PaleTurquoise3 => '#92C7C7',
339 :     PaleTurquoise4 => '#5E7D7E',
340 :     PaleVioletRed => '#D16587',
341 :     PaleVioletRed1 => '#F778A1',
342 :     PaleVioletRed2 => '#E56E94',
343 :     PaleVioletRed3 => '#C25A7C',
344 :     PaleVioletRed4 => '#7E354D',
345 :     Pink => '#FAAFBE',
346 :     Pink2 => '#E7A1B0',
347 :     Pink3 => '#C48793',
348 :     Pink4 => '#7F525D',
349 :     Plum => '#B93B8F',
350 :     Plum1 => '#F9B7FF',
351 :     Plum2 => '#E6A9EC',
352 :     Plum3 => '#C38EC7',
353 :     Plum4 => '#7E587E',
354 :     Purple => '#8E35EF',
355 :     Purple1 => '#893BFF',
356 :     Purple2 => '#7F38EC',
357 :     Purple3 => '#6C2DC7',
358 :     Purple4 => '#461B7E',
359 :     Red => '#FF0000',
360 :     Red1 => '#F62217',
361 :     Red2 => '#E41B17',
362 :     RosyBrown => '#B38481',
363 :     RosyBrown1 => '#FBBBB9',
364 :     RosyBrown2 => '#E8ADAA',
365 :     RosyBrown3 => '#C5908E',
366 :     RosyBrown4 => '#7F5A58',
367 :     RoyalBlue => '#2B60DE',
368 :     RoyalBlue1 => '#306EFF',
369 :     RoyalBlue2 => '#2B65EC',
370 :     RoyalBlue3 => '#2554C7',
371 :     RoyalBlue4 => '#15317E',
372 :     Salmon1 => '#F88158',
373 :     Salmon2 => '#E67451',
374 :     Salmon3 => '#C36241',
375 :     Salmon4 => '#7E3817',
376 :     SandyBrown => '#EE9A4D',
377 :     SeaGreen => '#4E8975',
378 :     SeaGreen1 => '#6AFB92',
379 :     SeaGreen2 => '#64E986',
380 :     SeaGreen3 => '#54C571',
381 :     SeaGreen4 => '#387C44',
382 :     Sienna => '#8A4117',
383 :     Sienna1 => '#F87431',
384 :     Sienna2 => '#E66C2C',
385 :     Sienna3 => '#C35817',
386 :     Sienna4 => '#7E3517',
387 :     SkyBlue => '#6698FF',
388 :     SkyBlue => '#82CAFF',
389 :     SkyBlue2 => '#79BAEC',
390 :     SkyBlue3 => '#659EC7',
391 :     SkyBlue4 => '#41627E',
392 :     SlateBlue => '#3574EC7',
393 :     SlateBlue => '#737CA1',
394 :     SlateBlue => '#737CA1',
395 :     SlateBlue2 => '#6960EC',
396 :     SlateBlue4 => '#342D7E',
397 :     SlateGray => '#657383',
398 :     SlateGray1 => '#C2DFFF',
399 :     SlateGray2 => '#B4CFEC',
400 :     SlateGray3 => '#98AFC7',
401 :     SlateGray4 => '#616D7E',
402 :     SpringGreen => '#4AA02C',
403 :     SpringGreen => '#4AA02C',
404 :     SpringGreen1 => '#5EFB6E',
405 :     SpringGreen2 => '#57E964',
406 :     SpringGreen3 => '#4CC552',
407 :     SpringGreen4 => '#347C2C',
408 :     SteelBlue => '#4863A0',
409 :     SteelBlue1 => '#5CB3FF',
410 :     SteelBlue2 => '#56A5EC',
411 :     SteelBlue3 => '#488AC7',
412 :     SteelBlue4 => '#2B547E',
413 :     Thistle => '#D2B9D3',
414 :     Thistle1 => '#FCDFFF',
415 :     Thistle2 => '#E9CFEC',
416 :     Thistle3 => '#C6AEC7',
417 :     Thistle4 => '#806D7E',
418 :     Turquoise => '#43C6DB',
419 :     Turquoise1 => '#52F3FF',
420 :     Turquoise2 => '#4EE2EC',
421 :     Turquoise3 => '#43BFC7',
422 :     White => '#FFFFFF',
423 :     Violet => '#8D38C9',
424 :     VioletRed => '#F6358A',
425 :     VioletRed1 => '#F6358A',
426 :     VioletRed2 => '#E4317F',
427 :     VioletRed3 => '#C12869',
428 :     VioletRed4 => '#7D0541',
429 :     Yellow => '#FFFF00',
430 :     Yellow1 => '#FFFC17',
431 :     YellowGreen => '#52D017',
432 :     );
433 :    
434 :    
435 :     my %name2rgb = map { $_ => [ map { hex( $_ ) / 255 }
436 :     $name2html{ $_ } =~ m/^#([\da-f][\da-f])([\da-f][\da-f])([\da-f][\da-f])/
437 :     ]
438 :     }
439 :     keys %name2html;
440 :    
441 :     # Convert html to RGB:
442 :    
443 :     # namedcolor
444 :     # #xxxxxx
445 :     # #xxx
446 :     # xxxxxx
447 :     # xxx
448 :    
449 :     sub html2rgb {
450 :     my $html = lc shift; # Lower case
451 :     $html =~ s/\s+//g; # No spaces
452 :     $html =~ s/grey/gray/g; # USA spelling
453 :    
454 :     my $rgb;
455 :     if ( $rgb = $name2rgb{ $html } ) { return wantarray ? @$rgb : $rgb }
456 :    
457 :     my @rgb = map { hex( $_ ) / 255 }
458 :     $html =~ m/^#([\da-f][\da-f])([\da-f][\da-f])([\da-f][\da-f])/ ? ( $1, $2, $3 )
459 :     : $html =~ m/^#([\da-f])([\da-f])([\da-f])/ ? map { "$_$_" } ( $1, $2, $3 )
460 :     : $html =~ m/^([\da-f][\da-f])([\da-f][\da-f])([\da-f][\da-f])/ ? ( $1, $2, $3 )
461 :     : $html =~ m/^([\da-f])([\da-f])([\da-f])/ ? map { "$_$_" } ( $1, $2, $3 )
462 :     : ( '7f', '7f', '7f' );
463 :    
464 :     wantarray() ? @rgb : \@rgb
465 :     }
466 :    
467 :    
468 :     # Produce the gray equivalent in brightness to an RGB value:
469 :    
470 :     sub rgb2gray {
471 :     my ( $r, $g, $b ) = @_;
472 :     if ( ref( $r ) eq "ARRAY" ) { ( $r, $g, $b ) = @$r }
473 :     defined( $r ) && defined( $g ) && defined( $b ) || return undef;
474 :     if ( $r > 1 ) { $r = 1 } elsif ( $r < 0 ) { $r = 0 }
475 :     if ( $g > 1 ) { $g = 1 } elsif ( $g < 0 ) { $g = 0 }
476 :     if ( $b > 1 ) { $b = 1 } elsif ( $b < 0 ) { $b = 0 }
477 :     # Various ITU recommendations and the new standard:
478 :     # 0.299 * $r + 0.587 * $g + 0.114 * $b; # Rec 601-1
479 :     # 0.213 * $r + 0.715 * $g + 0.072 * $b; # Rec 709
480 :     0.222 * $r + 0.707 * $g + 0.071 * $b; # ITU std (D65 white point)
481 :     }
482 :    
483 :    
484 :     # Convert an RGB value to an HTML string:
485 :    
486 :     sub rgb2html {
487 :     my ( $r, $g, $b ) = @_;
488 :     if ( ref( $r ) eq "ARRAY" ) { ( $r, $g, $b ) = @$r }
489 :     defined( $r ) && defined( $g ) && defined( $b ) || return undef;
490 :     if ( $r > 1 ) { $r = 1 } elsif ( $r < 0 ) { $r = 0 }
491 :     if ( $g > 1 ) { $g = 1 } elsif ( $g < 0 ) { $g = 0 }
492 :     if ( $b > 1 ) { $b = 1 } elsif ( $b < 0 ) { $b = 0 }
493 :     sprintf("#%02x%02x%02x", int(255.999*$r), int(255.999*$g), int(255.999*$b) )
494 :     }
495 :    
496 :    
497 :     #-------------------------------------------------------------------------------
498 :     # Blend 2 or more RGB colors:
499 :     #
500 :     # $color = blend_rgb_colors( $color1, $color2, ... )
501 :     #-------------------------------------------------------------------------------
502 :     sub blend_rgb_colors
503 :     {
504 :     my @rgb = ( 0, 0, 0 );
505 :     my $n = 0;
506 :     while ( @_ )
507 :     {
508 :     my @clr = @{ shift @_ };
509 :     @rgb = map { $_ + shift @clr } @rgb;
510 :     $n++;
511 :     }
512 :     @rgb = map { $_/$n } @rgb if $n;
513 :     wantarray() ? @rgb : \@rgb
514 :     }
515 :    
516 :    
517 :     #-------------------------------------------------------------------------------
518 :     # Blend 2 or more HTML colors:
519 :     #
520 :     # $color = blend_html_colors( $color1, $color2, ... )
521 :     #-------------------------------------------------------------------------------
522 :     sub blend_html_colors
523 :     {
524 :     my @rgb = ( 0, 0, 0 );
525 :     my $n = 0;
526 :     while ( @_ )
527 :     {
528 :     my @clr = html2rgb( shift );
529 :     @rgb = map { $_ + shift @clr } @rgb;
530 :     $n++;
531 :     }
532 :     @rgb = map { $_/$n } @rgb if $n;
533 :    
534 :     rgb2html( @rgb );
535 :     }
536 :    
537 :    
538 :     #-------------------------------------------------------------------------------
539 :     # Define a distance between 2 rgb colors
540 :     #
541 :     # $name = rgb_distance( $rgb1, $rgb2 )
542 :     #-------------------------------------------------------------------------------
543 :     sub rgb_distance
544 :     {
545 :     ( ref( $_[0] ) eq 'ARRAY' ) && ( ref( $_[0] ) eq 'ARRAY' ) || return undef;
546 :     my @rgb1 = @{$_[0]};
547 :     my @rgb2 = @{$_[1]};
548 :     ( grep { defined } @rgb1, @rgb2 ) == 6 || return undef;
549 :     my $d2 = ( $rgb1[0] - $rgb2[0] ) ** 2
550 :     + ( $rgb1[1] - $rgb2[1] ) ** 2
551 :     + ( $rgb1[2] - $rgb2[2] ) ** 2;
552 :     return sqrt( $d2 );
553 :     }
554 :    
555 :    
556 :     #-------------------------------------------------------------------------------
557 :     # Find the closest named color
558 :     #
559 :     # $name = rgb2name( $rgb )
560 :     #-------------------------------------------------------------------------------
561 :     sub rgb2name
562 :     {
563 :     my @rgb = ref( $_[0] ) eq 'ARRAY' ? @{ $_[0] } : @_;
564 :     ( grep { defined } @rgb ) == 3 || return undef;
565 :    
566 :     my ( $name ) = map { $_->[0] }
567 :     sort { $a->[1] <=> $b->[1] }
568 :     map { [ $_, rgb_distance( \@rgb, $name2rgb{ $_ } ) ] }
569 :     keys %name2rgb;
570 :     return $name;
571 :     }
572 :    
573 :    
574 :     1;

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3