Command DRAW
 
Description Draw or update a Line, Vector, Box, Circle  or Graph of size X,Y. The entities can be an outline or filled.
The colour can be enhanced using alpha blending within the draw style.
Graphs of a different colour can be superimposed on top of each other.
Faster display updates occur if draw uses a solid background colour (ie no alpha blending). 
DRAW accepts VARs, signed/unsigned integers
             (U8, U16, U32, S8, S16, S32), floats (FLT) and pointers (PTR)
DRAW( PTR, VAR|INT|FLT|PTR, VAR|INT|FLT|PTR, Style );
             Note PTR refers to the entity being pointed to by PTR and not
             the PTR itself. Use LOAD( PTR > "Name" ); to set a pointer.
 
Syntax/Parameters DRAW(Name,X,Y,Style)
DRAW(Name,X,Y,Style,PosX,PosY);
DRAW(name,length,angle,stVector);
 
Style It is possible to specify transparency values with colours if the colour is entered as a 32-bit hex number the top 8 bits specify the alpha blending level.
col = \\aarrggbb;     back = \\aarrggbb;   where  aa = alpha level.
For example, col = \\80FFFF00; gives 50% transparent yellow.
Support for opacity -  v49.00.

STYLE(gstyle,DRAW)  {   
    type=trace; //The shape to draw. type = B/Box; C/Circle;  L/Line;, T/Trace; P/Pixel; y/yBar; x/xBar;  v/Vector;
    maxX=100;  // Not required except for dynamic rotation where the maximum width is declared
    maxY=100;  // Not required except for dynamic rotation where the maximum height is declared
    col=green;  //Specify the line border colour of the shape. Use hex, colour name + alpha
    back=black; //Specify the fill colour of the shape. Use hex, colour name + alpha
    opacity = n;  // n = 0..100 where 0=transparent..100=opaque (default=100)
    width=3;    //Specify the line border width of the shape default = 1
    rotate=0;     //  Specify the rotation of the shape with respect to the screen. 0,90,180,270
    curRel=cc;   //specify placement relative to cursor. CC Centre Centre , TC Top Centre etc.
    xOrigin=50;   //specify graph x origin wit respect to declared graph
    yOrigin=50;  //specify graph y origin wit respect to declared graph
    xScale=200; //scale the value automatically to fit the graph
    yScale=200; //scale the value automatically to fit the graph
    xScroll=1;    //define scroll direction and increment 1=left to right one pixel, 0=no scroll
    }
 
Options Graphs - v47.00   
A number of graph styles now exist as draw types:
  type=p; type=pixel;     // Pixel Scatter - places a point at x,y
  type=t; type=trace;     // Trace/Line - joins the dots between current point and previous point.
  type=y; type=yBar;      // Bar Y - draws vertical line from 0 to y and clears from y+1 to ymax
  type=x; type=xBar;      // Bar X - draws horizontal line from 0 to x and clears from x+1 to xmax
           
 The origin on the graph can be changed
   xOrigin=val; // (default=0)
   yOrigin=val; // (default=0)

 The scaling of pixels can be set:
   xScale=val; // (default=100.0) [val can be float and is a percentage]
   yScale=val; // (default=100.0) [val can be float and is a percentage]
Note to draw graph with 0,0 at top and n,n at bottom, use yScale=-100;

The graph can be made to scroll (currently right-to-left only supported)  
   xScroll=val; // where val=0 (default - no scroll); val=n (scroll left n pixels before each plot

Please refer to the ADC analogue input section for a graph application example.

Graph Displaying Problems v49.37
* Added bounds check to prevent drawing outside of graph area.
* Fixed line wrapping within graph area.

DRAWing of Graphs - Trace Line Should Not be Wrapping - v49.42
* Improved graph trace drawing.
* Solved problem with trace line wrapping when rendering a graph.
* Extended graphics area to encompass line width and modified page rendering to deal with windowed pixels.


DRAWing of Ellipses and more DRAW parameter options - v49.37
* Added ellipse drawing, specify type=ellipse or e in the STYLE
* Added more DRAW command options
DRAW( name, x ); // Circle or Square modification: width=x; height=x;
DRAW( name, x, style ); // Circle or Square definition: width=x; height=x;
DRAW( name, x, y ); // All Shapes modification: width=x; height=y;
DRAW( name, x, y, style ); // All Shapes definition: width=x; height=y;
DRAW( name, x, y, s, a ); // Ellipse Arc modification: width=x; height=y; startAngle=s; arcAngle=a;
DRAW( name, x, y, s, a, style ); // Ellipse Arc definition: width=x; height=y; startAngle=s; arcAngle=a;
* Notes:
- 0 degrees is at 12'o'clock and positive angles are clockwise.
- The style for an arc must be defined to encompass the size of the shape if drawn from 0 to 360 degrees.
- Further work required on the fill algorithm for ellipses.
* Added option for start angle and arc angle to be in radians or degrees depending on SYSTEM.angles setting. v49.48

Graphs to support alpha blending and opacity - v49.42
* New features of alpha blending and opacity with graphs
* Support for graphs when the display is rotated 90, 180 and 270 degrees

Drawing Lines - v49.48
* New algorithm for line drawing implemented.
* Lines are created with anti-aliased edges.
* Vertical and horizontal lines are a special case and are rapidly created (as no anti-aliasing required).
* Line ends are now created perpendicular to the line rather than vertical or horizontal.


Drawing Vectors (Lines with length and angle) - v49.48
* Added new line type - vector - which is defined with a length and an angle.
STYLE( stVector, DRAW ) { type = v or vector; ... }
DRAW( name, length, angle, stVector );

where
'length' is line length,
'angle' is angle clockwise from 12'o'clock position. 'angle' is in degrees or radians depending on SYSTEM.angles setting.

Example tu800a.mnu

STYLE(stPage,PAGE){}
STYLE(stLine1,DRAW){type=vector;col=white;width=1;curRel=cc;}
STYLE(stLine2,DRAW){type=vector;col=white;width=2;curRel=cc;}
STYLE(stLine3,DRAW){type=vector;col=white;width=3;curRel=cc;}
STYLE(stLine4,DRAW){type=v;col=white;width=9;curRel=cc;}
STYLE(stLine5,DRAW){type=v;col=white;width=20;curRel=cc;}
STYLE(stLine6,DRAW){type=v;col=white;width=21;curRel=cc;}
STYLE(stCirc,DRAW){type=circle;width=1;col=red;curRel=cc;}

VAR(varAngle,0.0,FLT4);

PAGE(pgMain,stPage)
{
POSN(149,119); DRAW(drLine1,200,45,stLine1); DRAW(drCir1,150,stCirc); DRAW(drPt1,7,stCirc);
POSN(399,119); DRAW(drLine2,200,45,stLine2); DRAW(drCir2,150,stCirc); DRAW(drPt2,7,stCirc);
POSN(649,119); DRAW(drLine3,200,45,stLine3); DRAW(drCir3,150,stCirc); DRAW(drPt3,7,stCirc);
POSN(149,359); DRAW(drLine4,200,45,stLine4); DRAW(drCir4,150,stCirc); DRAW(drPt4,7,stCirc);
POSN(399,359); DRAW(drLine5,200,45,stLine5); DRAW(drCir5,150,stCirc); DRAW(drPt5,7,stCirc);
POSN(649,359); DRAW(drLine6,200,45,stLine6); DRAW(drCir6,150,stCirc); DRAW(drPt6,7,stCirc);
LOOP(lpMain,FOREVER)
{
DRAW(drLine1,150,varAngle);
DRAW(drLine2,150,varAngle);
DRAW(drLine3,150,varAngle);
DRAW(drLine4,150,varAngle);
DRAW(drLine5,150,varAngle);
DRAW(drLine6,150,varAngle);;
CALC(varAngle,varAngle,0.5,"+");
}
}
SHOW(pgMain);

New Line Draw CurRel options plus offset - v49.48
* Additional parameter can now be passed to DRAW() command for Line and Vector drawing which allow for the line to be offset relative to the cursor:
DRAW( name, length, angle, offset, stVect );
DRAW( name, length, angle, offset );
DRAW( name, length, angle, offset, stVect, xPos, yPos );
DRAW( name, width, height, offset, stLine );
DRAW( name, width, height, offset );
DRAW( name, width, height, offset, stLine, xPos, yPos );
* The offset parameter is ideal for the pointer on gauges and clocks where the point of rotation is a certain distance along the line
* New curRel options allow for better line placement.
SA, SB, SC // Start of line. SA = Edge A; SB = Edge B; SC = Centre
EA, EB, EC // End of line. EA = Edge A; EB = Edge B; EC = Centre
MA, MB, MC // Mid-point of line. MA = Edge A; MB = Edge B; MC = Centre
OA, OB, OC // Offset along line. OA = Edge A; OB = Edge Bl OC = Centre

* Example: Vector length = 100, angle = 125 deg, width = 5 (not to scale)


Draw() with structures - v49.48
* DRAW() command now accepts structure parameters for width/height/angles/offset.

Anti-Aliased Line Drawing - v49.48
* New algorithm for line drawing implemented.
* Lines are created with anti-aliased edges.
* Vertical and horizontal lines are a special case and are rapidly created (as no anti-aliasing required).
* Line ends are now created perpendicular to the line rather than vertical or horizontal.
 
Example Circle Example
DRAW(MyCircle, 32, 32, DrawCircle);
DRAW(MyCircle, 64, 64);                 //modified circle is double diameter.
DRAW(MyCircle,VarX,VarY);               //modified circle using variables. Should not exceed MaxX,maxY.

Box Example
DRAW(MyBox, 32, 32, DrawBox);
DRAW(MyBox, 64, 64);                 //modified circle is double diameter.
DRAW(MyBox,VarX,VarY);               //modified circle using variables. Should not exceed MaxX,maxY.

Line Example
DRAW(MyLine,10,10,lineStyle); //draws line 45 degrees top left to bottom right.
DRAW(MyLine2,10,-10,lineStyle); //draws line 45 degrees bottom left to top right.


Vector
Example
DRAW(MyVec,150,30,VecStyle); //draws vector 150 length at 30 degree.
DRAW(MyVec2,100,320,VecStyle); //draws vector 100 length at 320 degree.

Graph Example
DRAW(MyGraph,100,100,GraphStyle); //draws a graph window of 100x100 pixels.
DRAW(MyGraph,20,30); //draws a pixel on the graph at 20,30 relative to the origin.
DRAW(MyGraph,varX,varY); //use variables to plot a pixel on the graph.
RESET(MyGraph); //clears the graph