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