Type : CREATION_INTERNE
La macro ne lit aucune donnée. Elle effectue des calculs mathématiques basés sur les paramètres d'entrée (h, l, s) pour générer les valeurs RGB. Les paramètres sont fournis lors de l'appel de 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; |