Download jdsgimac.sas jdsgimac.sasSubmit a comment

Java source, jar and examples can be found here

%macro jdsgimac;
%* place this file in your sasautos path;
%* or %include it prior to using the jDSGI macros;
%mend;

/*
 * Richard A. DeVenezia
 * June 1, 2004
 * Copyright 2004
 *
 * jDSGI macros
 */

/*
 * JavaObj array passing has a memory bug, thus until 9.2,
 * the auxiallary macros setArray and getArray should be
 * used to ensure the SAS session does not encounter a
 * Write Access Violation (WAV)
 */
%macro canvas (javaobj, width, height, color);
  %global jdsgi;

  %let jdsgi = &javaobj;

  declare javaobj &jdsgi ('jdsgi/Graphics');
  declare javaobj &jdsgi._x ('jdsgi/DoubleArray');
  declare javaobj &jdsgi._y ('jdsgi/DoubleArray');

  &jdsgi..exceptionDescribe(1);

  &jdsgi..callVoidMethod ('setXData', &jdsgi._x);
  &jdsgi..callVoidMethod ('setYData', &jdsgi._Y);

  %createBuffer (&width, &height);
  %setColor (&color);
  %fillRect (0,0,&width,&height);
  %setColor (0);
%mend;
%macro canvas_delete();
  &jdsgi..delete();
  &jdsgi._x.delete();
  &jdsgi._y.delete();

  %symdel jdsgi;
%mend;
%macro setArray(sasArray, doubleArray);
  &doubleArray..callVoidMethod ('setLength', dim(&sasArray));
  do _&sysindex = 1 to dim(&sasArray);
    &doubleArray..callVoidMethod('set', _&sysindex-1, &sasArray[_&sysindex]);
  end;
%mend;
%macro getArray(sasArray, doubleArray);
  &doubleArray..callIntMethod ('getLength', l_&sysindex);
  drop l_&sysindex;
  do _&sysindex = 1 to min (dim(&sasArray), l_&sysindex);
    &doubleArray..callDoubleMethod('get', _&sysindex-1, &sasArray[_&sysindex]);
  end;
%mend;
%macro createBuffer (width, height);                          &jdsgi..callVoidMethod ('createBuffer', &width, &height)                                  %mend;
%macro setRenderingHint (key, value);                         &jdsgi..callVoidMethod ('setRenderingHint', &key, &value)                                 %mend;
%macro setBackground (color);                                 &jdsgi..callVoidMethod ('setBackground', &color)                                          %mend;
%macro setBackgroundRGB (r,g,b);                              &jdsgi..callVoidMethod ('setBackground', &r,&g,&b)                                        %mend;
%macro getBackground (argb);                                  &jdsgi..callIntMethod  ('getBackground', &argb)                                           %mend;
%macro getColor (argb);                                       &jdsgi..callIntMethod  ('getColor', &argb)                                                %mend;
%macro setColor (color);                                      &jdsgi..callVoidMethod ('setColor', &color)                                               %mend;
%macro setColorA (color);                                     &jdsgi..callVoidMethod ('setColor', &color, 1)                                            %mend;
%macro setColorRGB (r,g,b);                                   &jdsgi..callVoidMethod ('setColor', &r,&g,&b)                                             %mend;
%macro setColorHSB (h,s,b);                                   &jdsgi..callVoidMethod ('setColorHSB', &h,&s,&b)                                          %mend;
%macro setColorDarker ();                                     &jdsgi..callVoidMethod ('setColorDarker')                                                 %mend;
%macro setColorBrighter ();                                   &jdsgi..callVoidMethod ('setColorBrighter')                                               %mend;
%macro translate (x,y);                                       &jdsgi..callVoidMethod ('translate', &x, &y)                                              %mend;
%macro resetFont ();                                          &jdsgi..callVoidMethod ('resetFont')                                                      %mend;
%macro setFont (name,style,size);                             &jdsgi..callVoidMethod ('setFont', &name, &style, &size)                                  %mend;
%macro setFontName (name);                                    &jdsgi..callVoidMethod ('setFontName', &name)                                             %mend;
%macro getFontName (name);                                    &jdsgi..callStringMethod ('getFontName', &name)                                           %mend;
%macro setFontSize (size);                                    &jdsgi..callVoidMethod ('setFontSize', &size)                                             %mend;
%macro getFontSize (size);                                    &jdsgi..callIntMethod  ('getFontSize', &size)                                             %mend;
%macro setFontStyle (style);                                  &jdsgi..callVoidMethod ('setFontStyle', &style)                                           %mend;
%macro getFontStyle (style);                                  &jdsgi..callIntMethod  ('getFontStyle', &style)                                           %mend;
%let FONT_PLAIN = 0;
%let FONT_BOLD = 1;
%let FONT_ITALIC = 2;


%macro drawString (string,x,y);                               &jdsgi..callVoidMethod ('drawString', &string, &x, &y)                                    %mend;
%macro getStringWidth (text,width);                           &jdsgi..callIntMethod  ('getStringWidth', &text, &width)                                  %mend;
%macro drawLine (x1,y1,x2,y2);                                &jdsgi..callvoidMethod ('drawLine', &x1,&y1, &x2,&y2)                                     %mend;
%macro draw3DRect (x,y,width,height,raised);                  &jdsgi..callVoidMethod ('draw3DRect', &x, &y, &width, &height,&raised)                    %mend;
%macro fill3DRect (x,y,width,height,raised);                  &jdsgi..callVoidMethod ('fill3DRect', &x, &y, &width, &height,&raised)                    %mend;
%macro drawRect (x,y,width,height);                           &jdsgi..callVoidMethod ('drawRect', &x, &y, &width, &height)                              %mend;
%macro clearRect (x,y,width,height);                          &jdsgi..callVoidMethod ('clearRect', &x, &y, &width, &height)                             %mend;
%macro fillRect (x,y,width,height);                           &jdsgi..callVoidMethod ('fillRect', &x, &y, &width, &height)                              %mend;
%macro drawRoundRect (x,y,width,height,arcWidth,arcHeight);   &jdsgi..callVoidMethod ('drawRoundRect', &x, &y, &width, &height, &arcWidth, &arcHeight)  %mend;
%macro fillRoundRect (x,y,width,height,arcWidth,arcHeight);   &jdsgi..callVoidMethod ('fillRoundRect', &x, &y, &width, &height, &arcWidth, &arcHeight)  %mend;
%macro drawArc (x,y,width,height,startAngle,arcAngle);        &jdsgi..callVoidMethod ('drawArc', &x, &y, &width, &height, &startAngle, &arcAngle)       %mend;
%macro fillArc (x,y,width,height,startAngle,arcAngle);        &jdsgi..callVoidMethod ('fillArc', &x, &y, &width, &height, &startAngle, &arcAngle)       %mend;
%macro drawOval (x,y,width,height);                           &jdsgi..callVoidMethod ('drawOval', &x, &y, &width, &height)                              %mend;
%macro fillOval (x,y,width,height);                           &jdsgi..callVoidMethod ('fillOval', &x, &y, &width, &height)                              %mend;
%macro tsetFillMode (mode);                                   &jdsgi..callVoidMethod ('tsetFillMode', &mode)                                            %mend;
%macro resetPen ();                                           &jdsgi..callVoidMethod ('resetPen')                                                       %mend;
%macro resetPenDash ();                                       &jdsgi..callVoidMethod ('resetPenDash')                                                   %mend;
%macro setPenWidth (w);                                       &jdsgi..callVoidMethod ('setPenWidth',&w)                                                 %mend;
%macro setPenEndCap     (p);                                  &jdsgi..callVoidMethod ('setPenEndCap',&p)                                                %mend;
%macro setPenLineJoin   (p);                                  &jdsgi..callVoidMethod ('setPenLineJoin',&p)                                              %mend;
%macro setPenMiterLimit (p);                                  &jdsgi..callVoidMethod ('setPenMiterLimit',&p)                                            %mend;
%macro setPenDashPhase  (p);                                  &jdsgi..callVoidMethod ('setPenDashPhase',&p)                                             %mend;
%macro setPenDash2      (p1,p2);                              &jdsgi..callVoidMethod ('setPenDash2',&p1,&p2)                                            %mend;
%macro setPenDash (sasArray);                                 %local javaArray;
                                                              %let javaArray = _&sysindex;
                                                              declare javaobj &javaArray ("jdsgi/DoubleArray");
                                                              %setArray (&sasArray, &javaArray);
                                                              &jdsgi..callVoidMethod ('setPenDash', &javaArray);
                                                           /* &jdsgi..callVoidMethod ('setPenDash', &xpoints, &ypoints) */
                                                              &javaArray..delete()
%mend;
%let CAP_BUTT = 0;
%let CAP_ROUND = 1;
%let CAP_SQUARE = 2;
%let JOIN_MITER = 0;
%let JOIN_ROUND = 1;
%let JOIN_BEVEL = 2;

%macro drawPolygon (xpoints, ypoints);                        %setArray (&xpoints, &jdsgi._x)
                                                              %setArray (&ypoints, &jdsgi._y)
                                                              &jdsgi..callVoidMethod ('drawPolygon')
                                                           /* &jdsgi..callVoidMethod ('drawPolygon', &xpoints, &ypoints) */
%mend;
%macro fillPolygon (xpoints, ypoints);                        %setArray (&xpoints, &jdsgi._x)
                                                              %setArray (&ypoints, &jdsgi._y)
                                                              &jdsgi..callVoidMethod ('fillPolygon')
                                                           /* &jdsgi..callVoidMethod ('fillPolygon', &xpoints, &ypoints) */
%mend;
%macro drawPolyline (xpoints, ypoints);                       %setArray (&xpoints, &jdsgi._x)
                                                              %setArray (&ypoints, &jdsgi._y)
                                                              &jdsgi..callVoidMethod ('drawPolyline')
                                                           /* &jdsgi..callVoidMethod ('drawPolyline', &xpoints, &ypoints) */
%mend;
%macro setClip (x,y,width,height);                            &jdsgi..callVoidMethod ('setClip', &x, &y, &width, &height)                               %mend;
%macro setClipPolygon (xpoints, ypoints);                     %setArray (&xpoints, &jdsgi._x)
                                                              %setArray (&ypoints, &jdsgi._y)
                                                              &jdsgi..callVoidMethod ('setClipPolygon')
                                                           /* &jdsgi..callVoidMethod ('setClipPolygon', &xpoints, &ypoints) */
%mend;
%macro getClipBounds (doubleArray);                           %setNData (&doubleArray);
                                                              &jdsgi..callVoidMethod ('getClipBounds')
%mend;

%macro getImageWidth (width);                                 &jdsgi..callIntMethod  ('getImageWidth', &width)                                          %mend;
%macro getImageHeight (height);                               &jdsgi..callIntMethod  ('getImageHeight', &height)                                        %mend;
%macro drawImage (x,y,bgcolor);                               &jdsgi..callVoidMethod ('drawImage', &x,&y,&bgcolor)                                      %mend;
%macro readImage (source);                                    &jdsgi..callVoidMethod ('readImage', &source)                                             %mend;
%macro canvas_saveAs (basename, type, savedAs);               &savedAs = repeat(' ', 300);
                                                              &jdsgi..callStringMethod ('saveAs', trim(&type), catx('.',&basename,&type), &savedAs);
                                                              put &savedAs=
%mend;
%macro setNData(doubleArray);                                 &jdsgi..callVoidMethod ('setNData', &doubleArray)                                         %mend;



%macro tSetViewport (n,x1,y1,x2,y2);                          &jdsgi..callVoidMethod ('tsetViewport', &n,&x1,&y1,&x2,&y2)                               %mend;
%macro tSetWindow   (n,x1,y1,x2,y2);                          &jdsgi..callVoidMethod ('tsetWindow', &n,&x1,&y1,&x2,&y2)                                 %mend;
%macro tsetWindowAspectedForWidth (n,x1,y1,w);                &jdsgi..callVoidMethod ('tsetWindowAspectedForWidth', &n,&x1,&y1,&w)                      %mend;
%macro tsetWindowAspectedForHeight (n,x1,y1,h);               &jdsgi..callVoidMethod ('tsetWindowAspectedForHeight', &n,&x1,&y1,&h)                     %mend;
%macro tGetViewport (n,doubleArray);                          &jdsgi..callVoidMethod ('tgetViewport', &n,&doubleArray)                                  %mend;
%macro tGetWindow   (n,doubleArray);                          &jdsgi..callVoidMethod ('tgetWindow', &n,&doubleArray)                                    %mend;
%macro tComputeAspectedViewport (n,x1,y1,x2,y2,doubleArray);  &jdsgi..callVoidMethod ('tcomputeAspectedViewport', &n,&x1,&y1,&x2,&y2,&doubleArray)      %mend;
%macro tString      (text,x,y,function=trim);                 %local n;
                                                              %let n = %sysfunc(count(&function,:));
                                                              %let text = %sysfunc(translate(&function,%str(%(),:))(&text.%sysfunc(repeat(%str(%)),&n));
                                                              &jdsgi..callVoidMethod ('tstring', &text,&x,&y)                                           %mend;
%macro tStringCenter(text,x,y,function=trim);                 %local n;
                                                              %let n = %sysfunc(count(&function,:));
                                                              %let text = %sysfunc(translate(&function,%str(%(),:))(&text.%sysfunc(repeat(%str(%)),&n));
                                                              &jdsgi..callVoidMethod ('tstringCenter', &text,&x,&y)                                     %mend;
%macro tStringRight (text,x,y,function=trim);                 %local n;
                                                              %let n = %sysfunc(count(&function,:));
                                                              %let text = %sysfunc(translate(&function,%str(%(),:))(&text.%sysfunc(repeat(%str(%)),&n));
                                                              &jdsgi..callVoidMethod ('tstringRight', &text,&x,&y)                                      %mend;
%macro tGetClipRect (n,doubleArray);                          &jdsgi..callVoidMethod ('tgetClipRect', &n,&doubleArray)                                  %mend;
%macro tSetClip     (onoff);                                  &jdsgi..callVoidMethod ('tsetClip', &onoff)                                               %mend;
%macro tGetClip     (onoff);                                  &jdsgi..callBooleanMethod ('tgetClip', &onoff)                                            %mend;
%macro tSetTransno  (t);                                      &jdsgi..callVoidMethod ('tsetTransno', &t)                                                %mend;
%macro tGetTransno  (t);                                      &jdsgi..callIntMethod  ('tgetTransno', &t)                                                %mend;
%macro tArc         (x,y,r,start,end);                        &jdsgi..callVoidMethod ('tarc',&x,&y,&r,&start,&end,0)                                    %mend;
%macro tArcChord    (x,y,r,start,end);                        &jdsgi..callVoidMethod ('tarc',&x,&y,&r,&start,&end,1)                                    %mend;
%macro tArcPieSlice (x,y,r,start,end);                        &jdsgi..callVoidMethod ('tarc',&x,&y,&r,&start,&end,2)                                    %mend;
%macro tLine        (x1,y1,x2,y2);                            &jdsgi..callVoidMethod ('tline',&x1,&y1,&x2,&y2)                                          %mend;
%macro tBar         (x1,y1,x2,y2);                            &jdsgi..callVoidMethod ('tbar',&x1,&y1,&x2,&y2)                                           %mend;
%macro tRBar        (x1,y1,x2,y2,w,h);                        &jdsgi..callVoidMethod ('trbar',&x1,&y1,&x2,&y2,&w,&h)                                    %mend;
%macro tEllarc      (x,y,major,minor,start,end,angle);        &jdsgi..callVoidMethod ('tellarc',&x,&y,&major,&minor,&start,&end,&angle,0)               %mend;
%macro tEllarcChord (x,y,major,minor,start,end,angle);        &jdsgi..callVoidMethod ('tellarc',&x,&y,&major,&minor,&start,&end,&angle,1)               %mend;
%macro tEllarcPieSlice (x,y,major,minor,start,end,angle);     &jdsgi..callVoidMethod ('tellarc',&x,&y,&major,&minor,&start,&end,&angle,2)               %mend;
%macro tPolyline (xpoints, ypoints,n=);                       %setArray (&xpoints, &jdsgi._x)
                                                              %setArray (&ypoints, &jdsgi._y)
                                                              %if %length(&n) = 0 %then %let n = dim(&xpoints);
                                                              &jdsgi..callVoidMethod ('tpolyline', &n)
                                                           /* &jdsgi..callVoidMethod ('tpolyline', &xpoints, &ypoints) */
%mend;
%macro tPolygon (xpoints, ypoints,n=);                        %setArray (&xpoints, &jdsgi._x)
                                                              %setArray (&ypoints, &jdsgi._y)
                                                              %if %length(&n) = 0 %then %let n = dim(&xpoints);
                                                              &jdsgi..callVoidMethod ('tpolygon', &n)
                                                           /* &jdsgi..callVoidMethod ('tpolygon', &xpoints, &ypoints) */
%mend;
%macro tsetRotation (angle);                                  &jdsgi..callVoidMethod ('tsetRotation', &angle)                                           %mend;
%macro reportFormats ();                                      &jdsgi..callVoidMethod ('reportFormats')                                                  %mend;