/*plot.amiga for amiga version of PARI, based on plot.sun          */


/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*                                                                 */
/*                     PLOT EN HAUTE RESOLUTION                    */
/*                                                                 */
/*                       copyright Babe Cool                       */
/*                                                                 */
/*                                                                 */
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

# include "genpari.h"



#include <exec/types.h>
#include <intuition/intuition.h>
#include <graphics/gfxmacros.h>
#include <string.h>

typedef struct spoint {
  int x,y;} SPoint;
typedef struct ssegment {
  int x1,y1,x2,y2;} SSegment;
typedef struct srectangle {
  int x,y,width,height;} SRectangle;

long GfxBase;

#undef ISCR
#undef JSCR     
#define ISCR 640 /* hires width*/
#define JSCR 400  /* hires height*/
#define DECI 50  /* 140 en haute resolution  */
#define DECJ 25  /* 70 en haute resolution   */
#define IDEC 5
#define JDEC 10



GEN  ploth(entree *ep,GEN a,GEN b,char *ch, long prec)



{

struct IntuiMessage *msg;

struct TextAttr myfont =

{
	(STRPTR)"topaz.font", 8 , 0 , 0
};

struct NewScreen myscreen1 =
{
	0, 0,
	650, 420,
	2,
	1,2,
	HIRES | LACE,
	CUSTOMSCREEN,
	NULL,/*(struct TextAttr *)&myfont,*/
	(UBYTE *)"ploth",
	NULL,
	NULL

};

struct NewWindow myWindow =

{	
	0,

	5,
	640,410,
	-1,
	-1,
	
	CLOSEWINDOW ,/* | REFRESHWINDOW ,*/

	SMART_REFRESH | WINDOWCLOSE  | WINDOWDRAG,



	NULL,

	NULL,

	(UBYTE *)"PLOTH",

	NULL,
	NULL,
	10, 10,

	640, 400,

	CUSTOMSCREEN

};

  long av,av2,j,j1,i,sig,is,is2,js,js2;
  GEN p1,p2,p3,p4,ysml,ybig,x,diff,dyj,dx,y[ISCR+1];
  short h, iz=0, jz = 0, ordonnee[ISCR+1];
  char c1[20], c2[20], c3[20], c4[20];

  struct Screen *s, *OpenScreen();
  struct Window *w, *OpenWindow();
  struct RastPort *rp;

  GfxBase=OpenLibrary("graphics.library",0);
  if(!GfxBase )
	{ printf("can not open graphics.library\n");
	  return(gnil);
	}

  is=ISCR-DECI;js=JSCR-DECJ;is2=is-DECI;js2=js-DECJ; 

  sig=gcmp(b,a); if(!sig) return gnil;
  av=avma;
  if(sig<0) {x=a;a=b;b=x;}

  for(i=1;i<=is2;i++) y[i]=cgetr(3);
  newvalue(ep,cgetr(prec)); x=(GEN)ep->value; 
/*printf("gaffect 1\n");*/
  gaffect(a,x);
  dx=gdivgs(gsub(b,a),is2-1);ysml=gzero;ybig=gzero;
  av2=avma;
  for(i=1;i<=is2;i++)
  {

/*printf("gaffect %d\n",i);*/
    gaffect(lisexpr(ch),y[i]);
    if(gcmp(y[i],ysml)<0) ysml=y[i];
    if(gcmp(y[i],ybig)>0) ybig=y[i];
    gaddz(x,dx,x);avma=av2;
  }
  diff=gsub(ybig,ysml);
  if(gcmp0(diff)) {ybig=gaddsg(1,ybig);diff=gun;}
  dyj=gdivsg(js2-1,diff);av2=avma;

  for(i = 1; i <= is2; i++)
  {
    ordonnee[i] = DECJ+itos(ground(gmul(gsub(ybig, y[i]),dyj)));
    avma=av2;
  }

  if(gsigne(ybig)*gsigne(ysml)<0) jz=
        DECJ + itos(ground(gmul(ybig,dyj)));

  if(gsigne(a)*gsigne(b)<0) iz=
	DECI + itos(ground(gmulsg(is2, gdiv(a, gsub(a, b)))));

  p1=cgetr(4); gaffect(ybig,p1); sprintf(c1," %9.3lf ",rtodbl(p1));
  p2=cgetr(4); gaffect(ysml,p2); sprintf(c2," %9.3lf ",rtodbl(p2));
  p3=cgetr(4); gaffect(a,p3); sprintf(c3," %9.3lf ",rtodbl(p3));
  p4=cgetr(4); gaffect(b,p4); sprintf(c4," %9.3lf ",rtodbl(p4));
/*printf("%s %s %s %s\n",c1,c2,c3,c4);*/


  s=OpenScreen(&myscreen1);
  myWindow.Screen=s;

  w=OpenWindow(&myWindow);
if(w==0 | s==0){printf("can not open window or screen\n");
	  if(w) CloseWindow(w);
	  if(s) CloseScreen(s);

	  avma = av;

	  killvalue(ep);
	  return gnil;
	}
  rp=w->RPort;
  SetDrMd(rp,JAM1);
  SetAPen(rp,1);
/******Draw the box and axes***/
  Move(rp,DECI,DECJ);Draw(rp,DECI,js);
  Move(rp,DECI,DECJ);Draw(rp,is,DECJ);
  Move(rp,is,DECJ);Draw(rp,is,js);
  Move(rp,DECI,js);Draw(rp,is,js);

  if(iz) {Move(rp,iz,js);Draw(rp,iz,DECJ);}

  if(jz) {Move(rp,is,jz);Draw(rp,DECI,jz);}

  Move(rp,-25,DECJ); Text(rp,c1,strlen(c1));
  Move(rp,-25,js); Text(rp,c2,strlen(c2));
  Move(rp,DECI-30,js+20); Text(rp,c3,strlen(c3));
  Move(rp,is2,js+20); Text(rp,c4,strlen(c4));
  Move(rp,DECI,ordonnee[1]);
  for (i = 1, h = 0; i <= is2; i++) Draw(rp,++h + DECI, ordonnee[i]);

	while(1)
	{
	        WaitPort(w->UserPort);
		msg=(struct IntuiMessage *)GetMsg(w->UserPort);
		if(msg->Class == CLOSEWINDOW) break;
	}

  CloseWindow(w);
  CloseScreen(s);

  avma = av;

  killvalue(ep);
  return gnil;
}

GEN  ploth2(ep,a,b,ch,prec)
     entree *ep;
     GEN a,b;
     char *ch;
     long prec;






{

struct IntuiMessage *msg;

struct TextAttr myfont =

{
	(STRPTR)"topaz.font", 8 , 0 , 0
};

struct NewScreen myscreen1 =
{
	0, 0,
	650, 420,
	2,
	1,2,
	HIRES | LACE,
	CUSTOMSCREEN,
	NULL,/*(struct TextAttr *)&myfont,*/
	(UBYTE *)"ploth2",
	NULL,
	NULL

};

struct NewWindow myWindow =

{	
	0,

	5,
	640,410,
	-1,
	-1,
	
	CLOSEWINDOW  | REFRESHWINDOW ,

	SMART_REFRESH | WINDOWCLOSE  | WINDOWDRAG,

	NULL,

	NULL,

	(UBYTE *)"PLOTH2",

	NULL,
	NULL,
	10, 10,

	640, 400,

	CUSTOMSCREEN

};

  long av,av2,k,k1,j,j1,i,sig,is,is2,js,js2;
  GEN p1,p2,p3,p4,ysml,ybig,xsml,xbig,diffx,diffy,dxj,t,dyj,dt,y[ISCR+1],x[ISCR+1];
  short h, iz=0, jz = 0;
  char c1[20], c2[20], c3[20], c4[20];

  struct Screen *s, *OpenScreen();
  struct Window *w, *OpenWindow();
  struct RastPort *rp;

  GfxBase=OpenLibrary("graphics.library",0);


  is=ISCR-DECI;js=JSCR-DECJ;is2=is-DECI;js2=js-DECJ; 

  sig=gcmp(b,a); if(!sig) return gnil;
  av=avma;
  if(sig<0) {p1=a;a=b;b=p1;}

  for(i=1;i<=is2;i++) {x[i]=cgetr(3);y[i]=cgetr(3);}
  newvalue(ep,cgetr(prec)); t=(GEN)ep->value; 
  gaffect(a,t);
  dt=gdivgs(gsub(b,a),is2-1);ysml=ybig=xsml=xbig=gzero;
  av2=avma;
  for(i=1;i<=is2;i++)
  {
    p1=lisexpr(ch);gaffect((GEN)p1[1],x[i]);gaffect((GEN)p1[2],y[i]);
    if(gcmp(y[i],ysml)<0) ysml=y[i];
    if(gcmp(y[i],ybig)>0) ybig=y[i];
    if(gcmp(x[i],xsml)<0) xsml=x[i];
    if(gcmp(x[i],xbig)>0) xbig=x[i];
    gaddz(t,dt,t);avma=av2;
  }
  diffy=gsub(ybig,ysml);
  if(gcmp0(diffy)) {ybig=gaddsg(1,ybig);diffy=gun;}
  diffx=gsub(xbig,xsml);
  if(gcmp0(diffx)) {xbig=gaddsg(1,xbig);diffx=gun;}
  dyj=gdivsg(js2-1,diffy);jz=js+itos(ground(gmul(ysml,dyj)));
  dxj=gdivsg(is2-1,diffx);iz=DECI-itos(ground(gmul(xsml,dxj)));

  if(gsigne(ybig)*gsigne(ysml)<0) jz=
        DECJ + itos(ground(gmul(ybig,dyj)));

  if(gsigne(xsml)*gsigne(ysml)<0) iz=
	DECI + itos(ground(gmulsg(is2, gdiv(a, gsub(a, b)))));
/****************
  for(i=1;i<=is2;i++)
  {
    ordonneey[i] = DECJ+itos(ground(gmul(gsub(ybig, y[i]),dyj)));
    ordonneey[i] = DECI+itos(ground(gmul(gsub(x[i], xsml),dxj)));

  av2=avma;

  }
****************/
  p1=cgetr(4); gaffect(ybig,p1); sprintf(c1," %9.3lf ",rtodbl(p1));
  p2=cgetr(4); gaffect(ysml,p2); sprintf(c2," %9.3lf ",rtodbl(p2));
  p3=cgetr(4); gaffect(xsml,p3); sprintf(c3," %9.3lf ",rtodbl(p3));
  p4=cgetr(4); gaffect(xbig,p4); sprintf(c4," %9.3lf ",rtodbl(p4));
/*printf("%s %s %s %s\n",c1,c2,c3,c4);*/


  s=OpenScreen(&myscreen1);
  myWindow.Screen=s;

  w=OpenWindow(&myWindow);
if(w==0){printf("can not open window\n");
	  CloseScreen(s);

	  avma = av;

	  killvalue(ep);
	  return gnil;
	}
  rp=w->RPort;
  SetDrMd(rp,JAM1);
  SetAPen(rp,1);

  Move(rp,DECI,DECJ);Draw(rp,DECI,js);
  Move(rp,DECI,DECJ);Draw(rp,is,DECJ);
  Move(rp,is,DECJ);Draw(rp,is,js);
  Move(rp,DECI,js);Draw(rp,is,js);

  if(iz) {Move(rp,iz,js);Draw(rp,iz,DECJ);}

  if(jz) {Move(rp,is,jz);Draw(rp,DECI,jz);}

  Move(rp,-25,DECJ); Text(rp,c1,strlen(c1));
  Move(rp,-25,js); Text(rp,c2,strlen(c2));
  Move(rp,DECI-30,js+20); Text(rp,c3,strlen(c3));
  Move(rp,is2,js+20); Text(rp,c4,strlen(c4));
/*  Move(rp,DECI,ordonnee[1]);*/
  for (i = 1, h = 0; i <= is2; i++)
  {


    k1= DECJ+itos(ground(gmul(gsub(ybig, y[i]),dyj)));
    j1= DECI+itos(ground(gmul(gsub(x[i], xsml),dxj)));
    if(i==1) {Move(rp,j1,k1);}
    else
    {
    	Draw(rp,j1, k1);
    }
  }

	while(1)
	{
	        WaitPort(w->UserPort);
		msg=(struct IntuiMessage *)GetMsg(w->UserPort);
		if(msg->Class == CLOSEWINDOW) break;		
	}

  CloseWindow(w);
  CloseScreen(s);

  avma = av;

  killvalue(ep);
  return gnil;
}


_abort()
{
err(interrupter);
}

GEN plothraw(listx,listy)
	GEN listx, listy;
{



struct IntuiMessage *msg;

struct TextAttr myfont =

{
	(STRPTR)"topaz.font", 8 , 0 , 0
};

struct NewScreen myscreen1 =
{
	0, 0,
	650, 420,
	2,
	1,2,
	HIRES | LACE,
	CUSTOMSCREEN,
	NULL,/*(struct TextAttr *)&myfont,*/
	(UBYTE *)"plothraw",
	NULL,
	NULL

};

struct NewWindow myWindow =

{	
	0,

	5,
	640,410,
	-1,
	-1,
	
	CLOSEWINDOW ,/* | REFRESHWINDOW ,*/

	SMART_REFRESH | WINDOWCLOSE  | WINDOWDRAG,



	NULL,

	NULL,

	(UBYTE *)"PLOTHRAW",

	NULL,
	NULL,
	10, 10,

	640, 400,

	CUSTOMSCREEN

};

  long av=avma,av2,i,lx,sig,is,is2,js,js2;
  SPoint *points;


  GEN p1,p2,p3,p4,xsml,xbig,ysml,ybig,dx,dy,scal,scaly;
  short h, iz=0, jz = 0, ordonnee[ISCR+1];
  char c1[20], c2[20], c3[20], c4[20];

  struct Screen *s, *OpenScreen();
  struct Window *w, *OpenWindow();
  struct RastPort *rp;

  GfxBase=OpenLibrary("graphics.library",0);
  if(!GfxBase )
	{ printf("can not open graphics.library\n");
	  return(gnil);
	}

  if((typ(listx)<17)||(typ(listx)>18)||(typ(listy)<17)||(typ(listy)>18))
    err(ploter4);
  lx=lg(listx);
  if(lg(listy)!=lx) err(ploter5);
  if(lx==1) return gnil;
  points = (SPoint*)malloc(lx*sizeof(SPoint));
  if(!points) err(ploter6);
  is=ISCR-IDEC-5;js=JSCR-JDEC-10;is2=is+IDEC;js2=js+JDEC;
  av=avma;xsml=xbig=(GEN)listx[1];ysml=ybig=(GEN)listy[1];
/************************
  is=ISCR-DECI;js=JSCR-DECJ;is2=is-DECI;js2=js-DECJ; 
***************************/

  for(i = 0; i < lx-1; i++)
    {
      p1=(GEN)listx[i+1];
      if(gcmp(p1,xsml)<0) xsml=p1;if(gcmp(p1,xbig)>0) xbig=p1;
      p1=(GEN)listy[i+1];
      if(gcmp(p1,ysml)<0) ysml=p1;if(gcmp(p1,ybig)>0) ybig=p1;
    }
  dx=gsub(xbig,xsml);dy=gsub(ybig,ysml);
  if(gcmp0(dx))
    {
      if(gcmp0(dy))
        {
          scal=gun;dx=gsubsg(is>>1,xsml);
          dy=gsubsg(js>>1,ysml);
        }
      else
        {
          scal=gdivsg(js,dy);
          dx=gneg(gmul(scal,xsml));dy=gneg(gmul(scal,ysml));
        }
    }
  else
    {
      scal=gdivsg(is,dx);
      if(!gcmp0(dy))
        {
          scaly=gdivsg(js,dy);if(gcmp(scaly,scal)<0) scal=scaly;
        }
  
      dx=gneg(gmul(scal,xsml));dy=gneg(gmul(scal,ybig));
    }
  for(i = 0; i < lx-1; i++)
    {
      av2=avma;
      points[i].x = IDEC + itos(ground(gadd(gmul((GEN)listx[i+1],scal),dx)));
      points[i].y = JDEC - itos(ground(gadd(gmul((GEN)listy[i+1],scal),dy)));
      avma=av2;
    }
/********************
  for(i=1;i<=is2;i++) y[i]=cgetr(3);
  newvalue(ep,cgetr(3)); x=(GEN)ep->value; 

  gaffect(a,x);
  dx=gdivgs(gsub(b,a),is2-1);ysml=gzero;ybig=gzero;
  av2=avma;
*****************************/

/*******************
  for(i=1;i<=is2;i++)
  {


    gaffect(lisexpr(ch),y[i]);
    if(gcmp(y[i],ysml)<0) ysml=y[i];
    if(gcmp(y[i],ybig)>0) ybig=y[i];
    gaddz(x,dx,x);avma=av2;
  }
  diff=gsub(ybig,ysml);
  if(gcmp0(diff)) {ybig=gaddsg(1,ybig);diff=gun;}
  dyj=gdivsg(js2-1,diff);av2=avma;

  for(i = 1; i <= is2; i++)
  {
    ordonnee[i] = DECJ+itos(ground(gmul(gsub(ybig, y[i]),dyj)));
    avma=av2;
  }

  if(gsigne(ybig)*gsigne(ysml)<0) jz=
        DECJ + itos(ground(gmul(ybig,dyj)));

  if(gsigne(a)*gsigne(b)<0) iz=
	DECI + itos(ground(gmulsg(is2, gdiv(a, gsub(a, b)))));

  p1=cgetr(4); gaffect(ybig,p1); sprintf(c1," %9.3lf ",rtodbl(p1));
  p2=cgetr(4); gaffect(ysml,p2); sprintf(c2," %9.3lf ",rtodbl(p2));
  p3=cgetr(4); gaffect(a,p3); sprintf(c3," %9.3lf ",rtodbl(p3));
  p4=cgetr(4); gaffect(b,p4); sprintf(c4," %9.3lf ",rtodbl(p4));
*************************************/


  s=OpenScreen(&myscreen1);
  myWindow.Screen=s;

  w=OpenWindow(&myWindow);
if(w==0 | s==0){printf("can not open window or screen\n");
	  if(w) CloseWindow(w);
	  if(s) CloseScreen(s);

	  avma = av;

	  free(points);
	  return gnil;
	}
  rp=w->RPort;
  SetDrMd(rp,JAM1);
  SetAPen(rp,1);
/******Draw the box and axes***/
  Move(rp,IDEC,JDEC);Draw(rp,IDEC,js2);
  Move(rp,IDEC,JDEC);Draw(rp,is2,JDEC);
  Move(rp,is2,JDEC);Draw(rp,is2,js2);
  Move(rp,IDEC,js2);Draw(rp,is2,js2);
/*************************
  if(iz) {Move(rp,iz,js);Draw(rp,iz,DECJ);}

  if(jz) {Move(rp,is,jz);Draw(rp,DECI,jz);}


  Move(rp,-25,DECJ); Text(rp,c1,strlen(c1));
  Move(rp,-25,js); Text(rp,c2,strlen(c2));
  Move(rp,DECI-30,js+20); Text(rp,c3,strlen(c3));
  Move(rp,is2,js+20); Text(rp,c4,strlen(c4));
  Move(rp,DECI,ordonnee[1]);
  for (i = 1, h = 0; i <= is2; i++) Draw(rp,++h + DECI, ordonnee[i]);
********************************/


  for(i = 0; i < lx-1;i++)
   WritePixel(rp,points[i].x,points[i].y);

/*  PolyDraw(rp,lx,points);*/
	while(1)
	{
	        WaitPort(w->UserPort);
		msg=(struct IntuiMessage *)GetMsg(w->UserPort);
		if(msg->Class == CLOSEWINDOW) break;
	}

  CloseWindow(w);
  CloseScreen(s);

  free(points);avma = av;
  return gnil;


}


GEN rectdraw(list)
	GEN list;
{
struct IntuiMessage *msg;

struct TextAttr myfont =

{
	(STRPTR)"topaz.font", 8 , 0 , 0
};

struct NewScreen myscreen1 =
{
	0, 0,
	650, 420,
	2,
	1,2,
	HIRES | LACE,
	CUSTOMSCREEN,
	NULL,/*(struct TextAttr *)&myfont,*/
	(UBYTE *)"draw",
	NULL,
	NULL

};

struct NewWindow myWindow =

{	
	0,

	5,
	640,410,
	-1,
	-1,
	
	CLOSEWINDOW ,/* | REFRESHWINDOW ,*/

	SMART_REFRESH | WINDOWCLOSE  | WINDOWDRAG | GIMMEZEROZERO,



	NULL,

	NULL,

	(UBYTE *)"DRAW",

	NULL,
	NULL,
	10, 10,

	640, 400,

	CUSTOMSCREEN

};

  long *e,*p1,*ptx,*pty,*numpoints,*numtexts,*xtexts,*ytexts;
  long n,i,j,x0,y0,av=avma;
  long a,b,c,d,nd[10],ne;
  char **texts;

  SPoint *points, **lines, *SLine;
  SSegment *segments;
  SRectangle *rectangles, SRec;


  struct Screen *s, *OpenScreen();
  struct Window *w, *OpenWindow();
  struct RastPort *rp;

  GfxBase=OpenLibrary("graphics.library",0);
  if(!GfxBase )
        { printf("can not open graphics.library\n");
          return(gnil);
        }


  if(typ(list)!=17) err(rploter3);
  n=lg(list)-1;if(n%3) err(rploter4);
  n=n/3;if(!n) return gnil;
  nd[0]=nd[1]=nd[2]=nd[3]=nd[4]=nd[5]=nd[6]=0;
  for(i=0;i<n;i++)
    {
      if(typ((GEN)list[3*i+1])!=1) err(rploter5);
      ne=itos((GEN)list[3*i+1]);if((ne<0)||(ne>15)) err(rploter2);
      e=rectgraph[ne];
      p1=(long*)e[0];while((long)p1)
        {
          if(p1[1]!=4) nd[p1[1]]++;
          else nd[1]+=p1[2];
          p1=(long*)p1[0];
        }
    }

  points=(SPoint*)malloc(nd[1]*sizeof(SPoint));
  segments=(SSegment*)malloc(nd[2]*sizeof(SSegment));
  rectangles=(SRectangle*)malloc(nd[3]*sizeof(SRectangle));
  lines=(SPoint**)malloc(nd[5]*sizeof(SPoint*));
  numpoints=(long*)malloc(nd[5]*sizeof(long));
  texts=(char**)malloc(nd[6]*sizeof(char*));
  numtexts=(long*)malloc(nd[6]*sizeof(long));
  xtexts=(long*)malloc(nd[6]*sizeof(long));
  ytexts=(long*)malloc(nd[6]*sizeof(long));
  nd[1]=nd[2]=nd[3]=nd[5]=nd[6]=0;

  for(i=0;i<n;i++)
    {
      e=rectgraph[itos((GEN) list[3*i+1])];x0=list[3*i+2];y0=list[3*i+3];
	
      if((typ((GEN)x0)!=1)||(typ((GEN)y0)!=1)) err(rploter5);
      x0=itos((GEN)x0);y0=itos((GEN)y0);
      p1=(long*)e[0];
      while((long)p1)
        {
          switch(p1[1])
            {
            case 1:
              points[nd[1]].x=p1[2]+x0;
              points[nd[1]].y=p1[3]+y0;
              nd[1]++;break;
            case 2:
              segments[nd[2]].x1=p1[2]+x0;
              segments[nd[2]].y1=p1[3]+y0;
              segments[nd[2]].x2=p1[4]+x0;
              segments[nd[2]].y2=p1[5]+y0;
              nd[2]++;break;
            case 3:
              a=rectangles[nd[3]].x=p1[2]+x0;
              b=rectangles[nd[3]].y=p1[3]+y0;
              rectangles[nd[3]].width=p1[4]+x0-a;
              rectangles[nd[3]].height=p1[5]+y0-b;
              nd[3]++;break;
            case 4:
              ptx=(long*)p1[3];pty=(long*)p1[4];
              for(j=0;j<p1[2];j++)
                {
                  points[nd[1]+j].x=ptx[j]+x0;
                  points[nd[1]+j].y=pty[j]+y0;
                }
              nd[1]+=p1[2];break;
            case 5:
              ptx=(long*)p1[3];pty=(long*)p1[4];
              numpoints[nd[5]]=p1[2];
              lines[nd[5]]=(SPoint*)malloc(p1[2]*sizeof(SPoint));
              for(j=0;j<p1[2];j++)
                {
                  lines[nd[5]][j].x=ptx[j]+x0;
                  lines[nd[5]][j].y=pty[j]+y0;
                }
              nd[5]++;break;
            case 6:
              texts[nd[6]]=(char*)p1[3];numtexts[nd[6]]=p1[2];
              xtexts[nd[6]]=p1[4]+x0;ytexts[nd[6]]=p1[5]+y0;
              nd[6]++;break;
            default: break;
            }
          p1=(long*)p1[0];
        }
    }

  s=OpenScreen(&myscreen1);
  myWindow.Screen=s;

  w=OpenWindow(&myWindow);
if(w==0 | s==0){printf("can not open window or screen\n");
	  if(w) CloseWindow(w);
	  if(s) CloseScreen(s);

	  avma = av;


	  free(points);free(segments);free(rectangles);
	  free(numpoints);for(i=0;i<nd[5];i++) free(lines[i]);
	  free(lines);free(texts);free(numtexts);free(xtexts);free(ytexts);
	  return gnil;
	}
  rp=w->RPort;
  SetDrMd(rp,JAM1);
  SetAPen(rp,1);
  for(i=0;i<nd[1];i++) WritePixel(rp,points[i].x,points[i].y);
  for(i=0;i<nd[2];i++) {Move(rp,segments[i].x1,segments[i].y1);
		       Draw(rp,segments[i].x2,segments[i].y2);}
  for(i=0;i<nd[3];i++)
    {
      SRec=rectangles[i];a=SRec.x;b=SRec.y;c=a+SRec.width;
      d=b+SRec.height;
/*printf("%d %d %d %d\n",a,b,c,d);     */
	Move(rp,a,b);
	Draw(rp,c,b);Draw(rp,c,d);Draw(rp,a,d);Draw(rp,a,b);
    }
  for(i=0;i<nd[5];i++)
    {
      SLine=lines[i];
      Move(rp,SLine[0].x,SLine[0].y);
      for(j=1;j<numpoints[i];j++)
        Draw(rp,SLine[j].x,SLine[j].y);
    }
  for(i=0;i<nd[6];i++)
      {	Move(rp,xtexts[i],ytexts[i]);      
     	Text(rp,texts[i],strlen(texts[i]));
      }

	while(1)
	{
	        WaitPort(w->UserPort);
		msg=(struct IntuiMessage *)GetMsg(w->UserPort);
		if(msg->Class == CLOSEWINDOW) break;
	}

  CloseWindow(w);
  CloseScreen(s);
  free(points);free(segments);free(rectangles);
  free(numpoints);for(i=0;i<nd[5];i++) free(lines[i]);
  free(lines);free(texts);free(numtexts);free(xtexts);free(ytexts);
  avma = av;return gnil;

}
