{
  File:   graphlib.pas
  Synopsis: Provides various graphics functions in turbo pascal 3.
  Author: GPL(C) Mohsin Ahmed
  Date:   10/86, 11/20/86
}
{------------------------------------------------------------------}
{ ---procedure settextport(c1,l1,c2,l2:integer);-------------------}
{ ---procedure gettextport(var c1,l1,c2,l2:integer);---------------}
{ ---procedure usetextport;----------------------------------------}
{ ---procedure setwindow(newu1,newv1,newu2,newv2:real);------------}
{ ---procedure getwindow(var oldu1,oldv1,oldu2,oldv2 :real);-------}
{ ---procedure setviewport(newc1,newl1,newc2,newl2:integer);-------}
{ ---procedure getviewport(var oldc1,oldl1,oldc2,oldl2:integer);---}
{ ---procedure useviewport;----------------------------------------}
{ ---procedure viewtransform( u,v:real; var i,j:integer);----------}
{ ---procedure drawline(ubegin,vbegin,uend,vend:real;--------------}
{ ----------------------------------------- linecolor:integer);----}
{ ---procedure drawtext(ubegin,vbegin:real; item:string80);--------}
{ ---procedure drawcircle(u,v,r: real;   linecolor : integer);-----}
{ ---procedure rectangle(ua,va,ub,vb:real;   linecolor:integer);---}
{ -----------------------------------------------------------------}
    type string80      =  string[80];

    var   u1, v1, u2, v2    :  real;        { window               }
          i1, j1, i2, j2,
          c1, l1, c2, l2,                   { active viewport      }
          dc1,dl1,dc2,dl2   :  integer;     { active dialogue port }
          activeport        :  (dialog,pictur);

{------------------------------------------------------------------}
procedure settextport(c1,l1,c2,l2:integer);
          begin
          dc1:=c1;   dl1:=l1;
          dc2:=c2;   dl2:=l2
          end;
{------------------------------------------------------------------}
procedure gettextport(var c1,l1,c2,l2:integer);
          begin
          c1:=dc1;   l1:=dl1;
          c2:=dc2;   l2:=dl2;
          end;
{------------------------------------------------------------------}
procedure usetextport;
          begin
          window(dc1,dl1,dc2,dl2);
          end;
{------------------------------------------------------------------}
procedure setwindow(newu1,newv1,newu2,newv2:real);
     begin
     if (newu1<newu2) and (newv1<newv2) then
          begin
          u1:=newu1; v1:=newv1;
          u2:=newu2; v2:=newv2;
          end;
     end;
{------------------------------------------------------------------}
procedure getwindow(var oldu1,oldv1,oldu2,oldv2 :real);
     begin
     oldu1:=u1;   oldv1:=v1;
     oldu2:=u2;   oldv2:=v2;
     end;
{------------------------------------------------------------------}
procedure setviewport(newc1,newl1,newc2,newl2:integer);
     begin
     if ( (newc1+1) < newc2 ) and ((newl1+1) < newl2 ) and (newc2 <= 80) and
        (newc1 >= 1) and (newl2 <= 25) and (newl1 >= 1)    then
          begin
          c1:=newc1;    l1:=newl1;    c2:=newc2;      l2:=newl2;
          end;
     end;
{------------------------------------------------------------------}
procedure useviewport;
     begin
          i1:=8*(c1-1);                  j1:=8*(l1-1);
          i2:=8*c2-1;                    j2:=8*l2-1;
          graphwindow(i1,j1,i2,j2);
          i2:=i2-i1;                     j2:=j2-j1;
          i1:=0;                         j1:=0;
                     { Now, coordinates are relative to new origin }
                                        { Draw Outline of Window.  }
          draw(0,0,0,j2,white);          draw(0,j2,i2,j2,white);
          draw(i2,j2,i2,0,white);        draw(i2,0,0,0,white)
     end;
{------------------------------------------------------------------}
procedure getviewport(var oldc1,oldl1,oldc2,oldl2:integer);
     begin
     oldc1:=c1; oldl1:=l1;
     oldc2:=c2; oldl2:=l2;
     end;
{------------------------------------------------------------------}
procedure viewtransform( u,v:real; var i,j:integer);
                          { transform coorinates from u,v to i,j   }
     begin
     i:=i1+trunc((i2-i1)*(u-u1)/(u2-u1));
     j:=j2-trunc((j2-j1)*(v-v1)/(v2-v1));
     end;
{------------------------------------------------------------------}
procedure drawline(ubegin,vbegin,uend,vend:real; linecolor:integer);
                             { draw a line from (u1,v1) to (u2,v2) }
           var i,j,k,l   :   integer;
     begin
     viewtransform(ubegin,vbegin,i,j);
     viewtransform(uend,vend,k,l);
     draw(i,j,k,l,linecolor);
     end;
{------------------------------------------------------------------}
procedure drawtext(ubegin,vbegin:real; item:string80);
                                  { write item at (ubegin,vbegin)  }
           var c,l,i,j:integer;
     begin
     window(c1,l1,c2,l2);
     viewtransform(ubegin,vbegin,i,j);
     c:=round(i/8.0)+1;
     l:=round(j/8.0)+1;
     gotoxy(c,l);
     write(item);
     end;
{------------------------------------------------------------------}
procedure drawcircle(u,v,r: real;   linecolor : integer);
      { draw a circle with centre (u,v) and radius on u axis is r  }
       var x1, x2, y1, y2, t, ecentric :  real;
     begin
     x1:= u + r ;
     ecentric:=1.5*(v2-v1)/(u2-u1) ;
                       { ecentric preserves the shape of the circle }
     y1:= v*ecentric ;
     t:= pi/8;
     repeat
           x2:=u + r * cos(t);   y2:=(v + r * sin(t)) * ecentric;
           drawline(x1,y1,x2,y2,linecolor);
           x1:=x2;   y1:=y2;
           t:=t + pi/8;
           until t >= 2*pi;
     end;
{------------------------------------------------------------------}
procedure rectangle(ua,va,ub,vb:real;   linecolor:integer);
          { Draws a rectangle with (ua,va) and (ub,vb) as diagonal }
     begin
     drawline(ua,va,ub,va,linecolor);
     drawline(ub,va,ub,vb,linecolor);
     drawline(ub,vb,ua,vb,linecolor);
     drawline(ua,vb,ua,va,linecolor);
     end;
{------------------------------------------------------------------}


