home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #26 / NN_1992_26.iso / spool / comp / lang / tcl / 1803 < prev    next >
Encoding:
Internet Message Format  |  1992-11-11  |  4.8 KB

  1. Path: sparky!uunet!convex!darwin.sura.net!zaphod.mps.ohio-state.edu!sdd.hp.com!swrinde!elroy.jpl.nasa.gov!news.aero.org!sls
  2. From: sls@aero.org (Sam Shen)
  3. Newsgroups: comp.lang.tcl
  4. Subject: color editor
  5. Date: 11 Nov 92 16:58:48
  6. Organization: The Aerospace Corporation
  7. Lines: 185
  8. Distribution: comp
  9. Message-ID: <SLS.92Nov11165848@batcomputer.aero.org>
  10. NNTP-Posting-Host: batcomputer.aero.org
  11.  
  12. Here's another Tcl/Tk tool I've cobbled together.  This one allows you
  13. to fiddle around with red/green/blue or hue/saturation/lightness
  14. values to get a color.  It runs a little jerky on my sparc2 but it's
  15. still fun to play with (it runs faster if you use extended Tcl's floor
  16. and max/min.  The plain Tcl version of floor is grotesque.)
  17.  
  18.     -Sam Shen (sls@aero.org)
  19.  
  20. #!/u/sls/bin/sun4.bin/wish -f
  21. #
  22. # Selcol lets you select a color by twiddling RGB and/or HSL values.
  23. #
  24. # $Id: selcol.tcl,v 1.2 1992/04/10 22:55:31 sls Exp $
  25. #
  26. # $Log: selcol.tcl,v $
  27. # Revision 1.2  1992/04/10  22:55:31  sls
  28. # Edit via HLS as well as RGB.
  29. #
  30. # Revision 1.1  1992/03/03  00:12:48  sls
  31. # Initial revision
  32. #
  33. #
  34.  
  35. set blue 216
  36. set green 236
  37. set red 170
  38. set hue 0
  39. set sat 0
  40. set light 0
  41.  
  42. proc make.scale {name var to title} {
  43.     frame $name
  44.     scale $name.scale -command "update.color $var" -to $to
  45.     global $var
  46.     $name.scale set [set $var]
  47.     label $name.label -text $title
  48.     pack append $name $name.label {} $name.scale {}
  49. }
  50.  
  51. set flag 0
  52. proc update.color {var value} {
  53.     global flag
  54.     if {$flag == 1} {return}
  55.     set flag 1
  56.     global $var red green blue hue sat light
  57.     set $var $value
  58.     set color [format "#%02x%02x%02x" $red $green $blue]
  59.     catch {.patch configure -background $color}
  60.     .value delete @0 end
  61.     .value insert 0 $color
  62.     if {$var == "red" || $var == "blue" || $var == "green"} {
  63.     rgb.changed
  64.     } else {
  65.     hsl.changed
  66.     }
  67.     set flag 0
  68. }
  69.  
  70. proc min args {
  71.     set x [lindex $args 0]
  72.     foreach y $args {
  73.         if {$y < $x} {set x $y}
  74.     }
  75.     return $x
  76. }
  77.  
  78. proc max args {
  79.     set x [lindex $args 0]
  80.     foreach y $args {
  81.         if {$y > $x} {set x $y}
  82.     }
  83.     return $x
  84. }
  85.  
  86. proc floor {x} {
  87.     if {$x < 0} {set t [expr {0-$x}]} {set t $x}
  88.     set s [format %.0f $t]
  89.     if {$t != $x} {return "-$s"} {return $s}
  90. }
  91.  
  92. # The code for translating from RGB to HSL and HSL to RGB is ripped
  93. # off from Fundamentals of Computer Graphics, Foley & Van Dam.
  94.  
  95. proc rgb.changed {} {
  96.     global red green blue hue sat light
  97.     set MIN [min $red $green $blue]
  98.     set MAX [max $red $green $blue]
  99.     set light [expr {($MIN+$MAX)/2}]
  100.     if {$MIN == $MAX} {
  101.     set sat 0
  102.     set hue 0
  103.     } else {
  104.     if {$light < 128} {
  105.         set sat [expr {(256*($MAX-$MIN))/($MAX+$MIN)}]
  106.     } else {
  107.         set sat [expr {(256*($MAX-$MIN))/(512-$MAX-$MIN)}]
  108.     }
  109.     set d [expr {$MAX-$MIN}].0
  110.     set rc [expr {($MAX-$red)/$d}]
  111.     set gc [expr {($MAX-$green)/$d}]
  112.     set bc [expr {($MAX-$blue)/$d}]
  113.     if {$red == $MAX} {
  114.         set hue [expr {$bc-$gc}]
  115.     } else {
  116.        if {$green == $MAX} {
  117.         set hue [expr {2+$rc-$bc}]
  118.        } else {
  119.         set hue [expr {4+$gc-$rc}]
  120.        }
  121.     }
  122.     set hue [expr {$hue*60}]
  123.     if {$hue < 0} {set hue [expr {$hue+360}]}
  124.     }
  125.     set hue [format %.0f $hue]
  126.     .scales.hue.scale set $hue
  127.     .scales.sat.scale set $sat
  128.     .scales.light.scale set $light
  129. }
  130.  
  131. proc value {n1 n2 hue} {
  132.     if {$hue > 360} {set hue [expr {$hue-360}]}
  133.     if {$hue < 0} {set hue [expr {$hue+360}]}
  134.     if {$hue < 60} {
  135.     set r [expr {$n1+($n2-$n1)*$hue/60}]
  136.     } else {
  137.     if {$hue < 180} {
  138.         set r $n2
  139.     } else {
  140.         if {$hue < 240} {
  141.         set r [expr {$n1+($n2-$n1)*(240-$hue)/60}]
  142.         } else {
  143.         set r $n1
  144.         }
  145.     }
  146.     }
  147.     set r [format %.0f [floor $r]]
  148.     return $r
  149. }
  150.  
  151. proc hsl.changed {} {
  152.     global red green blue hue sat light
  153.     if {$light < 128} {
  154.     set m2 [expr {$light*(255+$sat)/256.0}]
  155.     } else {
  156.     set m2 [expr {$light+$sat-$light*$sat/256.0}]
  157.     }
  158.     set m1 [expr {2*$light-$m2}]
  159.     if {$sat == 0} {
  160.     set red $light
  161.     set green $light
  162.     set blue $light
  163.     }
  164.     set red [value $m1 $m2 [expr {$hue+120}]]
  165.     set green [value $m1 $m2 $hue]
  166.     set blue [value $m1 $m2 [expr {$hue-120}]]
  167.     .scales.red.scale set $red
  168.     .scales.green.scale set $green
  169.     .scales.blue.scale set $blue
  170. }
  171.  
  172. frame .patch -geometry 100x100
  173. entry .value -width 12
  174. bind .value <1> {%W select from @0; %W select to end; }
  175.  
  176. frame .scales
  177. set flag 1
  178. make.scale .scales.red red 255 "Red"
  179. make.scale .scales.green green 255 "Green"
  180. make.scale .scales.blue blue 255 "Blue"
  181. make.scale .scales.hue hue 360 "Hue"
  182. make.scale .scales.sat sat 255 "Saturation"
  183. make.scale .scales.light light 255 "Lightness"
  184. pack append .scales .scales.red {left} .scales.green {left} .scales.blue {left}
  185. pack append .scales .scales.hue {left} .scales.sat {left} .scales.light {left}
  186. set flag 0
  187.  
  188. button .quit -command {exit} -text "Quit"
  189.  
  190. pack append . .scales {} .value {fill} .patch {expand} .quit {fill expand}
  191. update
  192.  
  193. .patch configure -geometry [ format "%dx100" [ winfo width . ] ]
  194.  
  195. update.color red $red
  196.  
  197.