Type : CREACION_INTERNA
La macro no lee ningún dato. Realiza cálculos matemáticos basados en los parámetros de entrada (h, l, s) para generar los valores RGB. Los parámetros se proporcionan al llamar a la macro.
| 1 | /* ----------------------------------------------------------------------- |
| 2 | Program : HLStoRGB.sas |
| 3 | |
| 4 | Author : Perry Watts |
| 5 | Date : Friday, April 11, 2003 |
| 6 | |
| 7 | Path : Pgm\Mac |
| 8 | |
| 9 | Purpose : Use Foley and Van Dam Procedure HLS_TO_RGB on p. 619 |
| 10 | to calculate the corresponding RGB value. |
| 11 | ------------------------------------------------------------------- */ |
| 12 | |
| 13 | %macro hlstorgb(h,l,s); |
| 14 | %local hue light sat m1 m2 rhue ghue bhue r g b rr gg bb; |
| 15 | %let hue=%sysevalf(&h - 120); |
| 16 | %let light =%sysevalf(&l/255); |
| 17 | %let sat=%sysevalf(&s/255); |
| 18 | %IF &light le 0.5 %THEN %let m2=%sysevalf(&light*(1+&sat.)); |
| 19 | %ELSE %let m2=%sysevalf(&light+&sat.-&light*&sat); |
| 20 | %let m1 = %sysevalf(2 * &light. - &m2.); |
| 21 | %IF &sat eq 0 %THEN %DO; |
| 22 | %let r=&l; %let g=&l; %let b=&l; |
| 23 | %END; |
| 24 | %ELSE %DO; |
| 25 | %let rhue=%eval(&hue+120); |
| 26 | %IF &rhue gt 360 %THEN %let rhue= %eval(&rhue.-360); |
| 27 | %IF &rhue lt 0 %THEN %let rhue= %eval(&rhue.+360); |
| 28 | %IF &rhue lt 60 %THEN %let r = %sysevalf((&m1+(&m2-&m1)*&rhue./60)*255); |
| 29 | %ELSE %IF &rhue lt 180 %THEN %let r=%sysevalf(255*&m2.); |
| 30 | %ELSE %IF &rhue lt 240 %THEN %let r=%sysevalf((&m1+(&m2-&m1)*(240-&rhue)/60)*255); |
| 31 | %ELSE %let r=%sysevalf(255*&m1); |
| 32 | |
| 33 | %let ghue=&hue; |
| 34 | %IF &ghue gt 360 %THEN %let ghue= %eval(&ghue.-360); |
| 35 | %IF &ghue lt 0 %THEN %let ghue= %eval(&ghue.+360); |
| 36 | %IF &ghue lt 60 %THEN %let g = %sysevalf((&m1+(&m2-&m1)*&ghue./60)*255); |
| 37 | %ELSE %IF &ghue lt 180 %THEN %let g=%sysevalf(255*&m2.); |
| 38 | %ELSE %IF &ghue lt 240 %THEN %let g=%sysevalf((&m1+(&m2-&m1)*(240-&ghue)/60)*255); |
| 39 | %ELSE %let g=%sysevalf(255*&m1); |
| 40 | |
| 41 | %let bhue=%eval(&hue-120); |
| 42 | %IF &bhue gt 360 %THEN %let bhue= %eval(&bhue.-360); |
| 43 | %IF &bhue lt 0 %THEN %let bhue= %eval(&bhue.+360); |
| 44 | %IF &bhue lt 60 %THEN %let b = %sysevalf((&m1+(&m2-&m1)*&bhue./60)*255); |
| 45 | %ELSE %IF &bhue lt 180 %THEN %let b=%sysevalf(255*&m2.); |
| 46 | %ELSE %IF &bhue lt 240 %THEN %let b=%sysevalf((&m1+(&m2-&m1)*(240-&bhue)/60)*255); |
| 47 | %ELSE %let b=%sysevalf(255*&m1); |
| 48 | %END; |
| 49 | %let rr=%sysfunc(putn(&r,3.)); |
| 50 | %let gg=%sysfunc(putn(&g,3.)); |
| 51 | %let bb=%sysfunc(putn(&b,3.)); |
| 52 | &rr.,&gg.,&bb. |
| 53 | |
| 54 | %mend hlstorgb; |