home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / x / volume2 / xscope / part01 / Draw.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-04-28  |  2.1 KB  |  74 lines

  1. #include "xsignal.h"
  2.  
  3. /* ARGSUSED */
  4. void Draw(widget,pane,callData)
  5.     Widget widget;
  6.     sigbox *pane;
  7.     caddr_t callData;
  8. {
  9.     int x1,y1,x2,y2,i, oldx1, hincr, nscan;
  10.     int height,width, nsamp, halfheight, maxsamp;
  11.     int start_samp, end_samp;
  12.     float xincr, x;
  13.     short *data;
  14.     char sstart[30], slast[30];
  15.     XPoint *vlist;
  16.     Arg args[3];
  17.  
  18. #define Sig pane->s
  19. #define Start pane->sb_start
  20. #define Last pane->sb_last
  21. #define Canvas pane->canvas
  22. #define GCCache pane->gccache
  23.  
  24.     XClearArea(XtDisplay(Canvas), XtWindow(Canvas), 0,0,0,0,False);
  25.  
  26.     if(Sig == NULL) return;
  27.  
  28.     XtSetArg(args[0], XtNwidth, &width);
  29.     XtSetArg(args[1], XtNheight, &height);
  30.     XtGetValues(Canvas, args, TWO);
  31.     width += 1;
  32.     height += 1;
  33.     start_samp = pane->first;
  34.     end_samp = pane->last;
  35.     nsamp = end_samp - start_samp + 1;
  36.  
  37.     xincr = ((float) width) / ((float) nsamp);
  38.     data = ((short *) Sig->sig_data)+start_samp;
  39.     vlist = (XPoint *) malloc(sizeof(XPoint) * Sig->sig_nsamp);
  40.  
  41. #define MAXVAL (32768L)
  42.  
  43.     for(i=start_samp, x=0; i <= end_samp; ++i, x = x+xincr, ++data) {
  44.     vlist[i].x = x+.5;
  45.         y1 = ((((int) *data)+MAXVAL) * height) >> 16L;
  46.         vlist[i].y = height-y1;
  47.     }
  48.     if(pane->style == CONTINUOUS) {
  49.     XDrawLines(XtDisplay(Canvas), XtWindow(Canvas), GCCache[PAINT],
  50.         &vlist[start_samp], nsamp, CoordModeOrigin);
  51.     } else if (pane->style == DISCRETE) {
  52.     y1 = height/2;
  53.     for( i = start_samp; i<end_samp; ++i ) {
  54.         XDrawLine(XtDisplay(Canvas), XtWindow(Canvas), GCCache[PAINT],
  55.             vlist[i].x,y1,vlist[i].x,vlist[i].y);
  56.     }
  57.     }
  58.  
  59.     x1=1 ; y1=height/2; x2=width; y2=y1;
  60.     XDrawLine(XtDisplay(Canvas), XtWindow(Canvas), GCCache[PAINT], x1,y1,x2,y2);
  61.     x1=1 ; y1=1; x2=1; y2=height;
  62.     XDrawLine(XtDisplay(Canvas), XtWindow(Canvas), GCCache[PAINT], x1,y1,x2,y2);
  63.     hincr = height/20;
  64.     x1=1; x2=5;
  65.     for(y1=y2=height/2; y1>0; y1=y2=y1-hincr){
  66.       XDrawLine(XtDisplay(Canvas),XtWindow(Canvas),GCCache[PAINT], x1,y1,x2,y2);
  67.     }
  68.     for(y1=y2=height/2; y1<=height; y1=y2=y1+hincr){
  69.       XDrawLine(XtDisplay(Canvas),XtWindow(Canvas),GCCache[PAINT], x1,y1,x2,y2);
  70.     }
  71.     Mark(pane, pane->lmark);
  72.     Mark(pane, pane->rmark);
  73. }
  74.