%MACRO hashRGB ( r , g , b ) ; %* Prefixed with #, code changed from SASAUTOS macro RGB; %* Code adapted from macro in SASAUTOS - Frank Poppe october2001 ; %*********************************************************************; %cmpres(#%ghex2(&r)%ghex2(&g)%ghex2(&b)) %mend ; %macro decrgbvalue(n1,n2,h); %* Code adapted from macro in SASAUTOS - Frank Poppe october2001 ; %local n1 n2 h value; %if &h>360000 %then %let h=%eval(&h-360000); %else %if &h<0 %then %let h=%eval(&h+360000); %if &h<60000 %then %let value=%eval(&n1 + ((&n2-&n1) * &h/60)/1000); %else %if &h<180000 %then %let value=&n2; %else %if &h<240000 %then %let value=%eval(&n1 + ((&n2-&n1) * (240000 - &h)/60)/1000); %else %let value=&n1; %let value=%eval((&value*255)/1000); &value %mend ; %macro csrgb(color); %*********************************************************************; %* Create comma-separated decimal RGB values from HLS Color Name *; %* Code adapted from macro in SASAUTOS - Frank Poppe october2001 *; %* HLS = hhhllss *; %* hhh = 000 to 168 hex - hue in degrees *; %* ll = 00 to FF hex - lightness *; %* ss = 00 to FF hex - saturation *; %* *; %* Example: %hls2rgb(H0AA6197) produces rr,gg,bb *; %* *; %* NOTES: Algorithm from: COMPUTER GRAPHICS: PRINCIPLES AND *; %* PRACTICE, J. D. FOLEY AND A. VAN DAM *; %* *; %*********************************************************************; %local r g b hue n1 n2 hls; %let hls = %cns ( &color) ; %let hue=%eval(%ghex2int(%substr(&hls,2,3))*1000); %let l=%eval(%ghex2int(%substr(&hls,5,2))*1000/255); %let s=%eval(%ghex2int(%substr(&hls,7,2))*1000/255); %if &l < 500 %then %let n2=%eval((&l*(1000+&s)/1000); %else %let n2=%eval(&l+&s-(&l*&s/1000)); %let n1=%eval(2*&l-&n2); %if &s=0 %then %do; %let r=%substr(&hls,5,2); %let r = %ghex2int ( &r) ; %let g=&r; %let b=&r; %end; %else %do; %let b=%decrgbvalue(&n1,&n2,%eval(&hue+120000)); %let r=%decrgbvalue(&n1,&n2,&hue); %let g=%decrgbvalue(&n1,&n2,%eval(&hue-120000)); %end; &R,&G,&B %mend ; %MACRO font_size ; %DO pt = 6 %TO 14 ; put "&pt" / IF CMP ( "&pt.pt" , FONT_SIZE ) ; %END ; %MEND ; %MACRO DefineColors ; %LET ColorRGB = %SCAN ( %QUOTE(&ColorRGBList) , 1 , %STR( ) ) ; %LET i = 1 ; %DO %WHILE (&ColorRGB NE %STR( ) ); PUT "[Edit.Color(&i,&ColorRGB)]" NL ; %LET i = %eval ( &i+1 ) ; %LET ColorRGB = %SCAN ( %QUOTE(&ColorRGBList) , &i , %STR( ) ) ; %END ; %MEND ; /* Within the ApplyColor-macro the decimal RGB values (0-255) are translated to hex values, and prefixed with a #. This is the format ODS uses in the FOREGROUND and BACKGROUND colors. */ %MACRO ApplyColor ( StyleColor ) ; %LET ColorRGB = %SCAN ( %QUOTE(&ColorRGBList) , 1 , %STR( ) ) ; %LET i = 1 ; %DO %WHILE (&ColorRGB NE %STR( ) ); %LET ColorCX = %HashRGB(&ColorRGB) ; PUT "&i" / IF CMP ( "&ColorCX" , &StyleColor ) ; %LET i = %eval ( &i+1 ) ; %LET ColorRGB = %SCAN ( %QUOTE(&ColorRGBList) , &i , %STR( ) ) ; %END ; %MEND ;