The gnocl package has its own C-based conversion commands but here are the pure Tcl equivalents.
# !/bin/sh
# the next line restarts using tclsh \
exec tclsh "$0" "$@"
package require Gnocl
# colour in hexadecimal
set clr #8B6914
puts $clr
proc hex2rgb { hex {opt -8bit} } {
if { [lsearch "-8bit -16bit -float" $opt] == -1 } {
set msg "Error. Wrong option $opt.\nValid options are: -8bit (default) -16bit, or -float."
return -code error $msg
}
# convert to 8bit values
scan $hex "#%02x%02x%02x" r g b
switch $opt {
-16bit {
# convert to 0-65535
if {$r eq 0} {set r 0} {set r [expr int ( ($r.0/255)*65535 )]}
if {$g eq 0} {set g 0} {set g [expr int ( ($g.0/255)*65535 )]}
if {$b eq 0} {set b 0} {set b [expr int ( ($b.0/255)*65535 )]}
}
-float {
# convert 0-1.0
if {$r eq 0} {set r 0.0} {set r [expr $r.0/255]}
if {$g eq 0} {set g 0.0} {set g [expr $g.0/255]}
if {$b eq 0} {set b 0.0} {set b [expr $b.0/255]}
}
}
return [list $r $g $b]
}
puts [hex2rgb $clr]
puts [hex2rgb $clr -16bit]
puts [hex2rgb $clr -float]
proc rgb2hex { clr {opt -8bit} } {
lassign $clr r g b
if { [lsearch "-8bit -16bit -float" $opt] == -1 } {
set msg "Error. Wrong option $opt.\nValid options are: -8bit (default) -16bit, or -float."
return -code error $msg
}
switch $opt {
-16bit {
# convert to 0-65535
set d [expr 255.0/65535]
if {$r eq 0} {set r 0} {set r [expr int ( $r.0*$d )]}
if {$g eq 0} {set g 0} {set g [expr int ( $g.0*$d )]}
if {$b eq 0} {set b 0} {set b [expr int ( $b.0*$d )]}
}
-float {
# convert 0-1.0
if {$r eq 0} {set r 0} {set r [expr int ( $r*255.0 )]}
if {$g eq 0} {set g 0} {set g [expr int ( $g*255.0 )]}
if {$b eq 0} {set b 0} {set b [expr int ( $b*255.0 )]}
}
}
return [format "#%02X%02X%02X" $r $g $b]
}
puts [rgb2hex {139 105 20} ]
puts [rgb2hex {35723 26985 5140} -16bit]
puts [rgb2hex {0.5450980392156862 0.4117647058823529 0.0784313725490196} -float]
proc rgba2hex { clr {opt -8bit} } {
lassign $clr r g b a
if { [lsearch "-8bit -16bit -float" $opt] == -1 } {
set msg "Error. Wrong option $opt.\nValid options are: -8bit (default) -16bit, or -float."
return -code error $msg
}
switch $opt {
-16bit {
# convert to 0-65535
if {$a == ""} {set a 65535}
set d [expr 255.0/65535]
if {$r eq 0} {set r 0} {set r [expr int ( $r.0*$d )]}
if {$g eq 0} {set g 0} {set g [expr int ( $g.0*$d )]}
if {$b eq 0} {set b 0} {set b [expr int ( $b.0*$d )]}
if {$a eq 0} {set a 0} {set a [expr int ( $a.0*$d )]}
}
-float {
# convert 0-1.0
if {$a == ""} {set a 1.0}
if {$r eq 0} {set r 0} {set r [expr int ( $r*255.0 )]}
if {$g eq 0} {set g 0} {set g [expr int ( $g*255.0 )]}
if {$b eq 0} {set b 0} {set b [expr int ( $b*255.0 )]}
if {$a eq 0} {set a 0} {set a [expr int ( $a*255.0 )]}
}
default {
if {$a == ""} {set a 255}
}
}
return [format "#%02X%02X%02X%02X" $r $g $b $a]
}
puts [rgba2hex {255 255 255}]
puts [rgba2hex {255 255 255 255}]
Comments