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

Annotation of /FigKernelPackages/gjocolorlib.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.3 - (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 : golsen 1.3 # Named colors in HTML specification. Note that the extra color
131 :     # names included from X11 are not linked in a logical progression.
132 :     # This is probably due to a different assumed gamma.
133 : overbeek 1.1
134 :     my %name2html = map { lc }
135 :     ( Black => '#000000',
136 :     Blue => '#0000FF',
137 :     CadetBlue3 => '#77BFC7',
138 :     CadetBlue4 => '#4C787E',
139 :     Chartreuse => '#8AFB17',
140 :     Chartreuse2 => '#7FE817',
141 :     Chartreuse3 => '#6CC417',
142 :     Chartreuse4 => '#437C17',
143 :     Chocolate => '#C85A17',
144 :     Coral => '#F76541',
145 :     Coral2 => '#E55B3C',
146 :     Coral3 => '#C34A2C',
147 :     CornflowerBlue => '#151B8D',
148 :     Cyan => '#00FFFF',
149 :     Cyan1 => '#57FEFF',
150 :     Cyan2 => '#50EBEC',
151 :     Cyan3 => '#46C7C7',
152 :     Cyan4 => '#307D7E',
153 :     DarkGoldenrod => '#AF7817',
154 :     DarkGoldenrod1 => '#FBB117',
155 :     DarkGoldenrod2 => '#E8A317',
156 :     DarkGoldenrod3 => '#C58917',
157 :     DarkGoldenrod4 => '#7F5217',
158 :     DarkGreen => '#254117',
159 :     DarkOliveGreen1 => '#CCFB5D',
160 :     DarkOliveGreen2 => '#BCE954',
161 :     DarkOliveGreen3 => '#A0C544',
162 :     DarkOliveGreen4 => '#667C26',
163 :     DarkOrange => '#F88017',
164 :     DarkOrange1 => '#F87217',
165 :     DarkOrange2 => '#E56717',
166 :     DarkOrange3 => '#7E3117',
167 :     DarkOrange3 => '#C35617',
168 :     DarkOrchid => '#7D1B7E',
169 :     DarkOrchid1 => '#B041FF',
170 :     DarkOrchid2 => '#A23BEC',
171 :     DarkOrchid3 => '#8B31C7',
172 :     DarkOrchid4 => '#571B7e',
173 :     DarkSalmon => '#E18B6B',
174 :     DarkSeaGreen => '#8BB381',
175 :     DarkSeaGreen1 => '#C3FDB8',
176 :     DarkSeaGreen2 => '#B5EAAA',
177 :     DarkSeaGreen3 => '#99C68E',
178 :     DarkSeaGreen4 => '#617C58',
179 :     DarkSlateBlue => '#2B3856',
180 :     DarkSlateGray => '#25383C',
181 :     DarkSlateGray1 => '#9AFEFF',
182 :     DarkSlateGray2 => '#8EEBEC',
183 :     DarkSlateGray3 => '#78c7c7',
184 :     DarkSlateGray4 => '#4C7D7E',
185 :     DarkTurquoise => '#3B9C9C',
186 :     DarkViolet => '#842DCE',
187 :     DeepPink => '#F52887',
188 :     DeepPink2 => '#E4287C',
189 :     DeepPink3 => '#C12267',
190 :     DeepPink4 => '#7D053F',
191 :     DeepSkyBlue => '#3BB9FF',
192 :     DeepSkyBlue2 => '#38ACEC',
193 :     DeepSkyBlue3 => '#3090C7',
194 :     DeepSkyBlue4 => '#25587E',
195 :     DimGray => '#463E41',
196 :     DodgerBlue => '#1589FF',
197 :     DodgerBlue2 => '#157DEC',
198 :     DodgerBlue3 => '#1569C7',
199 :     DodgerBlue4 => '#153E7E',
200 :     Firebrick => '#800517',
201 :     Firebrick1 => '#F62817',
202 :     Firebrick2 => '#E42217',
203 :     Firebrick3 => '#C11B17',
204 :     ForestGreen => '#4E9258',
205 :     Gold => '#D4A017',
206 :     Gold1 => '#FDD017',
207 :     Gold2 => '#EAC117',
208 :     Gold3 => '#C7A317',
209 :     Gold4 => '#806517',
210 :     Goldenrod => '#EDDA74',
211 :     Goldenrod1 => '#FBB917',
212 :     Goldenrod2 => '#E9AB17',
213 :     Goldenrod3 => '#C68E17',
214 :     Goldenrod4 => '#805817',
215 :     Gray => '#736F6E',
216 :     Gray0 => '#150517',
217 :     Gray18 => '#250517',
218 :     Gray21 => '#2B1B17',
219 :     Gray23 => '#302217',
220 :     Gray24 => '#302226',
221 :     Gray25 => '#342826',
222 :     Gray26 => '#34282C',
223 :     Gray27 => '#382D2C',
224 :     Gray28 => '#3b3131',
225 :     Gray29 => '#3E3535',
226 :     Gray30 => '#413839',
227 :     Gray31 => '#41383C',
228 :     Gray32 => '#463E3F',
229 :     Gray34 => '#4A4344',
230 :     Gray35 => '#4C4646',
231 :     Gray36 => '#4E4848',
232 :     Gray37 => '#504A4B',
233 :     Gray38 => '#544E4F',
234 :     Gray39 => '#565051',
235 :     Gray40 => '#595454',
236 :     Gray41 => '#5C5858',
237 :     Gray42 => '#5F5A59',
238 :     Gray43 => '#625D5D',
239 :     Gray44 => '#646060',
240 :     Gray45 => '#666362',
241 :     Gray46 => '#696565',
242 :     Gray47 => '#6D6968',
243 :     Gray48 => '#6E6A6B',
244 :     Gray49 => '#726E6D',
245 :     Gray50 => '#747170',
246 :     Green => '#00FF00',
247 :     Green1 => '#5FFB17',
248 :     Green2 => '#59E817',
249 :     Green3 => '#4CC417',
250 :     Green4 => '#347C17',
251 :     GreenYellow => '#B1FB17',
252 :     HotPink => '#F660AB',
253 :     HotPink1 => '#F665AB',
254 :     HotPink2 => '#E45E9D',
255 :     HotPink3 => '#C25283',
256 :     HotPink4 => '#7D2252',
257 :     IndianRed1 => '#F75D59',
258 :     IndianRed2 => '#E55451',
259 :     IndianRed3 => '#C24641',
260 :     IndianRed4 => '#7E2217',
261 :     Khaki => '#ADA96E',
262 :     Khaki1 => '#FFF380',
263 :     Khaki2 => '#EDE275',
264 :     Khaki3 => '#C9BE62',
265 :     Khaki4 => '#827839',
266 :     Lavendar => '#E3E4FA',
267 :     LavendarBlush => '#FDEEF4',
268 :     LavendarBlush2 => '#EBDDE2',
269 :     LavendarBlush3 => '#C8BBBE',
270 :     LavendarBlush4 => '#817679',
271 :     LawnGreen => '#87F717',
272 :     LemonChiffon => '#FFF8C6',
273 :     LemonChiffon2 => '#ECE5B6',
274 :     LemonChiffon3 => '#C9C299',
275 :     LemonChiffon4 => '#827B60',
276 :     LightBlue => '#ADDFFF',
277 :     LightBlue1 => '#BDEDFF',
278 :     LightBlue2 => '#AFDCEC',
279 :     LightBlue3 => '#95B9C7',
280 :     LightBlue4 => '#5E767E',
281 :     LightCoral => '#E77471',
282 :     LightCyan => '#E0FFFF',
283 :     LightCyan2 => '#CFECEC',
284 :     LightCyan3 => '#AFC7C7',
285 :     LightCyan4 => '#717D7D',
286 :     LightGolden2 => '#ECD672',
287 :     LightGoldenrod => '#ECD872',
288 :     LightGoldenrod1 => '#FFE87C',
289 :     LightGoldenrod3 => '#C8B560',
290 :     LightGoldenrod4 => '#817339',
291 :     LightGoldenrodYellow => '#FAF8CC',
292 :     LightPink => '#FAAFBA',
293 :     LightPink1 => '#F9A7B0',
294 :     LightPink2 => '#E799A3',
295 :     LightPink3 => '#C48189',
296 :     LightPink4 => '#7F4E52',
297 :     LightSalmon => '#F9966B',
298 :     LightSalmon2 => '#E78A61',
299 :     LightSalmon3 => '#C47451',
300 :     LightSalmon4 => '#7F462C',
301 :     LightSeaGreen => '#3EA99F',
302 :     LightSkyBlue => '#82CAFA',
303 :     LightSkyBlue2 => '#A0CFEC',
304 :     LightSkyBlue3 => '#87AFC7',
305 :     LightSkyBlue4 => '#566D7E',
306 :     LightSlateBlue => '#736AFF',
307 :     LightSlateGray => '#6D7B8D',
308 :     LightSteelBlue => '#728FCE',
309 :     LightSteelBlue1 => '#C6DEFF',
310 :     LightSteelBlue2 => '#B7CEEC',
311 :     LightSteelBlue4 => '#646D7E',
312 :     LimeGreen => '#41A317',
313 :     Magenta => '#FF00FF',
314 :     Magenta1 => '#F433FF',
315 :     Magenta2 => '#E238EC',
316 :     Magenta3 => '#C031C7',
317 :     Maroon => '#810541',
318 :     Maroon1 => '#F535AA',
319 :     Maroon2 => '#E3319D',
320 :     Maroon3 => '#C12283',
321 :     Maroon4 => '#7D0552',
322 :     MediumAquamarine => '#348781',
323 :     MediumForestGreen => '#347235',
324 :     MediumOrchid => '#B048B5',
325 :     MediumOrchid1 => '#D462FF',
326 :     MediumOrchid2 => '#C45AEC',
327 :     MediumOrchid3 => '#A74AC7',
328 :     MediumOrchid4 => '#6A287E',
329 :     MediumPurple => '#8467D7',
330 :     MediumPurple1 => '#9E7BFF',
331 :     MediumPurple2 => '#9172EC',
332 :     MediumPurple3 => '#7A5DC7',
333 :     MediumPurple4 => '#4E387E',
334 :     MediumSeaGreen => '#306754',
335 :     MediumSlateBlue => '#5E5A80',
336 :     MediumSpringGreen => '#348017',
337 :     MediumTurquoise => '#48CCCD',
338 :     MediumVioletRed => '#CA226B',
339 :     MidnightBlue => '#151B54',
340 :     PaleTurquoise3 => '#92C7C7',
341 :     PaleTurquoise4 => '#5E7D7E',
342 :     PaleVioletRed => '#D16587',
343 :     PaleVioletRed1 => '#F778A1',
344 :     PaleVioletRed2 => '#E56E94',
345 :     PaleVioletRed3 => '#C25A7C',
346 :     PaleVioletRed4 => '#7E354D',
347 :     Pink => '#FAAFBE',
348 :     Pink2 => '#E7A1B0',
349 :     Pink3 => '#C48793',
350 :     Pink4 => '#7F525D',
351 :     Plum => '#B93B8F',
352 :     Plum1 => '#F9B7FF',
353 :     Plum2 => '#E6A9EC',
354 :     Plum3 => '#C38EC7',
355 :     Plum4 => '#7E587E',
356 :     Purple => '#8E35EF',
357 :     Purple1 => '#893BFF',
358 :     Purple2 => '#7F38EC',
359 :     Purple3 => '#6C2DC7',
360 :     Purple4 => '#461B7E',
361 :     Red => '#FF0000',
362 :     Red1 => '#F62217',
363 :     Red2 => '#E41B17',
364 :     RosyBrown => '#B38481',
365 :     RosyBrown1 => '#FBBBB9',
366 :     RosyBrown2 => '#E8ADAA',
367 :     RosyBrown3 => '#C5908E',
368 :     RosyBrown4 => '#7F5A58',
369 :     RoyalBlue => '#2B60DE',
370 :     RoyalBlue1 => '#306EFF',
371 :     RoyalBlue2 => '#2B65EC',
372 :     RoyalBlue3 => '#2554C7',
373 :     RoyalBlue4 => '#15317E',
374 :     Salmon1 => '#F88158',
375 :     Salmon2 => '#E67451',
376 :     Salmon3 => '#C36241',
377 :     Salmon4 => '#7E3817',
378 :     SandyBrown => '#EE9A4D',
379 :     SeaGreen => '#4E8975',
380 :     SeaGreen1 => '#6AFB92',
381 :     SeaGreen2 => '#64E986',
382 :     SeaGreen3 => '#54C571',
383 :     SeaGreen4 => '#387C44',
384 :     Sienna => '#8A4117',
385 :     Sienna1 => '#F87431',
386 :     Sienna2 => '#E66C2C',
387 :     Sienna3 => '#C35817',
388 :     Sienna4 => '#7E3517',
389 :     SkyBlue => '#6698FF',
390 : golsen 1.2 SkyBlue1 => '#82CAFF',
391 : overbeek 1.1 SkyBlue2 => '#79BAEC',
392 :     SkyBlue3 => '#659EC7',
393 :     SkyBlue4 => '#41627E',
394 :     SlateBlue => '#3574EC7',
395 :     SlateBlue => '#737CA1',
396 :     SlateBlue => '#737CA1',
397 :     SlateBlue2 => '#6960EC',
398 :     SlateBlue4 => '#342D7E',
399 :     SlateGray => '#657383',
400 :     SlateGray1 => '#C2DFFF',
401 :     SlateGray2 => '#B4CFEC',
402 :     SlateGray3 => '#98AFC7',
403 :     SlateGray4 => '#616D7E',
404 :     SpringGreen => '#4AA02C',
405 :     SpringGreen => '#4AA02C',
406 :     SpringGreen1 => '#5EFB6E',
407 :     SpringGreen2 => '#57E964',
408 :     SpringGreen3 => '#4CC552',
409 :     SpringGreen4 => '#347C2C',
410 :     SteelBlue => '#4863A0',
411 :     SteelBlue1 => '#5CB3FF',
412 :     SteelBlue2 => '#56A5EC',
413 :     SteelBlue3 => '#488AC7',
414 :     SteelBlue4 => '#2B547E',
415 :     Thistle => '#D2B9D3',
416 :     Thistle1 => '#FCDFFF',
417 :     Thistle2 => '#E9CFEC',
418 :     Thistle3 => '#C6AEC7',
419 :     Thistle4 => '#806D7E',
420 :     Turquoise => '#43C6DB',
421 :     Turquoise1 => '#52F3FF',
422 :     Turquoise2 => '#4EE2EC',
423 :     Turquoise3 => '#43BFC7',
424 :     White => '#FFFFFF',
425 :     Violet => '#8D38C9',
426 :     VioletRed => '#F6358A',
427 :     VioletRed1 => '#F6358A',
428 :     VioletRed2 => '#E4317F',
429 :     VioletRed3 => '#C12869',
430 :     VioletRed4 => '#7D0541',
431 :     Yellow => '#FFFF00',
432 :     Yellow1 => '#FFFC17',
433 :     YellowGreen => '#52D017',
434 : golsen 1.3 # Additional color names from X11
435 :     aliceblue => '#f0f8ff',
436 :     antiquewhite => '#faebd7',
437 :     antiquewhite1 => '#ffefdb',
438 :     antiquewhite2 => '#eedfcc',
439 :     antiquewhite3 => '#cdc0b0',
440 :     antiquewhite4 => '#8b8378',
441 :     aquamarine => '#7fffd4',
442 :     aquamarine1 => '#7fffd4',
443 :     aquamarine2 => '#76eec6',
444 :     aquamarine3 => '#66cdaa',
445 :     aquamarine4 => '#458b74',
446 :     azure => '#f0ffff',
447 :     azure1 => '#f0ffff',
448 :     azure2 => '#e0eeee',
449 :     azure3 => '#c1cdcd',
450 :     azure4 => '#838b8b',
451 :     beige => '#f5f5dc',
452 :     bisque => '#ffe4c4',
453 :     bisque1 => '#ffe4c4',
454 :     bisque2 => '#eed5b7',
455 :     bisque3 => '#cdb79e',
456 :     bisque4 => '#8b7d6b',
457 :     blanchedalmond => '#ffebcd',
458 :     blue1 => '#0000ff',
459 :     blue2 => '#0000ee',
460 :     blue3 => '#0000cd',
461 :     blue4 => '#00008b',
462 :     blueviolet => '#8a2be2',
463 :     brown => '#a52a2a',
464 :     brown1 => '#ff4040',
465 :     brown2 => '#ee3b3b',
466 :     brown3 => '#cd3333',
467 :     brown4 => '#8b2323',
468 :     burlywood => '#deb887',
469 :     burlywood1 => '#ffd39b',
470 :     burlywood2 => '#eec591',
471 :     burlywood3 => '#cdaa7d',
472 :     burlywood4 => '#8b7355',
473 :     cadetblue => '#5f9ea0',
474 :     cadetblue1 => '#98f5ff',
475 :     cadetblue2 => '#8ee5ee',
476 :     chartreuse1 => '#7fff00',
477 :     chocolate1 => '#ff7f24',
478 :     chocolate2 => '#ee7621',
479 :     chocolate3 => '#cd661d',
480 :     chocolate4 => '#8b4513',
481 :     coral1 => '#ff7256',
482 :     coral4 => '#8b3e2f',
483 :     cornsilk => '#fff8dc',
484 :     cornsilk1 => '#fff8dc',
485 :     cornsilk2 => '#eee8cd',
486 :     cornsilk3 => '#cdc8b1',
487 :     cornsilk4 => '#8b8878',
488 :     darkblue => '#00008b',
489 :     darkcyan => '#008b8b',
490 :     darkgray => '#a9a9a9',
491 :     darkgrey => '#a9a9a9',
492 :     darkkhaki => '#bdb76b',
493 :     darkmagenta => '#8b008b',
494 :     darkolivegreen => '#556b2f',
495 :     darkorange4 => '#8b4500',
496 :     darkred => '#8b0000',
497 :     darkslategrey => '#2f4f4f',
498 :     darkslategrey1 => '#97ffff',
499 :     darkslategrey2 => '#8deeee',
500 :     darkslategrey3 => '#79cdcd',
501 :     darkslategrey4 => '#528b8b',
502 :     deeppink1 => '#ff1493',
503 :     deepskyblue1 => '#00bfff',
504 :     dimgrey => '#696969',
505 :     dodgerblue1 => '#1e90ff',
506 :     firebrick4 => '#8b1a1a',
507 :     floralwhite => '#fffaf0',
508 :     gainsboro => '#dcdcdc',
509 :     ghostwhite => '#f8f8ff',
510 :     gray1 => '#030303',
511 :     gray10 => '#1a1a1a',
512 :     gray100 => '#ffffff',
513 :     gray11 => '#1c1c1c',
514 :     gray12 => '#1f1f1f',
515 :     gray13 => '#212121',
516 :     gray14 => '#242424',
517 :     gray15 => '#262626',
518 :     gray16 => '#292929',
519 :     gray17 => '#2b2b2b',
520 :     gray19 => '#303030',
521 :     gray2 => '#050505',
522 :     gray20 => '#333333',
523 :     gray22 => '#383838',
524 :     gray3 => '#080808',
525 :     gray33 => '#545454',
526 :     gray4 => '#0a0a0a',
527 :     gray5 => '#0d0d0d',
528 :     gray51 => '#828282',
529 :     gray52 => '#858585',
530 :     gray53 => '#878787',
531 :     gray54 => '#8a8a8a',
532 :     gray55 => '#8c8c8c',
533 :     gray56 => '#8f8f8f',
534 :     gray57 => '#919191',
535 :     gray58 => '#949494',
536 :     gray59 => '#969696',
537 :     gray6 => '#0f0f0f',
538 :     gray60 => '#999999',
539 :     gray61 => '#9c9c9c',
540 :     gray62 => '#9e9e9e',
541 :     gray63 => '#a1a1a1',
542 :     gray64 => '#a3a3a3',
543 :     gray65 => '#a6a6a6',
544 :     gray66 => '#a8a8a8',
545 :     gray67 => '#ababab',
546 :     gray68 => '#adadad',
547 :     gray69 => '#b0b0b0',
548 :     gray7 => '#121212',
549 :     gray70 => '#b3b3b3',
550 :     gray71 => '#b5b5b5',
551 :     gray72 => '#b8b8b8',
552 :     gray73 => '#bababa',
553 :     gray74 => '#bdbdbd',
554 :     gray75 => '#bfbfbf',
555 :     gray76 => '#c2c2c2',
556 :     gray77 => '#c4c4c4',
557 :     gray78 => '#c7c7c7',
558 :     gray79 => '#c9c9c9',
559 :     gray8 => '#141414',
560 :     gray80 => '#cccccc',
561 :     gray81 => '#cfcfcf',
562 :     gray82 => '#d1d1d1',
563 :     gray83 => '#d4d4d4',
564 :     gray84 => '#d6d6d6',
565 :     gray85 => '#d9d9d9',
566 :     gray86 => '#dbdbdb',
567 :     gray87 => '#dedede',
568 :     gray88 => '#e0e0e0',
569 :     gray89 => '#e3e3e3',
570 :     gray9 => '#171717',
571 :     gray90 => '#e5e5e5',
572 :     gray91 => '#e8e8e8',
573 :     gray92 => '#ebebeb',
574 :     gray93 => '#ededed',
575 :     gray94 => '#f0f0f0',
576 :     gray95 => '#f2f2f2',
577 :     gray96 => '#f5f5f5',
578 :     gray97 => '#f7f7f7',
579 :     gray98 => '#fafafa',
580 :     gray99 => '#fcfcfc',
581 :     grey => '#bebebe',
582 :     grey0 => '#000000',
583 :     grey1 => '#030303',
584 :     grey10 => '#1a1a1a',
585 :     grey100 => '#ffffff',
586 :     grey11 => '#1c1c1c',
587 :     grey12 => '#1f1f1f',
588 :     grey13 => '#212121',
589 :     grey14 => '#242424',
590 :     grey15 => '#262626',
591 :     grey16 => '#292929',
592 :     grey17 => '#2b2b2b',
593 :     grey18 => '#2e2e2e',
594 :     grey19 => '#303030',
595 :     grey2 => '#050505',
596 :     grey20 => '#333333',
597 :     grey21 => '#363636',
598 :     grey22 => '#383838',
599 :     grey23 => '#3b3b3b',
600 :     grey24 => '#3d3d3d',
601 :     grey25 => '#404040',
602 :     grey26 => '#424242',
603 :     grey27 => '#454545',
604 :     grey28 => '#474747',
605 :     grey29 => '#4a4a4a',
606 :     grey3 => '#080808',
607 :     grey30 => '#4d4d4d',
608 :     grey31 => '#4f4f4f',
609 :     grey32 => '#525252',
610 :     grey33 => '#545454',
611 :     grey34 => '#575757',
612 :     grey35 => '#595959',
613 :     grey36 => '#5c5c5c',
614 :     grey37 => '#5e5e5e',
615 :     grey38 => '#616161',
616 :     grey39 => '#636363',
617 :     grey4 => '#0a0a0a',
618 :     grey40 => '#666666',
619 :     grey41 => '#696969',
620 :     grey42 => '#6b6b6b',
621 :     grey43 => '#6e6e6e',
622 :     grey44 => '#707070',
623 :     grey45 => '#737373',
624 :     grey46 => '#757575',
625 :     grey47 => '#787878',
626 :     grey48 => '#7a7a7a',
627 :     grey49 => '#7d7d7d',
628 :     grey5 => '#0d0d0d',
629 :     grey50 => '#7f7f7f',
630 :     grey51 => '#828282',
631 :     grey52 => '#858585',
632 :     grey53 => '#878787',
633 :     grey54 => '#8a8a8a',
634 :     grey55 => '#8c8c8c',
635 :     grey56 => '#8f8f8f',
636 :     grey57 => '#919191',
637 :     grey58 => '#949494',
638 :     grey59 => '#969696',
639 :     grey6 => '#0f0f0f',
640 :     grey60 => '#999999',
641 :     grey61 => '#9c9c9c',
642 :     grey62 => '#9e9e9e',
643 :     grey63 => '#a1a1a1',
644 :     grey64 => '#a3a3a3',
645 :     grey65 => '#a6a6a6',
646 :     grey66 => '#a8a8a8',
647 :     grey67 => '#ababab',
648 :     grey68 => '#adadad',
649 :     grey69 => '#b0b0b0',
650 :     grey7 => '#121212',
651 :     grey70 => '#b3b3b3',
652 :     grey71 => '#b5b5b5',
653 :     grey72 => '#b8b8b8',
654 :     grey73 => '#bababa',
655 :     grey74 => '#bdbdbd',
656 :     grey75 => '#bfbfbf',
657 :     grey76 => '#c2c2c2',
658 :     grey77 => '#c4c4c4',
659 :     grey78 => '#c7c7c7',
660 :     grey79 => '#c9c9c9',
661 :     grey8 => '#141414',
662 :     grey80 => '#cccccc',
663 :     grey81 => '#cfcfcf',
664 :     grey82 => '#d1d1d1',
665 :     grey83 => '#d4d4d4',
666 :     grey84 => '#d6d6d6',
667 :     grey85 => '#d9d9d9',
668 :     grey86 => '#dbdbdb',
669 :     grey87 => '#dedede',
670 :     grey88 => '#e0e0e0',
671 :     grey89 => '#e3e3e3',
672 :     grey9 => '#171717',
673 :     grey90 => '#e5e5e5',
674 :     grey91 => '#e8e8e8',
675 :     grey92 => '#ebebeb',
676 :     grey93 => '#ededed',
677 :     grey94 => '#f0f0f0',
678 :     grey95 => '#f2f2f2',
679 :     grey96 => '#f5f5f5',
680 :     grey97 => '#f7f7f7',
681 :     grey98 => '#fafafa',
682 :     grey99 => '#fcfcfc',
683 :     honeydew => '#f0fff0',
684 :     honeydew1 => '#f0fff0',
685 :     honeydew2 => '#e0eee0',
686 :     honeydew3 => '#c1cdc1',
687 :     honeydew4 => '#838b83',
688 :     indianred => '#cd5c5c',
689 :     ivory => '#fffff0',
690 :     ivory1 => '#fffff0',
691 :     ivory2 => '#eeeee0',
692 :     ivory3 => '#cdcdc1',
693 :     ivory4 => '#8b8b83',
694 :     lavender => '#e6e6fa',
695 :     lavenderblush => '#fff0f5',
696 :     lavenderblush1 => '#fff0f5',
697 :     lavenderblush2 => '#eee0e5',
698 :     lavenderblush3 => '#cdc1c5',
699 :     lavenderblush4 => '#8b8386',
700 :     lemonchiffon1 => '#fffacd',
701 :     lightcyan1 => '#e0ffff',
702 :     lightgoldenrod2 => '#eedc82',
703 :     lightgray => '#d3d3d3',
704 :     lightgreen => '#90ee90',
705 :     lightgrey => '#d3d3d3',
706 :     lightsalmon1 => '#ffa07a',
707 :     lightskyblue1 => '#b0e2ff',
708 :     lightslategrey => '#778899',
709 :     lightsteelblue3 => '#a2b5cd',
710 :     lightyellow => '#ffffe0',
711 :     lightyellow1 => '#ffffe0',
712 :     lightyellow2 => '#eeeed1',
713 :     lightyellow3 => '#cdcdb4',
714 :     lightyellow4 => '#8b8b7a',
715 :     linen => '#faf0e6',
716 :     magenta4 => '#8b008b',
717 :     mediumblue => '#0000cd',
718 :     mintcream => '#f5fffa',
719 :     mistyrose => '#ffe4e1',
720 :     mistyrose1 => '#ffe4e1',
721 :     mistyrose2 => '#eed5d2',
722 :     mistyrose3 => '#cdb7b5',
723 :     mistyrose4 => '#8b7d7b',
724 :     moccasin => '#ffe4b5',
725 :     navajowhite => '#ffdead',
726 :     navajowhite1 => '#ffdead',
727 :     navajowhite2 => '#eecfa1',
728 :     navajowhite3 => '#cdb38b',
729 :     navajowhite4 => '#8b795e',
730 :     navy => '#000080',
731 :     navyblue => '#000080',
732 :     oldlace => '#fdf5e6',
733 :     olivedrab => '#6b8e23',
734 :     olivedrab1 => '#c0ff3e',
735 :     olivedrab2 => '#b3ee3a',
736 :     olivedrab3 => '#9acd32',
737 :     olivedrab4 => '#698b22',
738 :     orange => '#ffa500',
739 :     orange1 => '#ffa500',
740 :     orange2 => '#ee9a00',
741 :     orange3 => '#cd8500',
742 :     orange4 => '#8b5a00',
743 :     orangered => '#ff4500',
744 :     orangered1 => '#ff4500',
745 :     orangered2 => '#ee4000',
746 :     orangered3 => '#cd3700',
747 :     orangered4 => '#8b2500',
748 :     orchid => '#da70d6',
749 :     orchid1 => '#ff83fa',
750 :     orchid2 => '#ee7ae9',
751 :     orchid3 => '#cd69c9',
752 :     orchid4 => '#8b4789',
753 :     palegoldenrod => '#eee8aa',
754 :     palegreen => '#98fb98',
755 :     palegreen1 => '#9aff9a',
756 :     palegreen2 => '#90ee90',
757 :     palegreen3 => '#7ccd7c',
758 :     palegreen4 => '#548b54',
759 :     paleturquoise => '#afeeee',
760 :     paleturquoise1 => '#bbffff',
761 :     paleturquoise2 => '#aeeeee',
762 :     papayawhip => '#ffefd5',
763 :     peachpuff => '#ffdab9',
764 :     peachpuff1 => '#ffdab9',
765 :     peachpuff2 => '#eecbad',
766 :     peachpuff3 => '#cdaf95',
767 :     peachpuff4 => '#8b7765',
768 :     peru => '#cd853f',
769 :     pink1 => '#ffb5c5',
770 :     powderblue => '#b0e0e6',
771 :     red3 => '#cd0000',
772 :     red4 => '#8b0000',
773 :     saddlebrown => '#8b4513',
774 :     salmon => '#fa8072',
775 :     seashell => '#fff5ee',
776 :     seashell1 => '#fff5ee',
777 :     seashell2 => '#eee5de',
778 :     seashell3 => '#cdc5bf',
779 :     seashell4 => '#8b8682',
780 :     slateblue1 => '#836fff',
781 :     slateblue3 => '#6959cd',
782 :     slategrey => '#708090',
783 :     slategrey1 => '#c6e2ff',
784 :     slategrey2 => '#b9d3ee',
785 :     slategrey3 => '#9fb6cd',
786 :     slategrey4 => '#6c7b8b',
787 :     snow => '#fffafa',
788 :     snow1 => '#fffafa',
789 :     snow2 => '#eee9e9',
790 :     snow3 => '#cdc9c9',
791 :     snow4 => '#8b8989',
792 :     tan => '#d2b48c',
793 :     tan1 => '#ffa54f',
794 :     tan2 => '#ee9a49',
795 :     tan3 => '#cd853f',
796 :     tan4 => '#8b5a2b',
797 :     tomato => '#ff6347',
798 :     tomato1 => '#ff6347',
799 :     tomato2 => '#ee5c42',
800 :     tomato3 => '#cd4f39',
801 :     tomato4 => '#8b3626',
802 :     turquoise4 => '#00868b',
803 :     wheat => '#f5deb3',
804 :     wheat1 => '#ffe7ba',
805 :     wheat2 => '#eed8ae',
806 :     wheat3 => '#cdba96',
807 :     wheat4 => '#8b7e66',
808 :     whitesmoke => '#f5f5f5',
809 :     yellow2 => '#eeee00',
810 :     yellow3 => '#cdcd00',
811 :     yellow4 => '#8b8b00',
812 : overbeek 1.1 );
813 :    
814 :    
815 :     my %name2rgb = map { $_ => [ map { hex( $_ ) / 255 }
816 :     $name2html{ $_ } =~ m/^#([\da-f][\da-f])([\da-f][\da-f])([\da-f][\da-f])/
817 :     ]
818 :     }
819 :     keys %name2html;
820 :    
821 :     # Convert html to RGB:
822 :    
823 :     # namedcolor
824 :     # #xxxxxx
825 :     # #xxx
826 :     # xxxxxx
827 :     # xxx
828 :    
829 :     sub html2rgb {
830 :     my $html = lc shift; # Lower case
831 :     $html =~ s/\s+//g; # No spaces
832 :     $html =~ s/grey/gray/g; # USA spelling
833 :    
834 :     my $rgb;
835 :     if ( $rgb = $name2rgb{ $html } ) { return wantarray ? @$rgb : $rgb }
836 :    
837 :     my @rgb = map { hex( $_ ) / 255 }
838 :     $html =~ m/^#([\da-f][\da-f])([\da-f][\da-f])([\da-f][\da-f])/ ? ( $1, $2, $3 )
839 :     : $html =~ m/^#([\da-f])([\da-f])([\da-f])/ ? map { "$_$_" } ( $1, $2, $3 )
840 :     : $html =~ m/^([\da-f][\da-f])([\da-f][\da-f])([\da-f][\da-f])/ ? ( $1, $2, $3 )
841 :     : $html =~ m/^([\da-f])([\da-f])([\da-f])/ ? map { "$_$_" } ( $1, $2, $3 )
842 :     : ( '7f', '7f', '7f' );
843 :    
844 :     wantarray() ? @rgb : \@rgb
845 :     }
846 :    
847 :    
848 :     # Produce the gray equivalent in brightness to an RGB value:
849 :    
850 :     sub rgb2gray {
851 :     my ( $r, $g, $b ) = @_;
852 :     if ( ref( $r ) eq "ARRAY" ) { ( $r, $g, $b ) = @$r }
853 :     defined( $r ) && defined( $g ) && defined( $b ) || return undef;
854 :     if ( $r > 1 ) { $r = 1 } elsif ( $r < 0 ) { $r = 0 }
855 :     if ( $g > 1 ) { $g = 1 } elsif ( $g < 0 ) { $g = 0 }
856 :     if ( $b > 1 ) { $b = 1 } elsif ( $b < 0 ) { $b = 0 }
857 :     # Various ITU recommendations and the new standard:
858 :     # 0.299 * $r + 0.587 * $g + 0.114 * $b; # Rec 601-1
859 :     # 0.213 * $r + 0.715 * $g + 0.072 * $b; # Rec 709
860 :     0.222 * $r + 0.707 * $g + 0.071 * $b; # ITU std (D65 white point)
861 :     }
862 :    
863 :    
864 :     # Convert an RGB value to an HTML string:
865 :    
866 :     sub rgb2html {
867 :     my ( $r, $g, $b ) = @_;
868 :     if ( ref( $r ) eq "ARRAY" ) { ( $r, $g, $b ) = @$r }
869 :     defined( $r ) && defined( $g ) && defined( $b ) || return undef;
870 :     if ( $r > 1 ) { $r = 1 } elsif ( $r < 0 ) { $r = 0 }
871 :     if ( $g > 1 ) { $g = 1 } elsif ( $g < 0 ) { $g = 0 }
872 :     if ( $b > 1 ) { $b = 1 } elsif ( $b < 0 ) { $b = 0 }
873 :     sprintf("#%02x%02x%02x", int(255.999*$r), int(255.999*$g), int(255.999*$b) )
874 :     }
875 :    
876 :    
877 :     #-------------------------------------------------------------------------------
878 :     # Blend 2 or more RGB colors:
879 :     #
880 :     # $color = blend_rgb_colors( $color1, $color2, ... )
881 :     #-------------------------------------------------------------------------------
882 :     sub blend_rgb_colors
883 :     {
884 :     my @rgb = ( 0, 0, 0 );
885 :     my $n = 0;
886 :     while ( @_ )
887 :     {
888 :     my @clr = @{ shift @_ };
889 :     @rgb = map { $_ + shift @clr } @rgb;
890 :     $n++;
891 :     }
892 :     @rgb = map { $_/$n } @rgb if $n;
893 :     wantarray() ? @rgb : \@rgb
894 :     }
895 :    
896 :    
897 :     #-------------------------------------------------------------------------------
898 :     # Blend 2 or more HTML colors:
899 :     #
900 :     # $color = blend_html_colors( $color1, $color2, ... )
901 :     #-------------------------------------------------------------------------------
902 :     sub blend_html_colors
903 :     {
904 :     my @rgb = ( 0, 0, 0 );
905 :     my $n = 0;
906 :     while ( @_ )
907 :     {
908 :     my @clr = html2rgb( shift );
909 :     @rgb = map { $_ + shift @clr } @rgb;
910 :     $n++;
911 :     }
912 :     @rgb = map { $_/$n } @rgb if $n;
913 :    
914 :     rgb2html( @rgb );
915 :     }
916 :    
917 :    
918 :     #-------------------------------------------------------------------------------
919 :     # Define a distance between 2 rgb colors
920 :     #
921 :     # $name = rgb_distance( $rgb1, $rgb2 )
922 :     #-------------------------------------------------------------------------------
923 :     sub rgb_distance
924 :     {
925 :     ( ref( $_[0] ) eq 'ARRAY' ) && ( ref( $_[0] ) eq 'ARRAY' ) || return undef;
926 :     my @rgb1 = @{$_[0]};
927 :     my @rgb2 = @{$_[1]};
928 :     ( grep { defined } @rgb1, @rgb2 ) == 6 || return undef;
929 :     my $d2 = ( $rgb1[0] - $rgb2[0] ) ** 2
930 :     + ( $rgb1[1] - $rgb2[1] ) ** 2
931 :     + ( $rgb1[2] - $rgb2[2] ) ** 2;
932 :     return sqrt( $d2 );
933 :     }
934 :    
935 :    
936 :     #-------------------------------------------------------------------------------
937 :     # Find the closest named color
938 :     #
939 :     # $name = rgb2name( $rgb )
940 :     #-------------------------------------------------------------------------------
941 :     sub rgb2name
942 :     {
943 :     my @rgb = ref( $_[0] ) eq 'ARRAY' ? @{ $_[0] } : @_;
944 :     ( grep { defined } @rgb ) == 3 || return undef;
945 :    
946 :     my ( $name ) = map { $_->[0] }
947 :     sort { $a->[1] <=> $b->[1] }
948 :     map { [ $_, rgb_distance( \@rgb, $name2rgb{ $_ } ) ] }
949 :     keys %name2rgb;
950 :     return $name;
951 :     }
952 :    
953 :    
954 :     1;

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3