%%HP: T(1)A(D)F(.); DIR HLS RGB HEX HLS OPEN 0 0 0 0 0 0 0 R G B H L S X Y M N R 100 / 'R' STO G 100 / 'G' STO B 100 / 'B' STO ' -.5*R-.5*G+B' NUM 'X' STO '3/2*R-3/ 2*G' NUM 'Y' STO R G B MAX MAX 'M' STO R G B MIN MIN 'N' STO '(M+N)/2' NUM 'L' STO IF M N == THEN 0 'S' STO 0 'H' STO ELSE IF L .5 THEN '(M- N)/(M+N)' NUM 'S' STO ELSE '(M- N)/(2-M-N)' NUM 'S' STO END X Y ARCTAN 2 * + NUM 2 * NUM MOD 'H' STO END 180 / H * NUM 100 L * 100 S * 3 LIST .05 ADD 1 TRNC "HLS" TAG RGB OPEN 0 0 0 0 0 H L S R G B M N IF H 360 > H 0 < L 0 < L 100 > S 0 < S 100 > OR OR OR OR OR THEN "Component ranges: (0360, 0100, 0100)" MSGBOX ELSE L 100 / 'L' STO S 100 / 'S' STO IF S ABS .001 < THEN L DUP DUP 'R' STO 'G' STO 'B' STO ELSE IF L .5 THEN 'L +S*L' NUM 'M' STO 'L-S*L' NUM 'N' STO ELSE 'S -S*L+L' NUM 'M' STO '-S+S*L+L' NUM 'N' STO END -1 DUP DUP 'R' STO 'G' STO 'B' STO IF H 300 H 60 < OR THEN M 'B' STO END IF H 60 H 180 < AND THEN M 'R' STO END IF H 180 H 300 < AND THEN M 'G' STO END IF H 0 H 120 < AND THEN N 'G' STO END IF H 120 H 240 < AND THEN N 'B' STO END IF H 240 H 360 AND THEN N 'R' STO END H 180 / * NUM 'H' STO IF R 0 < THEN IF H TAN 3 + ABS .001 < THEN B 'R' STO ELSE '(TAN(H)*(B-G/2)+3 /2*G)/(3/2+TAN(H)/ 2)' NUM 'R' STO END ELSE IF G 0 < THEN IF H TAN 3 - ABS .001 < THEN B 'G' STO ELSE '(3/2*R+TAN(H )*(-B+R/2))/(-TAN(H )/2+3/2)' NUM 'G' STO END ELSE IF B 0 < THEN IF H TAN ABS .001 < THEN R 'B' STO ELSE '(3/2*R-3/ 2*G+TAN(H)*(R/2+G/2 ))/TAN(H)' NUM 'B' STO END END END END END R G B 3 LIST 100 * .05 ADD 1 TRNC "RGB" TAG END HEX OBJ SWAP " " SWAP DUP " " SWAP + + STREAM SWAP 2.55 * RB HEX 1 STR TAIL TAIL "0" SWAP + DUP SIZE 2 - DUP 1 + SUB DOSUBS " " SWAP + + STREAM " " SWAP + + + + DEC CLLCD MSGBOX ARCTAN X Y IF X ABS .00001 < THEN Y SIGN 2 / * NUM ELSE Y X / ATAN IF X 0 < THEN + NUM END END OPEN DUP TYPE IF 12 == THEN OBJ DROP END OBJ DROP END