[BACK]Return to if.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / plot

Diff for /OpenXM_contrib2/asir2000/plot/if.c between version 1.15 and 1.37

version 1.15, 2002/08/15 05:36:10 version 1.37, 2018/03/29 01:32:55
Line 45 
Line 45 
  * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,   * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,
  * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.   * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.
  *   *
  * $OpenXM: OpenXM_contrib2/asir2000/plot/if.c,v 1.14 2002/08/02 09:44:37 noro Exp $   * $OpenXM: OpenXM_contrib2/asir2000/plot/if.c,v 1.36 2017/09/04 01:57:53 noro Exp $
 */  */
 #include "ca.h"  #include "ca.h"
 #include "parse.h"  #include "parse.h"
 #include "ox.h"  #include "ox.h"
 #include "ifplot.h"  #include "ifplot.h"
   
 extern JMP_BUF ox_env;  #if defined(INTERVAL)
   // Time message and func
   #include <sys/types.h>
   #include <sys/resource.h>
   #include <sys/time.h>
   
 int open_canvas(NODE arg)  static struct oEGT ltime;
   static double r0;
   double get_rtime();
   void MSGdraw(char *);
   char msg[128];
   #if defined(ITV_TIME_CHECK)
   void tstart()
 {  {
         int id;    get_eg(&ltime);
         struct canvas *can;    r0=get_rtime();
         LIST wsize;  }
         STRING wname;  
   
         wsize = (LIST)ARG0(arg);  void tstop(struct canvas *can)
         wname = (STRING)ARG1(arg);  {
     struct oEGT egt1;
     double e, g, r;
     char ts[100];
     void popdown_warning();
     Widget warnshell,warndialog;
   
         can = canvas[id = search_canvas()];    get_eg(&egt1);
         can->mode = MODE_INTERACTIVE;    e=egt1.exectime - ltime.exectime;
         if ( !wsize ) {    g=egt1.gctime - ltime.gctime;
                 can->width = DEFAULTWIDTH; can->height = DEFAULTHEIGHT;    r=get_rtime() - r0;
         } else {    sprintf(ts,"(%8.6f + gc %8.6f) total %8.6f \n",e,g,r);
                 can->width = QTOS((Q)BDY(BDY(wsize)));    create_popup(can->shell,"Message",&ts,&warnshell,&warndialog);
                 can->height = QTOS((Q)BDY(NEXT(BDY(wsize))));    XawDialogAddButton(warndialog,"OK",popdown_warning,warnshell);
         }    XtPopup(warnshell,XtGrabNone);
         if ( wname )    SetWM_Proto(warnshell);
                 can->wname = BDY(wname);  
         else  
                 can->wname = "";  
         create_canvas(can);  
         return id;  
 }  }
   #else
   #define tstart()
   #define tstop(a)
   #endif
   #endif
   
 int plot(NODE arg)  extern JMP_BUF ox_env;
 {  
         int id;  
         NODE n;  
         struct canvas *can;  
         P formula;  
         LIST xrange,yrange,zrange,wsize;  
         STRING wname;  
         V v;  
   
         formula = (P)ARG0(arg);  int open_canvas(NODE arg){
         xrange = (LIST)ARG1(arg);    int id;
         yrange = (LIST)ARG2(arg);    struct canvas *can;
         zrange = (LIST)ARG3(arg);    LIST wsize;
         wsize = (LIST)ARG4(arg);    STRING wname;
         wname = (STRING)ARG5(arg);  
   
         can = canvas[id = search_canvas()];    wsize=(LIST)ARG0(arg);
         if ( xrange ) {    wname=(STRING)ARG1(arg);
                 n = BDY(xrange); can->vx = VR((P)BDY(n)); n = NEXT(n);    id=search_canvas();
                 can->qxmin = (Q)BDY(n); n = NEXT(n); can->qxmax = (Q)BDY(n);    can=canvas[id];
                 can->xmin = ToReal(can->qxmin); can->xmax = ToReal(can->qxmax);    can->mode=modeNO(INTERACTIVE);
         }    if(!wsize){
         if ( yrange ) {      can->width=DEFAULTWIDTH;
                 n = BDY(yrange); can->vy = VR((P)BDY(n)); n = NEXT(n);      can->height=DEFAULTHEIGHT;
                 can->qymin = (Q)BDY(n); n = NEXT(n); can->qymax = (Q)BDY(n);    } else {
                 can->ymin = ToReal(can->qymin); can->ymax = ToReal(can->qymax);      can->width=QTOS((Q)BDY(BDY(wsize)));
         }      can->height=QTOS((Q)BDY(NEXT(BDY(wsize))));
         if ( xrange && yrange )    }
                 can->mode = zrange ? MODE_CONPLOT : MODE_IFPLOT;    if(wname)can->wname=BDY(wname);
         else    else can->wname="";
                 can->mode = xrange ? MODE_PLOT : MODE_POLARPLOT;    create_canvas(can);
     return id;
   }
   
         if ( zrange ) {  int plot(NODE arg,int fn){
                 n = NEXT(BDY(zrange));    int id;
                 can->zmin = ToReal(BDY(n));    NODE n;
                 n = NEXT(n); can->zmax = ToReal(BDY(n));    struct canvas *can;
                 n = NEXT(n);    P formula;
                 if ( can->mode == MODE_CONPLOT )    LIST xrange,yrange,zrange,wsize;
                         can->nzstep = n ? QTOS((Q)BDY(n)) : MAXGC;    STRING wname;
                 else {    V v;
                         /* XXX */    Real r;
                         can->vx = VR((P)BDY(BDY(zrange)));    double rr;
                         can->nzstep = n ? QTOS((Q)BDY(n)) : DEFAULTPOLARSTEP;  
                 }  
         }  
   
         if ( !wsize ) {    formula=(P)ARG0(arg);
                 can->width = DEFAULTWIDTH; can->height = DEFAULTHEIGHT;    xrange=(LIST)ARG1(arg);
         } else {    yrange=(LIST)ARG2(arg);
                 can->width = QTOS((Q)BDY(BDY(wsize)));    zrange=(LIST)ARG3(arg);
                 can->height = QTOS((Q)BDY(NEXT(BDY(wsize))));    wsize=(LIST)ARG4(arg);
         }    wname=(STRING)ARG5(arg);
         if ( wname )    can=canvas[id=search_canvas()];
                 can->wname = BDY(wname);    if(xrange){
         else      n=BDY(xrange);can->vx=VR((P)BDY(n));n=NEXT(n);
                 can->wname = "";      can->qxmin=(Q)BDY(n);n=NEXT(n);can->qxmax=(Q)BDY(n);
         can->formula = formula;      can->xmin=ToReal(can->qxmin);can->xmax=ToReal(can->qxmax);
         if ( can->mode == MODE_PLOT ) {    }
                 plotcalc(can);    if(yrange){
                 create_canvas(can);      n=BDY(yrange);can->vy=VR((P)BDY(n));n=NEXT(n);
                 plot_print(display,can);      can->qymin=(Q)BDY(n);n=NEXT(n);can->qymax=(Q)BDY(n);
         } else if ( can->mode == MODE_POLARPLOT ) {      can->ymin=ToReal(can->qymin);can->ymax=ToReal(can->qymax);
                 polarplotcalc(can);    } else if ( !formula || NUM(formula) ) {
                 create_canvas(can);      devalr(CO,(Obj)formula,(Obj *)&r); rr = ToReal(r);
                 plot_print(display,can);      can->ymin=rr-1; can->ymax=rr+1;
         } else {    }
                 create_canvas(can);    can->mode=fn;
                 ifplotmain(can);    if(zrange){
         }      n=NEXT(BDY(zrange));
         copy_to_canvas(can);      can->zmin=ToReal(BDY(n));
         return id;      n=NEXT(n);can->zmax=ToReal(BDY(n));
       n=NEXT(n);
       if(can->mode==modeNO(CONPLOT))can->nzstep=n?QTOS((Q)BDY(n)):MAXGC;
       else {
         can->vx=VR((P)BDY(BDY(zrange)));
         can->nzstep=n?QTOS((Q)BDY(n)):DEFAULTPOLARSTEP;
       }
     }
     if(!wsize){
       can->width=DEFAULTWIDTH;
       can->height=DEFAULTHEIGHT;
     } else {
       can->width=QTOS((Q)BDY(BDY(wsize)));
       can->height=QTOS((Q)BDY(NEXT(BDY(wsize))));
     }
     if(wname) can->wname=BDY(wname);
     else can->wname="";
     can->formula=formula;
     if(can->mode==modeNO(PLOT)){
       //plot
       can->prec=argc(arg)==7 ? QTOS((Q)ARG6(arg)) : 0;
       plotcalc(can);
       create_canvas(can);
       plot_print(display,can);
     } else if(can->mode==modeNO(POLARPLOT)){
       polarcalc(can);
       create_canvas(can);
       plot_print(display,can);
     } else {
       create_canvas(can);
       ifplotmain(can);
     }
     copy_to_canvas(can);
     return id;
 }  }
   
 int memory_plot(NODE arg,LIST *bytes)  void ifplotmain(struct canvas *can){
 {    int i,width,height;
         NODE n;    double ** tabe;
         struct canvas tmp_can;  
         struct canvas *can;  
         P formula;  
         LIST xrange,yrange,zrange,wsize;  
         int width,height;  
         double **tabe;  
         int i;  
         BYTEARRAY barray;  
         Q qw,qh;  
   
         formula = (P)ARG0(arg);    width=can->width;height=can->height;
         xrange = (LIST)ARG1(arg);    tabe=(double **)ALLOCA((width+1)*sizeof(double *));
         yrange = (LIST)ARG2(arg);    for(i=0;i<width;i++)tabe[i]=(double *)ALLOCA((height+1)*sizeof(double));
         zrange = (LIST)ARG3(arg);    define_cursor(can->window,runningcur);
         wsize = (LIST)ARG4(arg);    set_busy(can); set_selection();
     calc(tabe,can,0);
     if_print(display,tabe,can);
     reset_selection(); reset_busy(can);
     define_cursor(can->window,normalcur);
   }
   
         can = &tmp_can;  int memory_plot(NODE arg,LIST *bytes){
         n = BDY(xrange); can->vx = VR((P)BDY(n)); n = NEXT(n);    NODE n;
         can->qxmin = (Q)BDY(n); n = NEXT(n); can->qxmax = (Q)BDY(n);    struct canvas tmp_can;
         can->xmin = ToReal(can->qxmin); can->xmax = ToReal(can->qxmax);    struct canvas *can;
         if ( yrange ) {    P formula;
                 n = BDY(yrange); can->vy = VR((P)BDY(n)); n = NEXT(n);    LIST xrange,yrange,zrange,wsize;
                 can->qymin = (Q)BDY(n); n = NEXT(n); can->qymax = (Q)BDY(n);    int width,height;
                 can->ymin = ToReal(can->qymin); can->ymax = ToReal(can->qymax);    double **tabe;
                 if ( zrange ) {    int i;
                         n = NEXT(BDY(zrange));    BYTEARRAY barray;
                         can->zmin = ToReal(BDY(n)); n = NEXT(n); can->zmax = ToReal(BDY(n));    Q qw,qh,prec;
                         if ( n = NEXT(n) )  
                                 can->nzstep = QTOS((Q)BDY(n));    formula=(P)ARG0(arg);
                         else    xrange=(LIST)ARG1(arg);
                                 can->nzstep = MAXGC;    yrange=(LIST)ARG2(arg);
                         can->mode = MODE_CONPLOT;    zrange=(LIST)ARG3(arg);
                 } else    wsize=(LIST)ARG4(arg);
                         can->mode = MODE_IFPLOT;  
         } else    bzero((char *)&tmp_can,sizeof(tmp_can));
                 can->mode = MODE_PLOT;    can=&tmp_can;
         if ( !wsize ) {    n=BDY(xrange); can->vx=VR((P)BDY(n)); n=NEXT(n);
                 can->width = DEFAULTWIDTH; can->height = DEFAULTHEIGHT;    can->qxmin=(Q)BDY(n); n=NEXT(n); can->qxmax=(Q)BDY(n);
         } else {    can->xmin=ToReal(can->qxmin); can->xmax=ToReal(can->qxmax);
                 can->width = QTOS((Q)BDY(BDY(wsize)));    if( yrange ){
                 can->height = QTOS((Q)BDY(NEXT(BDY(wsize))));      n=BDY(yrange); can->vy=VR((P)BDY(n)); n=NEXT(n);
         }      can->qymin=(Q)BDY(n); n=NEXT(n); can->qymax=(Q)BDY(n);
         can->wname = "";      can->ymin=ToReal(can->qymin); can->ymax=ToReal(can->qymax);
         can->formula = formula;      if( zrange ){
         if ( can->mode == MODE_PLOT )        n=NEXT(BDY(zrange));
                 plotcalc(can);        can->zmin=ToReal(BDY(n)); n=NEXT(n); can->zmax=ToReal(BDY(n));
         else {        n=NEXT(n);
                 width = can->width; height = can->height;        if(n) can->nzstep=QTOS((Q)BDY(n));
                 tabe = (double **)ALLOCA(width*sizeof(double *));        else can->nzstep=MAXGC;
                 for ( i = 0; i < width; i++ )        can->mode=modeNO(CONPLOT);
                         tabe[i] = (double *)ALLOCA(height*sizeof(double));      } else
                 calc(tabe,can,1);        can->mode=modeNO(IFPLOT);
                 memory_if_print(tabe,can,&barray);    } else
                 STOQ(width,qw); STOQ(height,qh);      can->mode=modeNO(PLOT);
                 n = mknode(3,qw,qh,barray);    if( !wsize ){
                 MKLIST(*bytes,n);      can->width=DEFAULTWIDTH; can->height=DEFAULTHEIGHT;
         }    } else {
       can->width=QTOS((Q)BDY(BDY(wsize)));
       can->height=QTOS((Q)BDY(NEXT(BDY(wsize))));
     }
     can->wname="";
     can->formula=formula;
     if( can->mode==modeNO(PLOT)){
       can->prec = argc(arg)==6 ? QTOS((Q)ARG5(arg)) : 0;
       plotcalc(can);
       memory_print(can,&barray);
       STOQ(can->width,qw); STOQ(can->height,qh);
       n=mknode(3,qw,qh,barray);
       MKLIST(*bytes,n);
     } else {
       width=can->width; height=can->height;
       tabe=(double **)ALLOCA(width*sizeof(double *));
       for( i=0; i<width; i++ )
         tabe[i]=(double *)ALLOCA(height*sizeof(double));
       calc(tabe,can,1);
       memory_if_print(tabe,can,&barray);
       STOQ(width,qw); STOQ(height,qh);
       n=mknode(3,qw,qh,barray);
       MKLIST(*bytes,n);
     }
     return 0;
 }  }
   
 int plotover(NODE arg)  int plotover(NODE arg){
 {    int id;
         int index;    unsigned int orgcolor;
         P formula;    P formula;
         struct canvas *can;    struct canvas *can;
         struct canvas fakecan;    VL vl,vl0;
         VL vl,vl0;  
   
         index = QTOS((Q)ARG0(arg));    id=QTOS((Q)ARG0(arg));
         formula = (P)ARG1(arg);    formula=(P)ARG1(arg);
         can = canvas[index];    can=canvas[id];
         if ( !can->window )    orgcolor=can->color;
                 return -1;    if(argc(arg)==3) can->color=QTOS((Q)ARG2(arg));
         get_vars_recursive((Obj)formula,&vl);    else can->color=0;
         for ( vl0 = vl; vl0; vl0 = NEXT(vl0) )    get_vars_recursive((Obj)formula,&vl);
                 if ( vl0->v->attr == (pointer)V_IND )    for(vl0=vl;vl0;vl0=NEXT(vl0))
                         if ( vl->v != can->vx && vl->v != can->vy )      if(vl0->v->attr==(pointer)V_IND)
                                 return -1;        if(vl->v!=can->vx && vl->v!=can->vy)return -1;
         current_can = can;  #if !defined(VISUAL) && !defined(__MINGW32__)
         fakecan = *can; fakecan.formula = formula;    set_drawcolor(can->color);
         if ( can->mode == MODE_PLOT ) {  #endif
                 plotcalc(&fakecan);    current_can=can;
                 plot_print(display,&fakecan);    can->formula=formula;
         } else    if(can->mode==modeNO(PLOT)){
                 ifplotmain(&fakecan);      can->prec = argc(arg)==3 ? QTOS((Q)ARG2(arg)) : 0;
         copy_to_canvas(&fakecan);      plotcalc(can);
         return index;      plot_print(display,can);
     } else ifplotmain(can);
     copy_to_canvas(can);
     can->color=orgcolor;
   #if !defined(VISUAL) && !defined(__MINGW32__)
     set_drawcolor(can->color);
   #endif
     return id;
 }  }
   
 int drawcircle(NODE arg)  int drawcircle(NODE arg){
 {  #if !defined(VISUAL) && !defined(__MINGW32__)
 #if !defined(VISUAL)    int id,index,wx,wy,wr;
         int id;    unsigned int c;
         int index;    pointer ptr;
         pointer ptr;    Q ret;
         Q ret;    LIST xyr;
         LIST xyr;    Obj x,y,r;
         Obj x,y,r;    struct canvas *can;
         int wx,wy,wr;  
         struct canvas *can;  
         struct canvas fakecan;  
   
         index = QTOS((Q)ARG0(arg));    index=QTOS((Q)ARG0(arg));
         xyr = (LIST)ARG1(arg);    xyr=(LIST)ARG1(arg);
         x = (Obj)ARG0(BDY(xyr)); y = (Obj)ARG1(BDY(xyr)); r = (Obj)ARG2(BDY(xyr));    x=(Obj)ARG0(BDY(xyr)); y=(Obj)ARG1(BDY(xyr)); r=(Obj)ARG2(BDY(xyr));
         can = canvas[index];    c=QTOS((Q)ARG2(arg));
         if ( !can->window )    can=canvas[index];
                 return -1;    if(!can->window)return -1;
         else {    else {
                 current_can = can;      current_can=can;
                 wx = (ToReal(x)-can->xmin)*can->width/(can->xmax-can->xmin);      set_drawcolor(c);
                 wy = (can->ymax-ToReal(y))*can->height/(can->ymax-can->ymin);      wx=(ToReal(x)-can->xmin)*can->width/(can->xmax-can->xmin);
                 wr = ToReal(r);      wy=(can->ymax-ToReal(y))*can->height/(can->ymax-can->ymin);
                 XFillArc(display,can->pix,colorGC,wx-wr/2,wy-wr/2,wr,wr,0,360*64);      wr=ToReal(r);
                 copy_to_canvas(can);      XFillArc(display,can->pix,cdrawGC,wx-wr/2,wy-wr/2,wr,wr,0,360*64);
                 return index;      copy_to_canvas(can);
         }      set_drawcolor(can->color);
       return index;
     }
 #endif  #endif
 }  }
   
 int draw_obj(NODE arg)  int draw_obj(NODE arg){
 {    int index,x,y,u,v,len,r;
         int index;    unsigned int color;
         int x,y,u,v,len,r;    NODE obj,n;
         NODE obj,n;    RealVect *vect;
         RealVect *vect;    struct canvas *can;
         struct canvas *can;  
         int color;  
   
         index = QTOS((Q)ARG0(arg));    index=QTOS((Q)ARG0(arg));
         can = canvas[index];    can=canvas[index];
         if ( !can && closed_canvas[index] ) {    if(!can && closed_canvas[index]){
                 canvas[index] = closed_canvas[index];      canvas[index]=closed_canvas[index];
                 closed_canvas[index] = 0;      closed_canvas[index]=0;
                 can = canvas[index];      can=canvas[index];
                 popup_canvas(index);      popup_canvas(index);
                 current_can = can;      current_can=can;
         } else if ( !can || (can && !can->window) ) {    } else if(!can||(can && !can->window)){
                 set_lasterror("draw_obj : canvas does not exist");      set_lasterror("draw_obj : canvas does not exist");
                 return -1;      return -1;
         }    }
   
         obj = BDY((LIST)ARG1(arg));    obj=BDY((LIST)ARG1(arg));
         if ( argc(arg) == 3 )    if(argc(arg)== 3) color=QTOS((Q)ARG2(arg));
                 color = QTOS((Q)ARG2(arg));    else color=0; // black
         else    switch(len=length(obj)){
                 color = 0; /* black */      case 2: // point
         switch ( len = length(obj) ) {        x=(int)ToReal((Q)ARG0(obj)); y=(int)ToReal((Q)ARG1(obj));
                 case 2: /* point */        draw_point(display,can,x,y,color);
                         x = (int)ToReal((Q)ARG0(obj)); y = (int)ToReal((Q)ARG1(obj));        MKRVECT3(vect,x,y,color); MKNODE(n,vect,can->history);
                         draw_point(display,can,x,y,color);        can->history=n;
                         MKRVECT2(vect,x,y); MKNODE(n,vect,can->history); can->history = n;        break;
                         break;      case 3: // circle
                 case 3: /* circle */        x=(int)ToReal((Q)ARG0(obj)); y=(int)ToReal((Q)ARG1(obj));
                         x = (int)ToReal((Q)ARG0(obj)); y = (int)ToReal((Q)ARG1(obj));        r=(int)ToReal((Q)ARG2(obj));
                         r = (int)ToReal((Q)ARG2(obj));        MKRVECT4(vect,x,y,r,color); MKNODE(n,vect,can->history);
                         MKRVECT3(vect,x,y,r); MKNODE(n,vect,can->history); can->history = n;        can->history=n;
                         break;        break;
                 case 4: /* line */      case 4: // line
                         x = (int)ToReal((Q)ARG0(obj)); y = (int)ToReal((Q)ARG1(obj));        x=(int)ToReal((Q)ARG0(obj)); y=(int)ToReal((Q)ARG1(obj));
                         u = (int)ToReal((Q)ARG2(obj)); v = (int)ToReal((Q)ARG3(obj));        u=(int)ToReal((Q)ARG2(obj)); v=(int)ToReal((Q)ARG3(obj));
                         draw_line(display,can,x,y,u,v,color);        draw_line(display,can,x,y,u,v,color);
                         MKRVECT4(vect,x,y,u,v); MKNODE(n,vect,can->history); can->history = n;        MKRVECT5(vect,x,y,u,v,color); MKNODE(n,vect,can->history);
                         break;        can->history=n;
                 default:        break;
                         set_lasterror("draw_obj : invalid request");      default:
                         return -1;        set_lasterror("draw_obj : invalid request");
         }        return -1;
         return 0;    }
   #if !defined(VISUAL) && !defined(__MINGW32__)
     set_drawcolor(can->color);
   #endif
     return 0;
 }  }
   
 int draw_string(NODE arg)  int draw_string(NODE arg){
 {    int index,x,y;
         int index,x,y;    unsigned int color;
         char *str;    char *str;
         NODE pos;    NODE pos;
         struct canvas *can;    struct canvas *can;
         int color;  
   
         index = QTOS((Q)ARG0(arg));    index=QTOS((Q)ARG0(arg));
         can = canvas[index];    can=canvas[index];
         if ( !can && closed_canvas[index] ) {    if(!can && closed_canvas[index]){
                 canvas[index] = closed_canvas[index];      canvas[index]=closed_canvas[index];
                 closed_canvas[index] = 0;      closed_canvas[index]=0;
                 can = canvas[index];      can=canvas[index];
                 popup_canvas(index);      popup_canvas(index);
                 current_can = can;      current_can=can;
         } else if ( !can || (can && !can->window) ) {    } else if(!can||(can && !can->window)){
                 set_lasterror("draw_obj : canvas does not exist");      set_lasterror("draw_obj : canvas does not exist");
                 return -1;      return -1;
         }    }
   
         pos = BDY((LIST)ARG1(arg));    pos=BDY((LIST)ARG1(arg));
         str = BDY((STRING)ARG2(arg));    str=BDY((STRING)ARG2(arg));
         if ( argc(arg) == 4 )    if(argc(arg)==4)color=QTOS((Q)ARG3(arg));
                 color = QTOS((Q)ARG3(arg));    else color=0; // black
         else    x=(int)ToReal((Q)ARG0(pos));
                 color = 0; /* black */    y=(int)ToReal((Q)ARG1(pos));
         x = (int)ToReal((Q)ARG0(pos));    draw_character_string(display,can,x,y,str,color);
         y = (int)ToReal((Q)ARG1(pos));  #if !defined(VISUAL) && !defined(__MINGW32__)
         draw_character_string(display,can,x,y,str,color);    set_drawcolor(can->color);
         return 0;  #endif
     return 0;
 }  }
   
 int clear_canvas(NODE arg)  int clear_canvas(NODE arg){
 {    int index;
         int index;    struct canvas *can;
         struct canvas *can;  
   
         index = QTOS((Q)ARG0(arg));    index=QTOS((Q)ARG0(arg));
         can = canvas[index];    can=canvas[index];
         if ( !can || !can->window )    if(!can||!can->window) return -1;
                 return -1;    clear_pixmap(can);
         clear_pixmap(can);    copy_to_canvas(can);
         copy_to_canvas(can);    // clear the history
         /* clear the history */    can->history=0;
         can->history = 0;    return 0;
 }  }
   
 #define RealtoDbl(r) ((r)?BDY(r):0.0)  #define RealtoDbl(r) ((r)?BDY(r):0.0)
   
 int arrayplot(NODE arg)  int arrayplot(NODE arg){
 {    int id,ix,w,h;
         int id,ix,w,h;    VECT array;
         VECT array;    LIST xrange,wsize;
         LIST xrange,wsize;    char *wname;
         char *wname;    NODE n;
         NODE n;    double ymax,ymin,dy,xstep;
         double ymax,ymin,dy,xstep;    Real *tab;
         Real *tab;    struct canvas *can;
         struct canvas *can;    POINT *pa;
         POINT *pa;  
   
         array = (VECT)ARG0(arg);    array=(VECT)ARG0(arg);
         xrange = (LIST)ARG1(arg);    xrange=(LIST)ARG1(arg);
         can = canvas[id = search_canvas()];    can=canvas[id=search_canvas()];
         n = BDY(xrange); can->vx = VR((P)BDY(n)); n = NEXT(n);    n=BDY(xrange); can->vx=VR((P)BDY(n)); n=NEXT(n);
         can->qxmin = (Q)BDY(n); n = NEXT(n); can->qxmax = (Q)BDY(n);    can->qxmin=(Q)BDY(n); n=NEXT(n); can->qxmax=(Q)BDY(n);
         can->xmin = ToReal(can->qxmin); can->xmax = ToReal(can->qxmax);    can->xmin=ToReal(can->qxmin); can->xmax=ToReal(can->qxmax);
         if ( !wsize ) {    if(!wsize){
                 can->width = DEFAULTWIDTH; can->height = DEFAULTHEIGHT;      can->width=DEFAULTWIDTH;
         } else {      can->height=DEFAULTHEIGHT;
                 can->width = QTOS((Q)BDY(BDY(wsize)));    } else {
                 can->height = QTOS((Q)BDY(NEXT(BDY(wsize))));      can->width=QTOS((Q)BDY(BDY(wsize)));
         }      can->height=QTOS((Q)BDY(NEXT(BDY(wsize))));
         can->wname = wname; can->formula = 0; can->mode = MODE_PLOT;    }
         create_canvas(can);    can->wname=wname; can->formula=0; can->mode=modeNO(PLOT);
         w = array->len;    create_canvas(can);
         h = can->height;    w=array->len;
         tab = (Real *)BDY(array);    h=can->height;
         if ( can->ymax == can->ymin ) {    tab=(Real *)BDY(array);
                 for ( ymax = ymin = RealtoDbl(tab[0]), ix = 1; ix < w; ix++ ) {    if(can->ymax==can->ymin){
                         if ( RealtoDbl(tab[ix]) > ymax )      for(ymax=ymin=RealtoDbl(tab[0]),ix=1; ix<w; ix++){
                                 ymax = RealtoDbl(tab[ix]);        if(RealtoDbl(tab[ix])>ymax)ymax=RealtoDbl(tab[ix]);
                         if ( RealtoDbl(tab[ix]) < ymin )        if(RealtoDbl(tab[ix])<ymin)ymin=RealtoDbl(tab[ix]);
                                 ymin = RealtoDbl(tab[ix]);      }
                 }      can->ymax=ymax;
                 can->ymax = ymax; can->ymin = ymin;      can->ymin=ymin;
         } else {    } else {
                 ymax = can->ymax; ymin = can->ymin;      ymax=can->ymax;
         }      ymin=can->ymin;
         dy = ymax-ymin;    }
         can->pa = (struct pa *)MALLOC(sizeof(struct pa));    dy=ymax-ymin;
         can->pa[0].length = w;    can->pa=(struct pa *)MALLOC(sizeof(struct pa));
         can->pa[0].pos = pa = (POINT *)MALLOC(w*sizeof(POINT));    can->pa[0].length=w;
         xstep = (double)can->width/(double)(w-1);    can->pa[0].pos=pa=(POINT *)MALLOC(w*sizeof(POINT));
         for ( ix = 0; ix < w; ix++ ) {    xstep=(double)can->width/(double)(w-1);
     for(ix=0;ix<w;ix++){
 #ifndef MAXSHORT  #ifndef MAXSHORT
 #define MAXSHORT ((short)0x7fff)  #define MAXSHORT ((short)0x7fff)
 #endif  #endif
                 double t;      double t;
   
                 pa[ix].x = (int)(ix*xstep);      pa[ix].x=(int)(ix*xstep);
                 t = (h - 1)*(ymax - RealtoDbl(tab[ix]))/dy;      t=(h - 1)*(ymax - RealtoDbl(tab[ix]))/dy;
                 if ( t > MAXSHORT )      if(t>MAXSHORT)pa[ix].y=MAXSHORT;
                         pa[ix].y = MAXSHORT;      else if(t<-MAXSHORT)pa[ix].y=-MAXSHORT;
                 else if ( t < -MAXSHORT )      else pa[ix].y=(long)t;
                         pa[ix].y = -MAXSHORT;    }
                 else    plot_print(display,can);
                         pa[ix].y = (long)t;    copy_to_canvas(can);
         }    return id;
         plot_print(display,can);  
         copy_to_canvas(can);  
         return id;  
 }  }
   /*
   void ifplot_resize(struct canvas *can,POINT spos,POINT epos){
     struct canvas *ncan;
     struct canvas fakecan;
     Q dx,dy,dx2,dy2,xmin,xmax,ymin,ymax,xmid,ymid;
     Q sx,sy,ex,ey,cw,ch,ten,two;
     Q s,t;
     int new;
     int w,h,m;
     if(XC(spos)<XC(epos) && YC(spos)<YC(epos)){
       if(can->precise && !can->wide){
         fakecan=*can;
         ncan=&fakecan;
       } else {
         new=search_canvas();
         ncan=canvas[new];
       }
       ncan->mode=can->mode;
       ncan->zmin=can->zmin; ncan->zmax=can->zmax;
       ncan->nzstep=can->nzstep;
       ncan->wname=can->wname;
       ncan->vx=can->vx; ncan->vy=can->vy;
       ncan->formula=can->formula;
       w=XC(epos)-XC(spos);
       h=YC(epos)-YC(spos);
       m=MAX(can->width,can->height);
       if(can->precise){
         ncan->width=w;
         ncan->height=h;
       } else if(w>h){
         ncan->width=m;
         ncan->height=m*h/w;
       } else {
         ncan->width=m*w/h;
         ncan->height=m;
       }
       if(can->wide){
         STOQ(10,ten);
         STOQ(2,two);
         subq(can->qxmax,can->qxmin,&t);
         mulq(t,ten,&dx);
         subq(can->qymax,can->qymin,&t);
         mulq(t,ten,&dy);
         addq(can->qxmax,can->qxmin,&t);
         divq(t,two,&xmid);
         addq(can->qymax,can->qymin,&t);
         divq(t,two,&ymid);
         divq(dx,two,&dx2);
         divq(dy,two,&dy2);
         subq(xmid,dx2,&xmin);
         addq(xmid,dx2,&xmax);
         subq(ymid,dy2,&ymin);
         addq(ymid,dy2,&ymax);
       } else {
         subq(can->qxmax,can->qxmin,&dx);
         subq(can->qymax,can->qymin,&dy);
         xmin=can->qxmin;
         xmax=can->qxmax;
         ymin=can->qymin;
         ymax=can->qymax;
       }
       STOQ(XC(spos),sx); STOQ(YC(spos),sy); STOQ(XC(epos),ex); STOQ(YC(epos),ey);
       STOQ(can->width,cw); STOQ(can->height,ch);
       mulq(sx,dx,&t); divq(t,cw,&s); addq(xmin,s,&ncan->qxmin);
       mulq(ex,dx,&t); divq(t,cw,&s); addq(xmin,s,&ncan->qxmax);
       mulq(ey,dy,&t); divq(t,ch,&s); subq(ymax,s,&ncan->qymin);
       mulq(sy,dy,&t); divq(t,ch,&s); subq(ymax,s,&ncan->qymax);
       ncan->xmin=ToReal(ncan->qxmin); ncan->xmax=ToReal(ncan->qxmax);
       ncan->ymin=ToReal(ncan->qymin); ncan->ymax=ToReal(ncan->qymax);
       if(can->precise && !can->wide){
         current_can=can;
         alloc_pixmap(ncan);
   #if defined(VISUAL) || defined(__MINGW32__)
         ncan->real_can=can;
   #endif
         qifplotmain(ncan);
         copy_subimage(ncan,can,spos);
         copy_to_canvas(can);
       } else {
         create_canvas(ncan);
         if( can->precise ) qifplotmain(ncan);
         else ifplotmain(ncan);
         copy_to_canvas(ncan);
       }
     }
   }
   */
   
 void ifplot_resize(struct canvas *can,POINT spos,POINT epos)  void plot_resize(struct canvas *can,POINT spos,POINT epos){
     struct canvas *ncan;
     Q dx,dx2,xmin,xmax,xmid,sx,ex,cw,ten,two,s,t;
     double dy,ymin,ymax,ymid;
     int new,w,h,m;
   
     if( XC(spos)<XC(epos) && YC(spos)<YC(epos) ){
       new=search_canvas(); ncan=canvas[new];
       ncan->mode=can->mode;
       ncan->zmin=can->zmin; ncan->zmax=can->zmax;
       ncan->nzstep=can->nzstep;
       ncan->wname=can->wname;
       ncan->vx=can->vx; ncan->vy=can->vy;
       ncan->formula=can->formula;
       ncan->color=can->color;
       w=XC(epos)-XC(spos);
       h=YC(epos)-YC(spos);
       m=MAX(can->width,can->height);
       if( w>h ){
         ncan->width=m;
         ncan->height=m * h/w;
       } else {
         ncan->width=m * w/h;
         ncan->height=m;
       }
       if( can->wide ){
         STOQ(10,ten); STOQ(2,two);
         subq(can->qxmax,can->qxmin,&t); mulq(t,ten,&dx);
         addq(can->qxmax,can->qxmin,&t); divq(t,two,&xmid);
         divq(dx,two,&dx2); subq(xmid,dx2,&xmin); addq(xmid,dx2,&xmax);
         dy=(can->ymax-can->ymin)*10;
         ymid=(can->ymax+can->ymin)/2;
         ymin=ymid-dy/2; ymax=ymid+dy/2;
       } else {
         subq(can->qxmax,can->qxmin,&dx);
         xmin=can->qxmin;
         xmax=can->qxmax;
         dy=can->ymax-can->ymin;
         ymin=can->ymin;
         ymax=can->ymax;
       }
       STOQ(XC(spos),sx); STOQ(XC(epos),ex); STOQ(can->width,cw);
       mulq(sx,dx,&t); divq(t,cw,&s); addq(xmin,s,&ncan->qxmin);
       mulq(ex,dx,&t); divq(t,cw,&s); addq(xmin,s,&ncan->qxmax);
       ncan->xmin=ToReal(ncan->qxmin); ncan->xmax=ToReal(ncan->qxmax);
       ncan->ymin=ymax-YC(epos)*dy/can->height;
       ncan->ymax=ymax-YC(spos)*dy/can->height;
       ncan->prec = can->prec;
       create_canvas(ncan);
   
       switch (ncan->mode){
       case 0://IFPLOT
       case 1://CONPLOT
         ifplotmain(ncan);
         break;
       case 2://PLOT
         plotcalc(ncan);
         plot_print(display,ncan);
         break;
       case 4://POLARPLOT
         polarcalc(ncan);
         plot_print(display,ncan);
         break;
       case 30://MEMORY_PLOT
         break;
       case 31://ARRAYPLOT
         break;
       case 33://DRAWCIRCLE
         break;
       case 34://DRAW_OBJ
         break;
       case 35://DRAW_STRING
         break;
       case 36://OBJ_CP
         break;
       case 6://IFPLOTD
       case 7://IFPLOTQ
       case 8://IFPLOTB
       case 9://INEQND
       case 10://INEQNQ
       case 11://INEQNB
       case 21://CONPLOTD
       case 22://CONPLOTQ
       case 23://CONPLOTB
       case 24://ITVIFPLOT
         //ifplotNG
         ifplotmainNG(ncan);
         break;
       case 12://INEQNDAND
       case 13://INEQNQAND
       case 14://INEQNBAND
       case 15://INEQNDOR
       case 16://INEQNQOR
       case 17://INEQNBOR
       case 18://INEQNDXOR
       case 19://INEQNQXOR
       case 20://INEQNBXOR
       case 25://PLOTOVERD
       case 26://PLOTOVERQ
       case 27://PLOTOVERB
         //ifplotOP
         ifplotmainNG(ncan);
         break;
       case 38://POLARPLOTD
         //polarplotNG
         polarcalcNG(ncan);
         polar_print(display,ncan);
         break;
       }
       copy_to_canvas(ncan);
     }
   }
   
   void qifplotmain(struct canvas *can)
 {  {
         struct canvas *ncan;    int width,height;
         struct canvas fakecan;    char **tabe,*tabeb;
         Q dx,dy,dx2,dy2,xmin,xmax,ymin,ymax,xmid,ymid;    int i;
         Q sx,sy,ex,ey,cw,ch,ten,two;  
         Q s,t;  
         int new;  
         int w,h,m;  
   
         if ( XC(spos) < XC(epos) && YC(spos) < YC(epos) ) {    width=can->width; height=can->height;
                 if ( can->precise && !can->wide ) {    tabe=(char **)ALLOCA(width*sizeof(char *)+width*height*sizeof(char));
                         fakecan = *can; ncan = &fakecan;    bzero((void *)tabe,width*sizeof(char *)+width*height*sizeof(char));
                 } else {    for( i=0, tabeb=(char *)(tabe+width); i<width; i++ )
                         new = search_canvas(); ncan = canvas[new];      tabe[i]=tabeb + height*i;
                 }    define_cursor(can->window,runningcur);
                 ncan->mode = can->mode;    set_busy(can); set_selection();
                 ncan->zmin = can->zmin; ncan->zmax = can->zmax;    qcalc(tabe,can); qif_print(display,tabe,can);
                 ncan->nzstep = can->nzstep;    reset_selection(); reset_busy(can);
                 ncan->wname = can->wname;    define_cursor(can->window,normalcur);
                 ncan->vx = can->vx; ncan->vy = can->vy;  }
                 ncan->formula = can->formula;  
                 w = XC(epos)-XC(spos);  //*******************ifplotNG
                 h = YC(epos)-YC(spos);  int ifplotNG(NODE arg,int func){
                 m = MAX(can->width,can->height);    int id,op_code;
                 if ( can->precise ) {    unsigned int color;
                         ncan->width = w; ncan->height = h;    NODE n;
                 } else if ( w > h ) {    struct canvas *can;
                         ncan->width = m; ncan->height = m * h/w;    P formula;
                 } else {    LIST xrange,yrange,zrange,wsize;
                         ncan->width = m * w/h; ncan->height = m;    STRING wname;
                 }  
                 if ( can->wide ) {    can=canvas[id=search_canvas()];
                         STOQ(10,ten); STOQ(2,two);    formula=(P)ARG0(arg);
                         subq(can->qxmax,can->qxmin,&t); mulq(t,ten,&dx);    can->color=QTOS((Q)ARG1(arg));
                         subq(can->qymax,can->qymin,&t); mulq(t,ten,&dy);    xrange=(LIST)ARG2(arg);
                         addq(can->qxmax,can->qxmin,&t); divq(t,two,&xmid);    yrange=(LIST)ARG3(arg);
                         addq(can->qymax,can->qymin,&t); divq(t,two,&ymid);    zrange=(LIST)ARG4(arg);
                         divq(dx,two,&dx2); divq(dy,two,&dy2);    wsize=(LIST)ARG5(arg);
                         subq(xmid,dx2,&xmin); addq(xmid,dx2,&xmax);    wname=(STRING)ARG6(arg);
                         subq(ymid,dy2,&ymin); addq(ymid,dy2,&ymax);    can->division=0;
                 } else {    // set canvas data
                         subq(can->qxmax,can->qxmin,&dx); subq(can->qymax,can->qymin,&dy);    if(xrange){
                         xmin = can->qxmin; xmax = can->qxmax;      n=BDY(xrange); can->vx=VR((P)BDY(n)); n=NEXT(n);
                         ymin = can->qymin; ymax = can->qymax;      can->qxmin=(Q)BDY(n); n=NEXT(n); can->qxmax=(Q)BDY(n);
                 }      can->xmin=ToReal(can->qxmin); can->xmax=ToReal(can->qxmax);
                 STOQ(XC(spos),sx); STOQ(YC(spos),sy); STOQ(XC(epos),ex); STOQ(YC(epos),ey);    }
                 STOQ(can->width,cw); STOQ(can->height,ch);    if(yrange){
                 mulq(sx,dx,&t); divq(t,cw,&s); addq(xmin,s,&ncan->qxmin);      n=BDY(yrange); can->vy=VR((P)BDY(n)); n=NEXT(n);
                 mulq(ex,dx,&t); divq(t,cw,&s); addq(xmin,s,&ncan->qxmax);      can->qymin=(Q)BDY(n); n=NEXT(n); can->qymax=(Q)BDY(n);
                 mulq(ey,dy,&t); divq(t,ch,&s); subq(ymax,s,&ncan->qymin);      can->ymin=ToReal(can->qymin); can->ymax=ToReal(can->qymax);
                 mulq(sy,dy,&t); divq(t,ch,&s); subq(ymax,s,&ncan->qymax);    }
                 ncan->xmin = ToReal(ncan->qxmin); ncan->xmax = ToReal(ncan->qxmax);    if(zrange){
                 ncan->ymin = ToReal(ncan->qymin); ncan->ymax = ToReal(ncan->qymax);      n=BDY(zrange); can->zmin=ToReal(BDY(n));
                 if ( can->precise && !can->wide ) {      n=NEXT(n); can->zmax=ToReal(BDY(n));
                         current_can = can;      n=NEXT(n); can->nzstep=QTOS((Q)BDY(n));
                         alloc_pixmap(ncan);    }
 #if defined(VISUAL)    if(!wsize){
                         ncan->real_can = can;      can->width=DEFAULTWIDTH;
       can->height=DEFAULTHEIGHT;
     } else {
       can->width=QTOS((Q)BDY(BDY(wsize)));
       can->height=QTOS((Q)BDY(NEXT(BDY(wsize))));
     }
     if(wname) can->wname=BDY(wname);
     else can->wname="";
     can->formula=formula;
     set_drawcolor(can->color);
     can->mode=func;
     create_canvas(can);
     ifplotmainNG(can);
     copy_to_canvas(can);
     return id;
   }
   
   int ifplotOP(NODE arg,int func){
     //ineqnor[D,Q,B],ineqnand[D,Q,B],ineqnxor[D,Q,b],plotover[D,Q,B]
     int index,op_code;
     unsigned int orgcolor,color;
     P formula;
     struct canvas *can;
     VL vl,vl0;
     NODE n;
   
     index=QTOS((Q)ARG0(arg));
     formula=(P)ARG1(arg);
     color=QTOS((Q)ARG2(arg));
     // set canvas data
     can=canvas[index];
     orgcolor=can->color;
     can->color=color;
     can->formula=formula;
     current_can=can;
     get_vars_recursive((Obj)formula,&vl);
     for(vl0=vl;vl0;vl0=NEXT(vl0))
       if(vl0->v->attr==(pointer)V_IND)
         if(vl->v!=can->vx && vl->v!=can->vy)return -1;
   #if !defined(VISUAL) && !defined(__MINGW32__)
     set_drawcolor(can->color);
 #endif  #endif
                         qifplotmain(ncan);    can->mode=func;
                         copy_subimage(ncan,can,spos);    set_drawcolor(color);
                         copy_to_canvas(can);    ifplotmainNG(can);
                 } else {    set_drawcolor(orgcolor);
                         create_canvas(ncan);    copy_to_canvas(can);
                         if ( can->precise )    can->color=orgcolor;
                                 qifplotmain(ncan);  #if !defined(VISUAL) && !defined(__MINGW32__)
                         else    set_drawcolor(can->color);
                                 ifplotmain(ncan);  #endif
                         copy_to_canvas(ncan);    return index;
                 }  
         }  
 }  }
   
 void plot_resize(struct canvas *can,POINT spos,POINT epos)  void ifplotmainNG(struct canvas *can){
 {    int width,height,i,j,ix,iy,**mask;
         struct canvas *ncan;    double **tabe;
         Q dx,dx2,xmin,xmax,xmid;  
         double dy,ymin,ymax,ymid;  
         Q sx,ex,cw,ten,two;  
         Q s,t;  
         int new;  
         int w,h,m;  
   
         if ( XC(spos) < XC(epos) && YC(spos) < YC(epos) ) {    width=can->width; height=can->height;
                 new = search_canvas(); ncan = canvas[new];    tabe=(double **)ALLOCA((width+1)*sizeof(double *));
                 ncan->mode = can->mode;    for(i=0;i<width;i++)tabe[i]=(double *)ALLOCA((height+1)*sizeof(double));
                 ncan->zmin = can->zmin; ncan->zmax = can->zmax;    define_cursor(can->window,runningcur);
                 ncan->nzstep = can->nzstep;    set_busy(can); set_selection();
                 ncan->wname = can->wname;    set_drawcolor(can->color);
                 ncan->vx = can->vx; ncan->vy = can->vy;    switch(can->mode){
                 ncan->formula = can->formula;    case 6://IFPLOTD
                 w = XC(epos)-XC(spos);      calc(tabe,can,0);
                 h = YC(epos)-YC(spos);      if_printNG(display,tabe,can,1);
                 m = MAX(can->width,can->height);      break;
                 if ( w > h ) {    case 7://IFPLOTQ
                         ncan->width = m; ncan->height = m * h/w;      calcq(tabe,can,0);
                 } else {      if_printNG(display,tabe,can,1);
                         ncan->width = m * w/h; ncan->height = m;      break;
                 }    case 8://IFPLOTB
                 if ( can->wide ) {      calcb(tabe,can,0);
                         STOQ(10,ten); STOQ(2,two);      if_printNG(display,tabe,can,0);
                         subq(can->qxmax,can->qxmin,&t); mulq(t,ten,&dx);      break;
                         addq(can->qxmax,can->qxmin,&t); divq(t,two,&xmid);    case 9://INEQND
                         divq(dx,two,&dx2); subq(xmid,dx2,&xmin); addq(xmid,dx2,&xmax);      calc(tabe,can,0);
       area_print(display,tabe,can,0);
       break;
     case 10://INEQNQ
       calcq(tabe,can,0);
       area_print(display,tabe,can,0);
       break;
     case 11://INEQNB
       calcb(tabe,can,0);
       area_print(display,tabe,can,0);
       break;
     case 12://INEQNFAND
       calc(tabe,can,0);
       area_print(display,tabe,can,2);
       break;
     case 13://INEQNQAND
       calcq(tabe,can,0);
       area_print(display,tabe,can,2);
       break;
     case 14://INEQNBAND
       calcb(tabe,can,0);
       area_print(display,tabe,can,2);
       break;
     case 15://INEQNDOR
       calc(tabe,can,0);
       area_print(display,tabe,can,3);
       break;
     case 16://INEQNQOR
       calcq(tabe,can,0);
       area_print(display,tabe,can,3);
       break;
     case 17://INEQNBOR
       calcb(tabe,can,0);
       area_print(display,tabe,can,3);
       break;
     case 18://INEQNDXOR
       calc(tabe,can,0);
       area_print(display,tabe,can,4);
       break;
     case 19://INEQNQXOR
       calcq(tabe,can,0);
       area_print(display,tabe,can,4);
       break;
     case 20://INEQNBXOR
       calcb(tabe,can,0);
       area_print(display,tabe,can,4);
       break;
     case 21://CONPLOTD
       calc(tabe,can,0);
       con_print(display,tabe,can);
       break;
     case 22://CONPLOTQ
       calcq(tabe,can,0);
       con_print(display,tabe,can);
       break;
     case 23://CONPLOTB
       calcb(tabe,can,0);
       con_print(display,tabe,can);
       break;
   #if defined(INTERVAL)
     case 24://ITVIFPLOT:
       itvcalc(tabe,can,1);
       if_printNG(display,tabe,can,1);
       break;
   #endif
     case 25://PLOTOVERD
       calc(tabe,can,0);
       over_print(display,tabe,can,0);
       break;
     case 26://PLOTOVERQ:
       calcq(tabe,can,0);
       over_print(display,tabe,can,0);
       break;
     case 27://PLOTOVERB:
       calcb(tabe,can,0);
       over_print(display,tabe,can,0);
       break;
     }
     set_drawcolor(can->color);
     reset_selection(); reset_busy(can);
     define_cursor(can->window,normalcur);
   }
   
                         dy = (can->ymax-can->ymin)*10;  #if !defined(VISUAL) && !defined(__MINGW32__)
                         ymid = (can->ymax+can->ymin)/2;  int objcp(NODE arg){
                         ymin = ymid-dy/2; ymax = ymid+dy/2;    int idsrc, idtrg, op_code;
                 } else {    struct canvas *cansrc, *cantrg;
                         subq(can->qxmax,can->qxmin,&dx);  
                         xmin = can->qxmin; xmax = can->qxmax;  
   
                         dy = can->ymax-can->ymin;    idsrc=QTOS((Q)ARG0(arg));
                         ymin = can->ymin; ymax = can->ymax;    idtrg=QTOS((Q)ARG1(arg));
                 }    op_code=QTOS((Q)ARG2(arg));
                 STOQ(XC(spos),sx); STOQ(XC(epos),ex); STOQ(can->width,cw);    cansrc=canvas[idsrc];
                 mulq(sx,dx,&t); divq(t,cw,&s); addq(xmin,s,&ncan->qxmin);    cantrg=canvas[idtrg];
                 mulq(ex,dx,&t); divq(t,cw,&s); addq(xmin,s,&ncan->qxmax);    obj_op(cansrc, cantrg, op_code);
                 ncan->xmin = ToReal(ncan->qxmin); ncan->xmax = ToReal(ncan->qxmax);    return idsrc;
   }
   
                 ncan->ymin = ymax-YC(epos)*dy/can->height;  void obj_op(struct canvas *cansrc, struct canvas *cantrg, int op){
                 ncan->ymax = ymax-YC(spos)*dy/can->height;    XImage *imgsrc, *imgtrg;
     int width, height, i, j;
     unsigned long src, trg, black, white;
   
                 create_canvas(ncan);    width=cansrc->width; height=cansrc->height;
                 plotcalc(ncan);    imgsrc=XGetImage(display, cansrc->pix, 0, 0, width, height, -1, ZPixmap);
                 plot_print(display,ncan);    imgtrg=XGetImage(display, cantrg->pix, 0, 0, width, height, -1, ZPixmap);
                 copy_to_canvas(ncan);    black=GetColor(display, "black");
         }    white=GetColor(display, "white");
     flush();
     define_cursor(cantrg->window,runningcur);
     set_busy(cantrg); set_selection();
     cantrg->precise=cansrc->precise;
     cantrg->noaxis=cansrc->noaxis;
     cantrg->noaxisb=cansrc->noaxisb;
     cantrg->vx=cansrc->vx;
     cantrg->vy=cansrc->vy;
     cantrg->formula=cansrc->formula;
     cantrg->width=cansrc->width;
     cantrg->height=cansrc->height;
     cantrg->xmin=cansrc->xmin;
     cantrg->xmax=cansrc->xmax;
     cantrg->ymin=cansrc->ymin;
     cantrg->ymax=cansrc->ymax;
     cantrg->zmin=cansrc->zmin;
     cantrg->zmax=cansrc->zmax;
     cantrg->nzstep=cansrc->nzstep;
     cantrg->qxmin=cansrc->qxmin;
     cantrg->qxmax=cansrc->qxmax;
     cantrg->qymin=cansrc->qymin;
     cantrg->qymax=cansrc->qymax;
     cantrg->pa=cansrc->pa;
     switch(op){
       case 1:/* and case */
         for(i=0;i<width;i++)for(j=0;j<height;j++){
           src=XGetPixel(imgsrc,i,j);
           trg=XGetPixel(imgtrg,i,j);
           if( (src == black) || (trg == black) )
             XPutPixel(imgtrg,i,j,black);
           else if( (src == white) || (trg == white) )
             XPutPixel(imgtrg,i,j,white);
           else XPutPixel(imgtrg,i,j,(src & trg));
         }
         break;
       case 3:/* copy case */
         imgtrg->data=imgsrc->data;
         break;
       case 6:/* xor case */
         for(i=0;i<width;i++)for(j=0;j<height;j++){
           src=XGetPixel(imgsrc,i,j);
           trg=XGetPixel(imgtrg,i,j);
           if( (src == black) || (trg == black) )
             XPutPixel(imgtrg,i,j,black);
           else if( (src == white) && (trg == white) )
             XPutPixel(imgtrg,i,j,trg|src);
           else if( (src != white) && (trg != white) )
             XPutPixel(imgtrg,i,j,white);
           else if( src == white )
             XPutPixel(imgtrg,i,j,src);
         }
         break;
       case 7:/* or case */
         for(i=0;i<width;i++)for(j=0;j<height;j++){
           src=XGetPixel(imgsrc,i,j);
           trg=XGetPixel(imgtrg,i,j);
           if( (src == black) || (trg == black) )
             XPutPixel(imgtrg,i,j,black);
           else if(src == white)
             XPutPixel(imgtrg,i,j,trg);
           else if(trg == white)
             XPutPixel(imgtrg,i,j,src);
         }
         break;
       default:
         break;
     }
     XPutImage(display, cantrg->pix, drawGC, imgtrg, 0, 0, 0, 0, width, height);
     reset_selection(); reset_busy(cantrg);
     define_cursor(cantrg->window,normalcur);
     copy_to_canvas(cantrg);
     count_and_flush();
     flush();
 }  }
   #endif
   
 void ifplotmain(struct canvas *can)  int polarplotNG(NODE arg){
 {    int i,id,width,height;
         int width,height;    NODE n;
         double **tabe;    struct canvas *can;
         int i;    LIST range,geom;
     STRING wname;
     V v;
   
         width = can->width; height = can->height;    id=search_canvas();
         tabe = (double **)ALLOCA(width*sizeof(double *));    can=canvas[id];
         for ( i = 0; i < width; i++ )    can->mode=modeNO(POLARPLOTD);
                 tabe[i] = (double *)ALLOCA(height*sizeof(double));    can->formula=(P)ARG0(arg);
         define_cursor(can->window,runningcur);    can->color=QTOS((Q)ARG1(arg));
         set_busy(can); set_selection();    range=(LIST)ARG2(arg);
         calc(tabe,can,0); if_print(display,tabe,can);    geom=(LIST)ARG3(arg);
         reset_selection(); reset_busy(can);    wname=(STRING)ARG4(arg);
         define_cursor(can->window,normalcur);  
     if(range){
       n=NEXT(BDY(range));
       can->zmin=ToReal(BDY(n));
       n=NEXT(n);can->zmax=ToReal(BDY(n));
       n=NEXT(n);
       can->vx=VR((P)BDY(BDY(range)));
       can->nzstep=n?QTOS((Q)BDY(n)):DEFAULTPOLARSTEP;
     }
     if(geom){
       can->width=width=QTOS((Q)BDY(BDY(geom)));
       can->height=height=QTOS((Q)BDY(NEXT(BDY(geom))));
     }
     if(wname)can->wname=BDY(wname);
     else can->wname="";
     polarcalcNG(can);
     create_canvas(can);
     set_drawcolor(can->color);
     polar_print(display,can);
     reset_selection();
     reset_busy(can);
     define_cursor(can->window,normalcur);
     return id;
 }  }
   
 void qifplotmain(struct canvas *can)  void MSGdraw(char *str){
 {    int id,x,y;
         int width,height;    struct canvas *can;
         char **tabe,*tabeb;  
         int i;  
   
         width = can->width; height = can->height;    id=search_canvas();
         tabe = (char **)ALLOCA(width*sizeof(char *)+width*height*sizeof(char));    can=canvas[id];
         bzero((void *)tabe,width*sizeof(char *)+width*height*sizeof(char));    can->mode=modeNO(INTERACTIVE);
         for ( i = 0, tabeb = (char *)(tabe+width); i < width; i++ )    can->width=300;
                 tabe[i] = tabeb + height*i;    can->height=300;
         define_cursor(can->window,runningcur);    can->wname="MSG";
         set_busy(can); set_selection();    x=100;
         qcalc(tabe,can); qif_print(display,tabe,can);    y=100;
         reset_selection(); reset_busy(can);    create_canvas(can);
         define_cursor(can->window,normalcur);    draw_character_string(display,can,x,y,str,0xff0000);
 }  }
   

Legend:
Removed from v.1.15  
changed lines
  Added in v.1.37

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>