*# non # {cmd:hue-saturation-lightness} - Converts color values from human-meaningful to machine-meaningful # help *! 29aug2007 program hsl version 9 syntax anything, [rgb(string) Palette path(string)] gettoken h anything: anything gettoken s l: anything if mi("`s'") local s 1 else local s= `s'/100 if mi("`l'") local l .5 else local l= `l'/200+.5 // parse hue gettoken from h: h, parse("roygcbp") if (~strpos("roygcbp","`from'") | mi("`from'")) mata: errel("Missing hue letter: r o y g c b p") gettoken to dist: h, parse("roygcbp") if ~strpos("roygcbp","`to'") | mi("`to'") { local to `from' local dist 0 } else if mi("`dist'") local dist 50 local frup roy g c b p roy g c b local frdown b c g yor p b c g yor foreach dir in up down { local sub1`dir'=substr("`fr`dir''",strpos("`fr`dir''","`from'"),.) local sub2`dir'=substr("`sub1`dir''",1,strpos("`sub1`dir''","`to'")) local d`dir'=`dist'/100*(length("`sub2`dir''")-1) } if ("`path'"=="fup") local dir up else if ("`path'"=="fdown") local dir down else if ("`path'"=="long") local dir = cond(`dup'>=`ddown',"up","down") else local dir= cond(`dup'<=`ddown',"up","down") local from=floor(`d`dir'')+1-inlist(substr("`sub2`dir''",floor(`d`dir'')+1,1)," ","o") local to=`from'+2 local dist=(`d`dir''+1-`from')/2 local from=cond(`from'==0,"r",substr("`sub2`dir''",`from',1)) local to=substr("`sub1`dir''",`to',1) // assign r g b to c1 c2 c3 (+ dist) if strpos("rgb","`from'") { local c1 `from' local c3= substr("rgb",strpos("cpy","`to'"),1) } else { local c1 `to' local c3= substr("rgb",strpos("cpy","`from'"),1) local dist= 1-`dist' } local c2= substr("rgb",indexnot("rgb","`c1'`c3'"),1) // set rgb values local frac=cond(`l'>=.5,`s'-`l'*`s',`l'*`s') local `c1'= round(255*(`l'+`frac'),1) local `c2'= round(255*(`l'+(2*`dist'-1)*`frac'),1) local `c3'= round(255*(`l'-`frac'),1) // output if mi("`rgb'") dis "{res:`r' `g' `b'}" else c_local `rgb' `""`r' `g' `b'""' if ~mi("`palette'") palette color "`r' `g' `b'" end