Messing with Colors

This is linux centric. for windows one would have to provide rgb.txt UK

 #!/usr/bin/wish
 # $Id: MungeColor.tcl,v 5.0 2003/06/05 14:49:36 uwe Exp uwe $
 # what: color numbers for plotting
 
 package provide MungeColor                1.0
 
 set RGB(fname) "/usr/X11R6/lib/X11/rgb.txt"
 set RGB(file) [ open $RGB(fname) r ]
 
 set filecont [ split [ read $RGB(file) [ file size $RGB(fname) ] ] "\n" ]
 foreach str $filecont {
          if { "[ string index $str 0 ]" == "!" }  {
                 continue
         }
         if { [ scan $str " %d %d %d %n " R G B pos ] < 3 } {
                 continue
         }
         set dark 0.7
         set LR [ expr int( $R * $dark ) ]
         set LG [ expr int( $G * $dark ) ]
         set LB [ expr int( $B * $dark ) ]
         set cval [ format "#%02x%02x%02x" $R $G $B ]
         set dval [ format "#%02x%02x%02x" $LR $LG $LB ]
         set cname [ string trim [ string range $str $pos end ] ] 
         #D0# puts "$R $G $B $pos $cval \"$cname\""
         eval "set RGB(\$cname) {$R $G $B}"
         # set RGB($cval) "$cname"
         # .l1 configure -bg $cval 
         # .l2 configure -bg $dval 
         # update
         # update
 }
 close $RGB(file)
 
 proc 2color { val } {
         global RGB
         set val [ string trim $val ]
         if { [ string index $val 0 ] != "#" } {
                 if { [ array names RGB $val ] != {} } {
                         #D0# puts " color name $val"
                         set rgb $RGB($val)
                         #D0# puts rgb:$rgb
                         foreach {R G B} $rgb {
                                 #D0# puts " color R:$R "
                                 #D0# puts " color G:$G "
                                 #D0# puts " color B:$B "
                         } 
                 } else { 
                         foreach {R G B} {99 99 99} {
                         }
                 }
         } else {
                 #D0# puts " color number $val"
                 switch [ string length $val ] {
                            4 {
                                 scan $val "#%01x%01x%01x" R G B
                                 set R [ expr $R * 0x11 ]
                                 set G [ expr $G * 0x11 ]
                                 set B [ expr $B * 0x11 ]
                         }  7 {
                                 scan $val "#%02x%02x%02x" R G B 
                         } 10 {
                                 scan $val "#%03x%03x%03x" R G B 
                                 set R [ expr $R / 0x11 ]
                                 set G [ expr $G / 0x11 ]
                                 set B [ expr $B / 0x11 ]
                         } default {
                                 #D0# puts length:[ string length $val ]
                                 scan $val "#%02x%02x%02x" R G B 
                         }
                 }
         }
         set dark 0.7
         set LR [ expr round( $R * $dark ) ]
         set LG [ expr round( $G * $dark ) ]
         set LB [ expr round( $B * $dark ) ]
         set cval [ format "#%02x%02x%02x" $R $G $B ]
         set dval [ format "#%02x%02x%02x" $LR $LG $LB ]
         #D0# puts "$cval $dval"
         return "$cval $dval"
 }
 
 proc col_h { val } {
         set ret [ 2color "$val" ]
         set ret [ split $ret ]
         return [ lindex $ret 0 ]
 }
 
 proc col_l { val } {
         set ret [ 2color "$val" ]
         set ret [ split $ret ]
         return [ lindex $ret 1 ]
 }
 
 # END