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

Annotation of /FigKernelPackages/gjocolorlib.pm

Parent Directory Parent Directory | Revision Log Revision Log


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

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3