/* include file to provide graphics */
/* functions supported:
   tekopen();
   vectoa(x,y) int x,y;
   posita(x,y) int x,y;
   dperas();
   gfxfont(number,size) int number,size;
   gfxtext(s,a) char s[]; float a;
   textlen(s) char s[];
   getxy(x,y) int *x,*y;
   gfxflush();
   textparam(sx,sy,tx,ty,w,namw) int sx,sy,tx,ty,w; char *name;
   rmtek();
   setcolour(n) int n;
*/
#ifdef AMIGA
#define TEKPIPENAME0 "PIPE:tek0"
#define TEKPIPENAME1 "PIPE:tek1"
#define TEKPIPENAME2 "PIPE:tek2"
#define TEKPIPENAME3 "PIPE:tek3"
#define TMPGCURSOR   "t:gcursor"
#define ASHBDRY      "t:ashbdry" 
#endif
#ifdef UNIX
#define TEKPIPENAME0 "/dev/tek.pipe"
#define TEKPIPENAME1 "/dev/tek.pipe1"
#define TEKPIPENAME2 "/dev/tek.pipe2"
#define TEKPIPENAME3 "/dev/tek.pipe3"
#define TMPGCURSOR   "/tmp/gcursor"
#define ASHBDRY      "/tmp/ashbdry"
#endif

#define _TEKXMAX 1024
#define _TEKYMAX 780

#ifndef _SPECHDR
#include <auxcfg.h>
#include <spec.h>
#endif

int  _tek4014,
     _tek4014_flg = 0,
     _gfxbufp = 0,
     _gfxfontnr=1,
     _gfxfontsz=1;

unsigned char _gfxbuf[8192];
    

tekopen()
{
char c,s[80],z[80],str[80];
int i,n,m;

   strcpy(s,"gfx");
   c=_tekpipe+48;
   z[0]=c; z[1]=0;
   strcat(s,z);
   _tek4014=auxopen(s); /* _tekpipe is defined in spec.h */
   if(_tek4014 <= 0) {
      strcpy(str,"(xterm -t -T OUTPUT %400x400+0+0 -e $LISEPRG/tekdaemon -p ");
      strcat(str,z); strcat(str,")&");
      system(str);
      n = 0;
      while(n < 60) {
         sleep(1);
         _tek4014=auxopen(s); /* _tekpipe is defined in spec.h */
         if(_tek4014 > 0) break;
      }
   }
   if(_tek4014 <= 0) {
      fprintf(stderr,"failed to open graphic pipe\n");
   }
   return(_tek4014);
}

gfxflush()
{
int  n;

   write(_tek4014,_gfxbuf,_gfxbufp);
   _gfxbufp=0;
}

gfxbufin(n)
int n;
{
_gfxbuf[_gfxbufp++]=n;
if(_gfxbufp>8190) gfxflush();
}

cvtxy(xx,yy)
int xx,yy;
{
int n,m,i,h,l,x,y;
char ch,cl;

   switch(_win_flg){
   case 0:
      x=xx ; y=yy; break;
   case 1:
      x=xx ; y=yy/2; break;
   case 2:
      x=xx ; y=yy/2 + (_TEKYMAX/2); break;
   case 3:
      x=xx/2 ; y=yy/2 + (_TEKYMAX/2); break;
   case 4:
      x=xx/2 + (_TEKXMAX/2) ; y=yy/2 + (_TEKYMAX/2); break;
   case 5:
      x=xx/2 ; y=yy/2; break;
   case 6:
      x=xx/2 + (_TEKXMAX/2) ; y=yy/2; break;
   }
   h=y >> 5; l=y & 31;
   gfxbufin(h | 32); gfxbufin(l | 96);
   h=x >> 5; l=x & 31;
   gfxbufin(h | 32); gfxbufin(l | 64);
}

posita(x,y)
int x,y;
{
   int  n,m;

   gfxbufin(0x1d);
   cvtxy(x,y);
}

vectoa(x,y)
int x,y;
{
   int  n,m;

   cvtxy(x,y);
}

dperas()
{
   gfxbufin(0x1b);
   gfxbufin(0x0c);
   gfxflush();
}

getxy(x,y)
int *x,*y;
{
   int n,i,fp;
   char s[8];

   n=0;
   unlink(TMPGCURSOR);
   gfxbufin(0x1b);
   gfxbufin(0x1a);
   gfxflush();
   fp=0;
   while(fp<1) {
      sleep(1);
      fp=open(TMPGCURSOR,0);
   }
   i=read(fp,s,5);
   close(fp);
   *x=(s[0] & 31)*32+(s[1] & 31);
   *y=(s[2] & 31)*32+(s[3] & 31);
}

gfxtext(s,a)
char s[];
float a;
{
int n;
char z[256];

gfxflush();
if(_win_flg==0) {
   strcpy(z,"\x1b9"); /* normal text size */
} else {
   strcpy(z,"\x1b;"); /* small text size */
}
strcat(z,s);
gfxbufin(0x1f);
for(n=0;n<strlen(z);n++) gfxbufin(z[n]);
gfxflush();
}


setcolour(n)
int n;
{
;
}

rmtek()
{
dperas();
gfxbufin(0x1b);
gfxbufin(0x40);
gfxflush();
}


textparam(sx,sy,tx,ty,w,name)
int sx,sy,tx,ty,w;
char name[];
{
int i,n;
char c,s[80];

gfxflush();
sprintf(s,"0 %d %d %d %d %d %s",sx,sy,tx,ty,w,name); /* 0 signal textparam */
gfxbufin(0x1b) ; /* ESC */
gfxbufin(0x1b) ; /* second escape read special functions */
i=0; c=1;
while(c!=0) {    /* special sequence is finished when 0 is reached */
   c=s[i++];
   gfxbufin(c);
}
gfxflush();
}

hco(str)
char str[];
{
int i,n;
char c,s[80];

gfxflush();
sprintf(s,"1 %s",str); /* 1 signal hardcopy */
gfxbufin(0x1b) ; /* ESC */
gfxbufin(0x1b) ; /* second escape read special functions */
i=0; c=1;
while(c!=0) {    /* special sequence is finished when 0 is reached */
   c=s[i++];
   gfxbufin(c);
}
gfxflush();
}




textlen(s)
char s[];
{
int n;

n= 8*_gfxfontsz*strlen(s);
return(n);
}

gfxfont(number,size)
int number,size;
{
_gfxfontnr=number;
_gfxfontsz=size;
}
