DataMuseum.dk

Presents historical artifacts from the history of:

Christian Rovsing CR7, CR8 & CR16 CP/M

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Christian Rovsing CR7, CR8 & CR16 CP/M

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦80e0b0359⟧ TextFile

    Length: 56832 (0xde00)
    Types: TextFile
    Names: »DDHP747X.C«

Derivation

└─⟦369075929⟧ Bits:30004202 GSX driver sourcer disk 1
    └─ ⟦this⟧ »DDHP747X.C« 

TextFile

/* hist */
/* 3	6	84	changed color index mapping so index 1 is pen 1 */	
#include "ratdef.h";
#define MAXxHPxBUFFER  80
#define MOVE  1
#define DRAW  2
#define YES  1
#define NO  0
#define UNSUCCESSFUL  0
				/* Unsuccessful GIN operation    */
#define SUCCESSFUL  1
				/* Unsuccessful GIN operation    */
#define DEFAULT  1
				/* Default GIN device number     */
#define PLOTTER  6
				/* Plotter device number for GIN */
int max0(), min0();
unsigned int wxmin, wymin, wxmax, wymax;
int x_fetch(), y_fetch();

DD747X (paraseg,paraoff)
int paraoff,paraseg;
 
æ
/************************************************************************
*                                                                      *
*     Function: Device Driver for Hewlett Packard 747x pen plotter     *
*                                                                      *
*     Input Parameters:                                                *
*            paraseg - parameter segment                               *
*            paraoff - parameter offset                                *
*                                                                      *
*     Output Parameters:                                               *
*            none                                                      *
*								       *
*     Routines Called:                                                 *
*             Dbufhp - buffered output for HP plotter                  *
*             Gznfpl - prompt the user for a new sheet of paper        *
*             Dr747x - move/draw for HP plotter                        *
*             Dp747x - Change pens on the HP 747x plotter              *
*             Dt747x - Set text size on HP 747x plotter                *
*             Gitoch  - convert integer to characters                  *
*             Gchtoi  - convert character string to integer            *
*             Gimnmx - Function to place integer value in a range      *
*                                                                      *
************************************************************************/
 
#include "ddcom.h"
int     opcode;
int     i, i2, j, gimnmx(), ierror, ival, istop,
	tries,
	ginok, icnvtÆ6Å, ibufÆ50Å;
unsigned int xyÆ2Å, savexyÆ2Å;
int     temp, gitoch(), length;
unsigned int x1, y1, x2, y2;
unsigned int hlfsiz, fulsiz;
 
extern int     pensÆ9Å, clrredÆ9Å, clrgrnÆ9Å, clrbluÆ9Å;

/*           Start arc definition /PD;AA/  */
static int arcstartÆÅ = æBIGP, BIGD, SEMICOL, BIGA, BIGAå;

/*           End arc definition /,5;/   */
static int arcendÆÅ = æCOMMA, DIG7, SEMICOLå;

/*           Set up for solid fill /FT1;PT;/  */
static int solfillÆÅ = æBIGF,BIGT,DIG1,SEMICOL,BIGP,BIGT,SEMICOLå;

/*           Set up for hatching /FT3,90,   ;/  */
static int hatfillÆÅ = æBIGF,BIGT,DIG3,COMMA,DIG9,DIG0,COMMA,0,0,0,SEMICOLå;

/*           Wedge command /WG/  */
static int wedgeÆÅ = æBIGW,BIGGå;
 
/*           Eedge wedge command /EW/  */
static int edgewedgeÆÅ = æBIGE,BIGWå;
 
/*           Set label(text) font  /CS<font>SS;;/  */
static int setfntÆ8Å = æBIGC, BIGS, DIG0, DIG0, SEMICOL, BIGS, BIGS, SEMICOLå;
 
/*           Set rotation /DI/    */
static int rotateÆ2Å =æBIGD, BIGIå;

/*           Text output set up /LB/  */
static int txtoutÆ2Å = æBIGL, BIGBå;
 
/*           Marker size, output /SM<0>;/  */
static int mrkoutÆ4Å = æBIGS, BIGM, DIG0, SEMICOLå;
 
/*           Set line style to solid /LT;/ */
static int solidÆ3Å =æBIGL, BIGT, SEMICOLå;

/*           Line style /LT<0>,2;/ */
static int lstyleÆ6Å =æBIGL, BIGT, DIG0, COMMA, DIG2, SEMICOLå;

/*           Set up -
 		Turn plotter on  <ESC>.(
 		Set handshake mode 2        <ESC>.I81;5;6:
                Initialize the plotter:      DF;
								*/
/*
static int setupÆÅ = æBIGI,BIGN,SEMICOL,ESC, PERIOD, LPAREN, ESC, PERIOD, BIGR,
             ESC,PERIOD,BIGI,DIG8,DIG1,SEMICOL,DIG5,SEMICOL,DIG6,COLON,ENQ å;
 
static int setup2ÆÅ = æBIGD,BIGF,SEMICOL,BIGD,BIGI,DIG0,COMMA,MINUS,DIG1,SEMICOL,
             ESC,PERIOD,ATSIGN,SEMICOL,DIG0,DIG0,COLON,ESC,PERIOD,BIGM,DIG1,
             DIG0,COLON,ESC,PERIOD,BIGN,DIG1,DIG0,COLON å;
*/
static int setupÆÅ = æBIGI,BIGN,SEMICOLå;
 
static int setup2ÆÅ = æBIGD,BIGF,SEMICOL,BIGD,BIGI,DIG0,COMMA,MINUS,DIG1,SEMICOL,
                       å;

/*           Stop graphics - /<ESC>.)/   */
static int stopgrÆ3Å = æESC, PERIOD, RPARENå;
 
static int mrktblÆ5Å = æPERIOD, PLUS, STAR, BIGO, BIGXå;
 
static int goginÆ4Å = æBIGD, BIGP, SEMICOL, NEWLINEå;
 
static int inqstaÆ4Å = æBIGO, BIGS, SEMICOL, NEWLINEå;
 
static int getginÆ4Å = æBIGO, BIGD, SEMICOL, NEWLINEå;
 
static int comma = COMMA;
 
static int endtxt = ETX;
 
static int semcol = SEMICOL;

static int homeÆ2Å = æ0, 0å;

static int idleÆÅ  = æBIGS,BIGP,DIG0,SEMICOLå;
 
static int iniinoÆ45Å = æ	/* initial intout array for open workstation*/
   0,0,
   METERS,         /* Device coordinates are meters     */
   25,             /* Step size in micrometers on x axis       */
   25,             /* Step size in micrometers on y axis       */
   0,              /* Number of character heights (continuous) */
   7,              /* Number of line types                     */
   1,              /* Number of line widths                    */
   5,              /* Number of marker types                   */
   0,              /* Number of marker sizes (continuous)      */
   5,              /* Number of text fonts                     */
   0,              /* Number of patterns                       */
   6,              /* Number of hatch styles                   */
   6,              /* Number of predefined colors              */
   1,              /* Number of GDPs                           */
   1,-1,-1,-1,-1,  /* GDPs, except BARS,  do not exist         */
   -1,-1,-1,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,
   1,              /* Device is capable of color               */
   1,              /* Device is capable of text rotation       */
   1,              /* Device is capable of filled area         */
   0,              /* Device is not capable of pixel operations*/
   0,              /* Number of colors available (continuous   */
			       /* pen colors)                  */
   1,              /* Number of locator devices available      */
   0,              /* Number of valuator devices available     */
   0,              /* Number of choice devices available       */
   0,              /* Number of string devices available       */
   2å;             /* Workstation type (input/output)          */

static int iniptoÆ12Å = æ	   /* initial ptsout array for open workstation */
   0,
   60,             /* Minimum character height in DC space      */
			       /* .15cm = 60 steps              */
   0,
   0,
   1,              /* Minimum line width in DC space            */
   0,
   1,              /* Maximum line width in DC space            */
   0,
   0,
   80,             /* Minimum marker height in DC space         */
			       /* .20cm = 80 steps              */
   0,
   0å;

static getwindwÆÅ = æBIGO, BIGP, SEMICOLå;  /* Get window command OW; */
static getidÆÅ = æBIGO, BIGI, SEMICOLå; /* Get plotter ID (7470 or 7475) */

extern int conoff, iinoff, pinoff, ioutoff, poutoff, LFETCH();
extern int conseg, iinseg, pinseg, ioutseg, poutseg;

conoff=LFETCH(paraseg,paraoff,0); conseg=LFETCH(paraseg,paraoff,1);
iinoff=LFETCH(paraseg,paraoff,2); iinseg=LFETCH(paraseg,paraoff,3);
pinoff=LFETCH(paraseg,paraoff,4); pinseg=LFETCH(paraseg,paraoff,5);
ioutoff=LFETCH(paraseg,paraoff,6); ioutseg=LFETCH(paraseg,paraoff,7);
poutoff=LFETCH(paraseg,paraoff,8); poutseg=LFETCH(paraseg,paraoff,9);
 
opcode=LFETCH(conseg,conoff,OPCODE);
LSTORE(conseg,conoff,2,0);                 /*Assume no vertices are being passed back*/

/* opcode open workstation */

switch (opcode) æ

 case OPENxWORKSTATION:
   LSTORE(conseg,conoff,2,6);             /* Set to number of output vertices */
   LSTORE(conseg,conoff,4,45);            /* Length of array intout           */

   /* set up output capability array */
   for (i=0;i<45;++i) LSTORE(ioutseg,ioutoff,i,iniinoÆiÅ);

   for (i=0;i<12;++i) LSTORE(poutseg,poutoff,i,iniptoÆiÅ);

   ndlntp = max0 (LFETCH(iinseg,iinoff,1)-1, 0);   /*Set current device line style*/
   if (ndlntp > 6) ndlntp = 0; ndlntp = ndlntp + DIG0;
   ndclrl = max0 (LFETCH(iinseg,iinoff,2), 1);          /*Set current polyline color index*/
   ndmktp = LFETCH(iinseg,iinoff,3);                    /*Set current marker type*/
   if (ndmktp < 1 ø ndmktp > 5) ndmktp=3;
   ndclrm = max0 (LFETCH(iinseg,iinoff,4), 1);          /*Set current polymarker color index*/
                                                        /*Set current text font*/
   ndclrt = max0 (LFETCH(iinseg,iinoff,6), 1);          /*Set current text color index*/
   ndclrf = max0 (LFETCH(iinseg,iinoff,9), 1);           /*Set current fill area color index*/
   ndstyf = max0 (LFETCH(iinseg,iinoff,8), 1);           /*Set current fill style index*/
   if (ndstyf > 6)ndstyf = 1;
   ndistyf = max0 (LFETCH(iinseg,iinoff,7),0);          /*Set current fill interior style*/
   if (ndistyf > 3)ndistyf = 0;
   ndmkht = 20;                          /*Set default marker height .2cm*/
   ndtxsz = 15;                          /*Set default character width .15 cm*/
   ndtysz = 15;                          /*Set default character height .15cm*/
   ndtxrt = 0;                           /*Set default rotation to 0 degrees*/

   ndclrp = -1;                          /*Set current device color */
 
   /*initialize plotter */

   ndotkt = 0;               /*Initialize the plotter ouput counter. This  */
                             /*   counter is used by the routine 'dbufhp'  */
   outstr (3, setup);       /*Must use outstr because block mode is set   */
                             /*in initialization sequence.                 */
/*   RDRIN(&i); */
   dbufhp (10, setup2);
   if (ndlntp == DIG0)       /*Set line type to initial value              */
      dbufhp (3, solid);     /*Solid                                       */
   else æ                    /*Dashed                                      */
      lstyleÆ2Å = ndlntp;
      dbufhp (6, lstyle);
      å

   dt747x (ndtxsz, ndtysz);  /*Set initial text size */

   dbufhp (-1,setup);
   dbufhp (3, getwindw);	/*Get the current window size*/
   instr (50,ibuf,&i);
   for (i=0;(i<50)&&((ibufÆiÅ<DIG0 øø ibufÆiÅ>DIG9));++i);
   gchtoi (ibuf,i,&wxmin,&i); 
   gchtoi (ibuf,i+1,&wymin,&i); 
   gchtoi (ibuf,i+1,&wxmax,&i); 
   gchtoi (ibuf,i+1,&wymax,&i);
   LSTORE (ioutseg,ioutoff,1,wxmax-wxmin);
   LSTORE (ioutseg,ioutoff,0,wymax-wymin);
   iniptoÆ3Å = iniptoÆ11Å = (wxmax-wxmin)/2;
   LSTORE (poutseg,poutoff,3,iniptoÆ3Å);
   LSTORE (poutseg,poutoff,11,iniptoÆ3Å);
   
   dbufhp (3, getid);       /* Get the plotter id */
   instr (30,ibuf,&i);
   gchtoi (ibuf,0,&temp,&i);
   nmbrpens = (temp==7440) ? 8 : 2;
   nmbrfonts = (temp==7440) ? 19 : 5;
   i = gimnmx (LFETCH(iinseg,iinoff,5), 1, nmbrfonts) - 1;
   if (i>4) i=i+1;
   if (i>9) i=i+20;
   setfntÆ2Å = i/10 + DIG0;
   setfntÆ3Å = (i%10) + DIG0;
   dbufhp (8, setfnt);           /*Output command        */

   LSTORE (ioutseg,ioutoff,13,nmbrpens);
   LSTORE (ioutseg,ioutoff,10,nmbrfonts);

   for (i=0; i<=nmbrpens; ++i) pensÆiÅ = i; /*Station 1 holds index 1 */
 
   clrredÆ0Å = 0;                        /*Define color index 0 to black */
   clrgrnÆ0Å = 0;
   clrbluÆ0Å = 0;
   for (i=1;i<nmbrpens;++i) æ
      clrredÆiÅ = 1000;                        /*Define color index 1 to white */
      clrgrnÆiÅ = 1000;
      clrbluÆiÅ = 1000;
      å

   if (nmbrpens==8) æ                /*Declare GDP's for 7475 */
      LSTORE(ioutseg,ioutoff,14,4);
      for (i=1;i<5;++i) æ
         LSTORE(ioutseg,ioutoff,i+14,i);
         LSTORE(ioutseg,ioutoff,i+24,3);
     å
     LSTORE(ioutseg,ioutoff,26,0);
   å

   break;


/* opcode close workstation  */

  case CLOSExWORKSTATION:
   dr747x (MOVE, home);
   dbufhp(4,idle);
   break;


/* opcode clear workstation  */

  case CLEARxWORKSTATION:
   dr747x (MOVE, home);  /*Home the plotter  */
   dbufhp (-1, semcol);  /*Dump buffer       */
   gznfpl();             /*prompt user for new paper (new frame on plotter) */
   ndclrp = -1;          /*Force plotter to pick up pen again */
   break;
 

/* opcode update workstation  */

  case UPDATExWORKSTATION:
   dbufhp (-1, semcol);
   break;


/* opcode escape  */

  case ESCAPE:
   if (LFETCH(conseg,conoff,5) == INQxADDRESSABLExCELLS) æ
     LSTORE(ioutseg,ioutoff,0,-1);
     LSTORE(ioutseg,ioutoff,1,-1);
     å
   break;


/* opcode polyline  */

  case POLYLINE:
   dp747x (ndclrl);                         /*Change color to line color  */
   xyÆ0Å=x_fetch(0);
   xyÆ1Å=y_fetch(0);
   dr747x (MOVE, xy);                 /*Move to first point         */
   j = 2;
   for (i=2; i<=LFETCH(conseg,conoff,1); ++i) æ/*Draw between subsequent pts */
      xyÆ0Å=x_fetch(j);
      xyÆ1Å=y_fetch(j);
      dr747x (DRAW, xy);
      j += 2;
      å
   j -= 2;
   xyÆ0Å=x_fetch(j);
   xyÆ1Å=y_fetch(j);
   dr747x (MOVE, xy);   /*Move to pick up the pen */
   break;
 

/* opcode polymarker  */

  case POLYMARKER:
   dp747x (ndclrm);                /*Change color if necessary    */
   xyÆ0Å=x_fetch(0);
   xyÆ1Å=y_fetch(0);
   dr747x (MOVE, xy);        /*Move to center point         */
 
   dt747x (ndmkht, ndmkht);        /*set marker size              */
   mrkoutÆ2Å = mrktblÆndmktp-1Å;   /*Get proper marker from table */
   dbufhp (4, mrkout);             /*Enter marker mode            */

   /* Set sizes used for marker clipping */
   fulsiz = ndmkht * 4;          /*4 steps per .01 cm  */
   hlfsiz = ndmkht * 2;

   j = 0;
   for (i=1; i<=LFETCH(conseg,conoff,1); ++i) æ/*Output marker at each point  */

      xyÆ0Å = x_fetch(j);
      xyÆ1Å = y_fetch(j);

      /*Clip marker to device limits                                          */
      /*Marker height is stored in .01 cm units. Since there are 4 plotter    */
      /*steps per .01 cm, multiply by 4 to get plotter coords                 */

      x1 = xyÆ0Å - hlfsiz;
      x2 = x1 + fulsiz;
      y1 = xyÆ1Å - hlfsiz;
      y2 = y1 + fulsiz;
      if ((min0(x1,y1) >= 0) && (x2 <= wxmax) && /* watch out for portrait mode changes*/
	 (y2 <= wymax))             /*Marker fits on device */
           dr747x (MOVE, xy); /*Move to center point and display */
      j += 2;                              /*Increment ptr to coords  */
      å
 
   mrkoutÆ2Å = SEMICOL;
   dbufhp (3,mrkout);              /*Exit marker mode  */

   /*restore the user's text size */
   dt747x (ndtxsz, ndtysz);
   break;
 

/* opcode text  */

  case TEXT:
   dp747x (ndclrt);           /*Change color to text color  */
   xyÆ0Å=x_fetch(0);
   xyÆ1Å=y_fetch(0);
   dr747x (MOVE, xy);   /*Move to start point   */

   j = LFETCH(conseg,conoff,INTEGERxINxLENGTH);/*Get the string length  */
   dbufhp (-1, &endtxt);       /*Force the buffer to be cleared */
   dbufhp (2, txtout);        /*Text command  */
   for (i = 0; i < j; ++i) æ  /*Loop to keep buffer from overflowing*/
       xyÆ0Å=LFETCH(iinseg,iinoff,i);
       dbufhp (1, xy);
       å
   dbufhp (1, &endtxt);        /*terminate string  */
   break;
 

/* opcode fill area */

  case FILLxAREA:
   dp747x (ndclrf);                      /*Change color to fill color  */
   gsxfill (ndistyf, ndstyf, ndlntp, LFETCH(conseg,conoff,1));
   break;


/* opcode cell array */

  case CELLxARRAY:
   savexyÆ0Å = x_fetch(0);                          /*Save boundary points  */
   savexyÆ1Å = y_fetch(0);
   x2 = x_fetch(2);
   y2 = y_fetch(2);

   dp747x (ndclrl);                      /*Change color to line color */
   dr747x (MOVE, savexy);                /*Move to first point   */

   dbufhp (3, solid);                    /*Set solid line type   */

   xyÆ0Å = x2;                          /*Draw boundary around area */
   xyÆ1Å = savexyÆ1Å;
   dr747x (DRAW, xy);
   xyÆ1Å = y2;
   dr747x (DRAW, xy);
   xyÆ0Å = savexyÆ0Å;
   dr747x (DRAW, xy);
   dr747x (DRAW, savexy);

   if (ndlntp != DIG0) æ             /*restore line type if not solid */
      lstyleÆ2Å = ndlntp;
      dbufhp (6, lstyle);
      å
   break;


/* opcode GDP's */

  case GENERALIZEDxDRAWINGxPRIMITIVE:
   i=LFETCH(conseg,conoff,5);

   if(i==1) æ         /* BARS - supported by both plotters */
      dp747x (ndclrf);                      /*Change color to fill color  */
      for (j=2; j<8; ++j) ibufÆj-2Å = LFETCH(pinseg,pinoff,j);
      x1 = LFETCH(pinseg,pinoff,0); y1 = LFETCH(pinseg,pinoff,1);
      x2 = LFETCH(pinseg,pinoff,2); y2 = LFETCH(pinseg,pinoff,3);

      LSTORE(pinseg,pinoff,2,x2);  LSTORE(pinseg,pinoff,3,y1);
      LSTORE(pinseg,pinoff,4,x2);  LSTORE(pinseg,pinoff,5,y2);
      LSTORE(pinseg,pinoff,6,x1);  LSTORE(pinseg,pinoff,7,y2);

      gsxfill(ndistyf,ndstyf,ndlntp,4);

      for (j=2; j<8; ++j) LSTORE(pinseg,pinoff,j,ibufÆj-2Å);
   å
   if (i>1 && nmbrpens==8) æ
      switch (i) æ
      case 2:              /*ARC */
        dp747x (ndclrl);                /*Change color to line color  */
        xyÆ0Å = x_fetch(2);
        xyÆ1Å = y_fetch(2);
        dr747x (MOVE, xy);             /*Move to first point of arc */
        dbufhp (5,arcstart);
        length = gitoch(x_fetch(0), icnvt, 6, &ierror);
        dbufhp (length,icnvt);
        dbufhp (1, &comma);
        length = gitoch(y_fetch(0), icnvt, 6, &ierror);
        dbufhp (length,icnvt);
        dbufhp (1, &comma);
        length = gitoch((LFETCH(iinseg,iinoff,1)-LFETCH(iinseg,iinoff,0))/10, icnvt, 6, &ierror);
        dbufhp (length,icnvt);
        dbufhp (3, arcend);
        break;
      case 3:              /*Pie Slices */
      case 4:              /*Circles */
        dp747x (ndclrf);                /*Change color to line color  */
        xyÆ0Å = x_fetch(0);
        xyÆ1Å = y_fetch(0);
        dr747x (MOVE, xy);             /*Move to center of slice */
        if (ndistyf==1 øø ndistyf==3) æ
           for (j=0;j<2;++j) æ
              if (ndistyf==1 ) dbufhp (7,solfill);
              else æ
                 ival = ndstyf; if (ndstyf > 4) ival -= 3;
                 if (j==1) ival = (ndstyf==6) ? 4 : 1;
                 switch (ival) æ
                    case 1: hatfillÆ7Å=SP; hatfillÆ8Å=DIG9; hatfillÆ9Å=DIG0; break;
                    case 2: hatfillÆ7Å=hatfillÆ8Å=SP; hatfillÆ9Å=DIG0; break;
                    case 3: hatfillÆ7Å=SP; hatfillÆ8Å=DIG4; hatfillÆ9Å=DIG5; break;
                    case 4: hatfillÆ7Å=DIG1; hatfillÆ8Å=DIG3; hatfillÆ9Å=DIG5; break;
                 å
                 dbufhp (11, hatfill);
              å   
              dbufhp (2, wedge);
              temp = (i==3) ? 6 : 4;
              length = gitoch(max0(2,LFETCH(pinseg,pinoff,temp)), icnvt, 6, &ierror);
              dbufhp (length,icnvt);
              dbufhp (1, &comma);
              temp = (i==3) ? (LFETCH(iinseg,iinoff,0)/10 + 270) : 0;
              length = gitoch(temp, icnvt, 6, &ierror);
              dbufhp (length,icnvt);
              dbufhp (1, &comma); 
              temp = (i==3) ? (LFETCH(iinseg,iinoff,1)/10 + 270 - temp) : 360;
              length = gitoch(temp, icnvt, 6, &ierror);
              dbufhp (length,icnvt);
              dbufhp (3, arcend);
              if (ndistyf==1 øø ndstyf<5) break;
           å
        å
        dbufhp (2, edgewedge);   
        temp = (i==3) ? 6 : 4;
        length = gitoch(max0(2,LFETCH(pinseg,pinoff,temp)), icnvt, 6, &ierror);
        dbufhp (length,icnvt);
        dbufhp (1, &comma);
        temp = (i==3) ? (LFETCH(iinseg,iinoff,0)/10 + 270) : 0;
        length = gitoch(temp, icnvt, 6, &ierror);
        dbufhp (length,icnvt);
        dbufhp (1, &comma);
        temp = (i==3) ? (LFETCH(iinseg,iinoff,1)/10 + 270 - temp) : 360;
        length = gitoch(temp, icnvt, 6, &ierror);
        dbufhp (length,icnvt);
        dbufhp (3, arcend);
        break;
     å
   å
        
   break;


/* opcode set character height */

  case SxCHxHEIGHT:

 
   /*The input parameters represent the text height of a character             */
   /*cell excluding gap.  The 747x plotter command for text size only requires */
   /*the character width and height itself and does its own inter-line         */
   /*inter-character spacing.  The plotter sets the character cell width       */
   /*to 1.5 * character width and the character cell height to 2 * character   */
   /*height.

   /*To avoid using real numbers we store the height and width in              */
   /*.01 cm units with an implied decimal point two places to                  */
   /*the left (100 = 1 cm).  4 plotter steps = .01 cm                          */

   /*Make sure not too small >=.15cm and not too large                         */
   ndtysz = gimnmx (LFETCH(pinseg,pinoff,1), 60, iniptoÆ3Å);
   ndtxsz = (ndtysz * 6)/10;          /*Pick appropriate width w = .6 * h */
   ndtxsz = max0 (ndtxsz, 60);               /*Make sure not too small >=.15cm   */

   /*Convert text width in dcs to .01 centimeters  */
   /*  width = dc / (steps per .01 cm = 4)         */

   ndtxsz = ndtxsz/4;

   /*Convert text height dcs to .01 centimeters  */
   /*  height = dc / (steps per .01 cm = 4)      */

   ndtysz = ndtysz/4;
   
   dt747x (ndtxsz, ndtysz);             /*Set the text size */

   LSTORE(conseg,conoff,2,2);                       /*One output coordinate pair*/
   LSTORE(poutseg,poutoff,0,savexyÆ0Å = ndtxsz * 4);
   LSTORE(poutseg,poutoff,1,savexyÆ1Å = ndtysz * 4);

   /*cell width = 1.5 * char width  */
   /*cell height = 2 * char heght   */
   LSTORE(poutseg,poutoff,2,(savexyÆ0Å*300)/200);
   LSTORE(poutseg,poutoff,3,savexyÆ1Å*2);


   break;
 

/* opcode set character up vector */

  case SxCHxUPxVECTOR:
   ndtxrt = LFETCH(iinseg,iinoff,0);               /*Device can rotate continuously */
   dbufhp (2,rotate);
   length = gitoch (LFETCH(iinseg,iinoff,2), icnvt, 6, &ierror);
   dbufhp (length, icnvt);     /*Output run*/
   dbufhp (1, &comma);
   length = gitoch (-1*LFETCH(iinseg,iinoff,1), icnvt, 6, &ierror);
   dbufhp (length,icnvt);      /*Output rise (remember portrait mode) */
                               /*New run = old rise, New rise = -1 * old run */
   dbufhp (1,&semcol);          /*End that command*/
   LSTORE(ioutseg,ioutoff,0,ndtxrt);         /*Inform upper level of angle */
   break;


/* opcode set color  */

  case SxCOLORxREPRESENTATION:
   /*Save 2 or 8 color indices, 1 for each pen station.  The requested  */
   /*value is the same as the realized value                       */
   i = gimnmx (LFETCH(iinseg,iinoff,0), 0, nmbrpens);           /*Get color index in range  */
   clrredÆiÅ = LFETCH(iinseg,iinoff,1);
   clrgrnÆiÅ = LFETCH(iinseg,iinoff,2);
   clrbluÆiÅ = LFETCH(iinseg,iinoff,3);
   break;


/* opcode set line type */

  case SxPLxLINETYPE:
   ndlntp =  LFETCH(iinseg,iinoff,0);
   if (ndlntp < 1 ø ndlntp > 7) ndlntp = 1;
   LSTORE(iinseg,iinoff,0,ndlntp);                     /*Return linetype selected */
   ndlntp = ndlntp - 1 + DIG0;             /*Map to device parameter  */
   if (ndlntp == DIG0)                     /*Line type solid          */
      dbufhp(3, solid);
   else æ                                  /*Line type not solid      */
      lstyleÆ2Å = ndlntp;
      dbufhp(6, lstyle);
      å
   break;
 

/* opcode polyline color index  */

  case SxPLxCOLORxINDEX:
   ndclrl = max0 ( 0, LFETCH(iinseg,iinoff,0));
   LSTORE(ioutseg,ioutoff,ndclrl);              /*Return color index selected */
   break;
 

/* opcode set marker type   */

  case SxPMxTYPE:
   ndmktp = LFETCH(iinseg,iinoff,0);
   if (ndmktp < 1 ø ndmktp > 5) ndmktp = 3; /*Marker type 3 is default */
   LSTORE(ioutseg,ioutoff,ndmktp);                      /*Return type selected     */
   break;


/* opcode polymarker scale  */

  case SxPMxSCALE:
   ndmkht = gimnmx (LFETCH(pinseg,pinoff,1), 60, iniptoÆ11Å);/*Make sure size not too        */
						   /*small or too large       */
   LSTORE(conseg,conoff,2,1);                      /*Return 1 coordinate pair */
   LSTORE(poutseg,poutoff,0,0);
   LSTORE(poutseg,poutoff,1,ndmkht);             /*Return size selected     */

   /*convert height in dcs to .01 centimeters   */
   /* height = dc / (steps per .01 cm = 4)      */

   ndmkht = ndmkht/4;

   break;


/* opcode polymarker color index  */

  case SxPMxCOLORxINDEX:
   LSTORE(ioutseg,ioutoff,0,ndclrm = max0 ( 0, LFETCH(iinseg,iinoff,0)));
   break;
 

/* opcode set text font  */

  case SxTXxFONT:
   i = j = gimnmx (LFETCH(iinseg,iinoff,0), 1, nmbrfonts) - 1;
   if (i>4) i=i+1;
   if (i>9) i=i+20;
   setfntÆ2Å = i/10 + DIG0;
   setfntÆ3Å = (i%10) + DIG0;
   dbufhp (8, setfnt);           /*Output command        */
 
   LSTORE(ioutseg,ioutoff,0,j);                /*Return actual font selected  */
   break;
 

/* opcode text color index   */

  case SxTXxCOLORxINDEX:
   LSTORE(ioutseg,ioutoff,0,ndclrt = max0(0,LFETCH(iinseg,iinoff,0)));
   break;
 

/* opcode set fill color index  */

  case SxFxCOLORxINDEX:
   LSTORE(ioutseg,ioutoff,0,ndclrf = max0(0,LFETCH(iinseg,iinoff,0)));
   break;
 

/* opcode set fill interior sytle index  */

  case SxFxINTERIORxSTYLE:
   ndistyf = max0(LFETCH(iinseg,iinoff,0),0);
   if (ndistyf > 3) ndistyf = 0;
   LSTORE(ioutseg,ioutoff,0,ndistyf);
   break;

/* opcode set fill style index  */

  case SxFxSTYLExINDEX:
   ndstyf = max0(LFETCH(iinseg,iinoff,0),1);
   if (ndstyf > 6) ndstyf = 1;
   LSTORE(ioutseg,ioutoff,0,ndstyf);
   break;

/* opcode inquire color representation  */

  case INQxCOLORxREPRESENTATION:
   i = gimnmx (LFETCH(iinseg,iinoff,0), 0, nmbrpens);     /*Map index 0-5 to 1-8 */
   LSTORE(ioutseg,ioutoff,0,i + 1);               /*Color index selected             */
   LSTORE(ioutseg,ioutoff,1,clrredÆiÅ);           /*Set values are same as realized  */
   LSTORE(ioutseg,ioutoff,2,clrgrnÆiÅ);
   LSTORE(ioutseg,ioutoff,3,clrbluÆiÅ);
   break;


/* opcode input locator  */

  case INPxLOCATOR:
   LSTORE(poutseg,poutoff,0,0);
   LSTORE(poutseg,poutoff,1,0);
   LSTORE(conseg,conoff,4,UNSUCCESSFUL);
   i = LFETCH(iinseg,iinoff,0);                       /*check input device number  */
   if (i != DEFAULT && i != PLOTTER) return;
   xyÆ0Å=x_fetch(0);
   xyÆ1Å=y_fetch(0);
   dr747x (MOVE, xy);       /*move to initial point*/

   dbufhp (-1, gogin);  /*First flush the buffer  */
   outstr (4, gogin);                /*Arm to do a point input      */
   for (;;) æ                          /*Go until the key was pressed */
      outstr (4, inqsta);            /*Ask for a status byte        */
      instr (40, ibuf,  &temp);       /*Get the answer               */
      for (j=0; (j<40) && (ibufÆjÅ==0);++j);
      gchtoi (ibuf, j, &ival, &istop);
      j = (ival>>2) % 2;
      if (j == 1) break;             /*the third bit was on         */
      å
   outstr (4, getgin);       /*Ask for the gin report       */
   instr (18, ibuf,  &temp); /*Get the gin report           */
 
   LSTORE(conseg,conoff,4,SUCCESSFUL);                      /*Request was successful   */
   LSTORE(conseg,conoff,2,1);                               /*Output 1 coordinate pair */
   gchtoi (ibuf, 0, &i, &istop);
   LSTORE(poutseg,poutoff,1,i-wxmin);
   gchtoi (ibuf, istop+1, &i, &istop);
   LSTORE(poutseg,poutoff,0,wymax-i);
   LSTORE(ioutseg,ioutoff,0,ibufÆistop+1Å - DIG0 + SP);     /*Return SP or ! (pen up/down)*/
   break;
 

/* opcode set input mode */

  case SxINPUTxMODE:
   LSTORE(ioutseg,ioutoff,0,1);    /*Default mode is request */
   break;
  å
  dbufhp (-1, stopgr);     /*Dump buffer  */
/*  dbufhp (3, stopgr); */     /*Terminate graphics */

å


dr747x (opcode, xy)
int opcode, xyÆÅ;
æ
/***********************************************************************
*                                                                      *
*     Function: Device Driver move/draw for HP747x                     *
*                                                                      *
*     Input Parameters:                                                *
*           opcode - driver function, either move/draw                 *
*           xy     - coordinates to move or draw to                    *
*                    xy Æ0Å = x-coordinate                             *
*                    xy Æ1Å = y-coordinate                             *
*                                                                      *
*     Output Parameters: none                                          *
*                                                                      *
*     Routines Called:                                                 *
*            dbufhp - output a string to the HP747x plotter            *
*            gitoch - convert integer to character string              *
*                                                                      *
************************************************************************/
 
int length, iconvtÆ10Å, ierror, gitoch();
 
static int movdrwÆ5Å = æBIGP, BIGU, SEMICOL, BIGP, BIGAå;
static int semcolÆ1Å = æSEMICOLå;
static int commaÆ1Å = æCOMMAå;
 
   movdrwÆ1Å = BIGU;                       /*Always prepare to do a move */
   if (opcode == DRAW) movdrwÆ1Å = BIGD;   /*Change it for a draw        */
   dbufhp (5, movdrw);
   length = gitoch (xyÆ0Å,iconvt,5,&ierror);
   dbufhp (length,iconvt);
   dbufhp (1,comma);
   length = gitoch (xyÆ1Å,iconvt,5,&ierror);
   dbufhp (length,iconvt);
   dbufhp (1,semcol);
å

dt747x (wid, hgt)
unsigned int wid,hgt;
æ
/***********************************************************************
*                                                                      *
*     Function: Set text size on HP 747x plotter                       *
*                                                                      *
*     Input Parameters:                                                *
*            wid   - width of character in .01 cm units (1cm =100units)*
*            hgt   - height of character in .01 cm units (1cm=100units)*
*     Output Parameters:                                               *
*            none                                                      *
*                                                                      *
*     Routines Called:                                                 *
*            gitoch  - convert integer to character string             *
*            dbufhp - output a command to a hp plotter                 *
***********************************************************************/

int icnvtÆ10Å, j, ierror, length; unsigned int i;
int gitoch();
 
/*           Set label(text) size  /SI/  */
static int txtsizÆ2Å = æBIGS, BIGIå;
 
static int commaÆ1Å = æCOMMAå;
static int periodÆ1Å = æPERIODå;
static int semcolÆ1Å = æSEMICOLå;
static int zeroÆ1Å = æDIG0å;
   

   dbufhp (2, txtsiz);   /*Put out text size command  */
 
   /*To avoid using real numbers we store the height and width in  */
   /*.01 cm units with an implied decimal point two places to      */
   /*the left (100 = 1 cm).  4 plotter steps = .01 cm              */

   j = wid % 100; i = wid / 100;              /*Get whole number of centimeters  */
                                             /*and remainder  j=mod(wid,100)    */
   length = gitoch (i, icnvt, 6, &ierror);    /*Output whole # of centimeters    */
   dbufhp (length, icnvt);
   dbufhp (1, period);
   if (j < 10) dbufhp (1, zero);             /*Output tenths digit if 0         */
   length = gitoch (j, icnvt, 6, &ierror);    /*Output fractional centimeters    */
   dbufhp (length, icnvt);
   dbufhp (1,comma);
 
   j = hgt % 100; i = hgt / 100;                  /*Get whole # of centimeters       */
					     /*and remainder j=mod(hgt,100)     */
   length = gitoch (i, icnvt, 6, &ierror);    /*Output whole # of centimeters    */
   dbufhp (length, icnvt);
   dbufhp (1, period);
   if (j < 10) dbufhp (1, zero);             /*Output tenths digit if 0         */
   length = gitoch (j, icnvt, 6, &ierror);    /*Output fractional centimeters    */
   dbufhp (length, icnvt);
   dbufhp (1,semcol);

å

dp747x (color)
int color;
æ
/***********************************************************************
*                                                                      *
*     Function: Change the color on the H P 747x plotter               *
*                                                                      *
*     Input Parameters:                                                *
*            color - color to change to                                *
*     Output Parameters:                                               *
*            none                                                      *
*                                                                      *
*     Routines Called:                                                 *
*            gznppl - prompt for new pen on plotter                    *
*            dbufhp - output a command to a hp plotter                 *
***********************************************************************/
 
int newsta;
extern int pensÆÅ, clrredÆÅ, clrgrnÆÅ, clrbluÆÅ;
 
#include "ddcom.h";
 
/*   Change pens   */
static int penclrÆ4Å = æ BIGS, BIGP, DIG0, SEMICOL å;  /*  SP0; */
 
if (ndclrp != color) æ
   /*prompt for new pen on plotter if necessary  */
   gznppl (color, nmbrpens, pens, &newsta);
 
   ndclrp = color;   /*Set the current color  */
 
   penclrÆ2Å = newsta + DIG0; /*Load this pen station  */
   dbufhp (4, penclr);
   å
å

dbufhp (icount, iarray)
int icount, iarrayÆÅ;
æ
/***********************************************************************
*                                                                      *
*     Function: HP747x buffered output handler                         *
*                                                                      *
*     Input Parameters:                                                *
*           icount - number of characters in iarray to be output       *
*                    -1 flushes the buffer                             *
*                                                                      *
*           iarray - Array of characters to be output                  *
*                                                                      *
*     Output Parameters: none                                          *
*                                                                      *
*     Routines Called:                                                 *
*            RDRIN - get a character from the plotter                  *
*            PCHOUT - output a character to the plotter                *
*            outstr - output a string to the plotter                   *
*                                                                      *
***********************************************************************/
 
int k;
 
#include "ddcom.h";
 
   k = icount;
   if (k < 0) k = 0;
   outstr (k, iarray);
   ndotkt = ndotkt + k;         /*Update the plotter buffer counter    */
å

gznfpl()
æ
/***********************************************************************
*                                                                      *
*     Function: Issue prompt to change paper and wait for input        *
*                                                                      *
*     Input Parameters:                                                *
*            none                                                      *
*     Output Parameters:                                               *
*            none                                                      *
*                                                                      *
*     Routines Called:                                                 *
*            TTYIN - get keyboard input                                *
*            TTYOUT - output text to console                           *
***********************************************************************/

   int i;
   static int stringÆÅ = æ
     BIGC,BIGH,BIGA,BIGN,BIGG,BIGE,SP,BIGP,BIGA,BIGP,BIGE,BIGR,COMMA,
     SP,BIGT,BIGH,BIGE,BIGN,SP,BIGP,BIGR,BIGE,BIGS,BIGS,SP,BIGR,BIGE,
     BIGT,BIGU,BIGR,BIGN,CR,LF å;

   i=0; do TTYOUT(stringÆiÅ); while (stringÆi++Å!=LF);
   TTYIN(&i);
å

gznppl(color, npens, pens, newstat)
int color, npens, pensÆÅ, *newstat;
æ
/***********************************************************************
*                                                                      *
*     Function: Issue prompt to change pens and wait for input         *
*                                                                      *
*     Input Parameters:                                                *
*            color - new color                                         *
*            npens - number of pens on plotter                         *
*            pens - pen station array                                  *
*                                                                      *
*     Output Parameters:                                               *
*            newstat - new station                                     *
*                                                                      *
*     Routines Called:                                                 *
*            TTYIN - get keyboard input                                *
*            TTYOUT - output text to console                           *
***********************************************************************/

   int i,j;
   static stringÆÅ = æ
    BIGP,BIGL,BIGA,BIGC,BIGE,SP,BIGP,BIGE,BIGN,SP,SP,SP,SP,SP,SP,SP,BIGI,BIGN,SP,BIGD,BIGE,
    BIGS,BIGI,BIGR,BIGE,BIGD,SP,BIGP,BIGE,BIGN,SP,BIGS,BIGT,BIGA,BIGT,BIGI,
    BIGO,BIGN,COMMA,SP,BIGT,BIGH,BIGE,BIGN,SP,BIGE,BIGN,BIGT,BIGE,BIGR,SP,
    BIGS,BIGT,BIGA,BIGT,BIGI,BIGO,BIGN,SP,BIGN,BIGU,BIGM,BIGB,BIGE,BIGR,COLON,
    SP,-1 å;

   *newstat=-1;
   for (i=0; i<=npens; ++i) if (pensÆiÅ==color) *newstat=i;
   if (*newstat==-1) æ
      for (i=10;i<14;++i) stringÆiÅ=SP; gitoch(color,&stringÆ10Å,5,&i);
      i=0; do TTYOUT(stringÆiÅ); while (stringÆ++iÅ>=0);
      TTYIN(&i); TTYOUT(i); 
      TTYOUT(CR); TTYOUT(LF);
      *newstat = gimnmx(i-'0',0,npens);
      pensÆ*newstatÅ=color;
      å
   å


instr (lenin,string,lenout)
int lenin, stringÆÅ, *lenout;
æ
/***********************************************************************
*                                                                      *
*     Function: Input a string from the plotter                        *
*                                                                      *
*     Input Parameters:                                                *
*            lenin - maximum length of string                          *
*                                                                      *
*     Output Parameters:                                               *
*            string - array of ADE values received from plotter        *
*            lenout - actual length of string                          *
*                                                                      *
*     Routines Called:                                                 *
*            RDRIN - get plotter input                                 *
***********************************************************************/

   int i, tmplen;

   /* check for valid length */

   *lenout = 1; 
   if (lenin>0) æ
      tmplen = min0(lenin,81);
      i=-1;
      do æ
      RDRIN(&(stringÆ++iÅ));
         *lenout = i;
         å while (i<lenin && stringÆiÅ!=CR);
      å
   /* put the 'new line' character at the end of the string */
   stringÆ*lenoutÅ = LF;
   å

outstr (len, string)
int len, stringÆÅ;
æ
/***********************************************************************
*                                                                      *
*     Function: Output a string to the plotter                         *
*                                                                      *
*     Input Parameters:                                                *
*            len - length of string                                    *
*            string - array of ADE values                              *
*                                                                      *
*     Output Parameters:                                               *
*            none                                                      *
*                                                                      *
*     Routines Called:                                                 *
*            RDROUT - send character to plotter                        *
***********************************************************************/

   int i;

   for (i=0; i<len; ++i) PCHOUT (stringÆiÅ);
   å

int gitoch (value, string, max, ierror)
int stringÆÅ, max, value, *ierror;
æ
/*********************************************************************
* 			  				             *
* 	FUNCTION: CONVERT AN INTEGER TO AN ADE STRING                *
* 							             *
* 	INPUT PARAMETERS:				             *
* 		VALUE - INTEGER TO BE CONVERTED                      *
*		MAX - MAXIMUM LENGTH OF STRING                       *
* 			  				             *
* 	OUTPUT PARAMETERS:				             *
* 		STRING - ARRARY TO HOLD THE ADE VALUES               *
*    		IERROR - ERROR FLAG                                  *
* 							             *
* 	ROUTINES CALLED:				             *
*               NONE                                                 *
*********************************************************************/

    int l;

    *ierror=-1;
    nb2ade(value,string,&l);
    if ((l<=0) øø (l>max)) return(0);
    else æ*ierror=0; return(l);å
   å

int gimnmx (value, min, max)
int value, min, max;
æ
/*********************************************************************
* 			  				             *
* 	FUNCTION: CHECK THAT AN INTEGER IS WITHIN A GIVEN RANGE      *
* 							             *
* 	INPUT PARAMETERS:				             *
* 		VALUE - INTEGER TO CHECK                             *
*		MIN - MINIMUM LEGAL VALUE                            *
*		MAX - MAXIMUM LEGAL VALUE                            *
* 			  				             *
* 	OUTPUT PARAMETERS:				             *
*               GIMNMX - VALUE RETURNED                              *
* 							             *
* 	ROUTINES CALLED:				             *
*               NONE                                                 *
*********************************************************************/

    return (min0(max0(min,value),max));
    å

nb2ade(number,chars,number_char)
int number,*number_char;
int *chars;

/***********************************************************************
*                                                                      *
*     Function: Convert a number to an ade-string                      *
*                                                                      *
*     Input Parameters:                                                *
*            number - value to convert                                 *
*                                                                      *
*     Output Parameters:                                               *
*            chars - array of ade values                               *
*            number_char - length of chars                             *
*                                                                      *
*     Routines Called:                                                 *
*            none                                                      *
***********************************************************************/

æ
	int digit,i,first,tensÆ5Å;
	tensÆ0Å=10000; tensÆ1Å=1000; tensÆ2Å=100; tensÆ3Å=10;
	tensÆ4Å=1;
	if (number==0) æ
		*number_char=1;
		*(chars++)='0';
	å
	else æ
		*number_char=0;
		first=0;
		if (number<0) æ
			*number_char=1;
			*(chars++)='-';
			number*=-1;
		å
		for (i=0;i<=4;++i) æ
			digit=number/tensÆiÅ;
			if (digit>0 øø first!=0)  æ
				*(chars++)=digit + '0';
				++*number_char;
				number-=digit*tensÆiÅ;
				first=1;
			å
		å
	å
å

gchtoi (string, start, value, stop)
int stringÆÅ, start, *value, *stop;
æ
/*********************************************************************
* 			  				             *
* 	FUNCTION: CONVERT AN ADE STRING TO AN INTEGER                *
* 							             *
* 	INPUT PARAMETERS:				             *
* 		STRING - ARRAY CONTAINING THE STRING                 *
*		START - POSITION IN STRING TO START CONVERSION       *
* 			  				             *
* 	OUTPUT PARAMETERS:				             *
* 		VALUE - THE INTEGER VALUE                            *
*    		STOP - THE LAST POSITION OF THE STRING IN THE ARRAY  *
* 							             *
* 	ROUTINES CALLED:				             *
*               NONE                                                 *
*********************************************************************/

    int sign;


    sign = 1;
    for (*stop=start; stringÆ*stopÅ==' '; *stop++);
    if (stringÆ*stopÅ == '+' øø stringÆ*stopÅ == '-' )     /* sign */
       sign = (stringÆ(*stop)++Å=='+') ? 1 : -1;
    for (*value = 0; stringÆ*stopÅ >= '0' && stringÆ*stopÅ <= '9'; (*stop)++)
       *value = 10 * *value + stringÆ*stopÅ - '0';
    *value = sign * *value;
    å

int min0 (a,b)
int a,b;
æ
/*********************************************************************
* 			  				             *
* 	FUNCTION: RETURN THE MINIMUM OF A AND B                      *
* 							             *
* 	INPUT PARAMETERS:				             *
* 		A, B - VALUES TO FIND THE MINIMUM OF                 *
* 			  				             *
* 	OUTPUT PARAMETERS:				             *
* 		MIN0 - FUNCTION VALUE RETURNED                       *
* 							             *
* 	ROUTINES CALLED:				             *
*               NONE                                                 *
*********************************************************************/

    return((a<b) ? a : b);
    å

int max0 (a,b)
int a,b;
æ
/*********************************************************************
* 			  				             *
* 	FUNCTION: RETURN THE MAXIMUM OF A AND B                      *
* 							             *
* 	INPUT PARAMETERS:				             *
* 		A, B - VALUES TO FIND THE MAXIMUM OF                 *
* 			  				             *
* 	OUTPUT PARAMETERS:				             *
* 		MIN0 - FUNCTION VALUE RETURNED                       *
* 							             *
* 	ROUTINES CALLED:				             *
*               NONE                                                 *
*********************************************************************/

    return((a>b) ? a : b);
    å

gsxfill (int_style, style_index, line_style, length)
int int_style, style_index, length;
/***********************************************************************
*                                                                      *
*     Function: Prepare data for polygon-fill routine                  *
*                                                                      *
*     Input Parameters:                                                *
*            int_style - interior style                                *
*            style_index - interior style index                        *
*            line_style - current line style                           *
*            length - number of points in polygon                      *
*                                                                      *
*     Output Parameters:                                               *
*            none                                                      *
*                                                                      *
*     Routines Called:                                                 *
*            LSTORE - long store                                       *
*            LFETCH - long fetch                                       *
*            plyfill - polygon fill                                    *
*            dr747x - move/draw on plotter                             *
*            dbufhp - send string to plotter                           *
***********************************************************************/

æ
   int savexyÆ2Å, xyÆ2Å, ival, i, j, distance;

/*           Set line style to solid /LT;/ */
   static int solidÆ3Å =æBIGL, BIGT, SEMICOLå;

/*           Line style /LT<0>,2;/ */
   static int lstyleÆ6Å =æBIGL, BIGT, DIG0, COMMA, DIG2, SEMICOLå;

   dbufhp (3, solid);                    /*Set linetype to solid       */
   if (ndistyf==1 øø ndistyf==3) æ
      savexyÆ0Å=LFETCH(pinseg,pinoff,2*length);
      savexyÆ1Å=LFETCH(pinseg,pinoff,2*length+1);
      LSTORE(pinseg,pinoff,2*length,LFETCH(pinseg,pinoff,0));
      LSTORE(pinseg,pinoff,2*length+1,LFETCH(pinseg,pinoff,1));

      distance = (ndistyf==1) ? 12 : 120;
      if (ndistyf==1) ival = 2;
      else æ
         ival = ndstyf;
         if (ndstyf > 4) ival -= 3;
      å   
      plyfill (ival, distance, length+1);
      if (ndistyf==3 && ndstyf>4) æ   
         ival = (ndstyf==5) ? 1 : 4;
         plyfill (ival, distance, length+1);
      å
      LSTORE(pinseg,pinoff,2*length,savexyÆ0Å);
      LSTORE(pinseg,pinoff,2*length+1,savexyÆ1Å);
   å
   xyÆ0Å=x_fetch(0);
   xyÆ1Å=y_fetch(0);
   dr747x (MOVE, xy);              /*Move to first point         */

   dr747x (MOVE, xy);              /*Move to repostion pen       */

   j = 2;
   for (i=2; i<=length; ++i) æ  /*draw between subsequent points    */
      xyÆ0Å=x_fetch(j);
      xyÆ1Å=y_fetch(j);
      dr747x (DRAW, xy);
      j += 2;
      å
   xyÆ0Å=x_fetch(0);
   xyÆ1Å=y_fetch(0);
   dr747x (DRAW, xy);     /*draw to first point to make sure     */
				     /*polygon closed                  */
   dr747x (MOVE, xy);     /*Move to the point to pick the pen up */

   if (ndlntp != DIG0) æ             /*restore line type if not solid       */
      lstyleÆ2Å = ndlntp;
      dbufhp (6, lstyle);
      å
å

int x_fetch(position) æreturn(LFETCH(pinseg,pinoff,position+1)+wxmin);å

int y_fetch(position) æreturn(wymax-LFETCH(pinseg,pinoff,position));å

plyfill(pattern,distance,length)
int pattern, distance, length;
/***********************************************************************
*                                                                      *
*     Function: Fill a polygon                                         *
*                                                                      *
*     Input Parameters:                                                *
*            pattern - fill pattern                                    *
*            distance - distance between fill lines                    *
*            length - number of points in polygon                      *
*                                                                      *
*     Output Parameters:                                               *
*            none                                                      *
*                                                                      *
*     Routines Called:                                                 *
*            LSTORE - long store                                       *
*            LFETCH - long fetch                                       *
*            MULDIV - muliply and divide using 32-bits                 *
*            INTERCPT - calculate intercept formula in 32 bits         *
*            dr2x0 - move/draw on plotter                             *
***********************************************************************/

æ
   int incr, i, j, raster, intxÆ50Å, LFETCH(), MULDIV(), INTERCPT(), wmin, wmax;
   int x1, x2, y1, y2, j2, xyÆ2Å, temp, oldx, oldy;
   int oxmin, oxmax, oymin, oymax, intercept, sign, evenodd;
   int x_fetch(),y_fetch();

   incr = distance;
   if (pattern > 2) incr = (distance*7)/5;
   sign = (pattern == 4) ? -1 : 1;
   oxmax = oymax = -1; oxmin = oymin = 32767;
   x1 = x_fetch(0);  y1 = y_fetch(0);
   for (i=2*length-4; i>0; i-=2) æ
      oldx = x_fetch(i);
      oldy = y_fetch(i);
      if (pattern==1 && oldy!=y1) break;
      if (pattern==2 && oldx!=x1) break;
      if (pattern>2 && (oldx-oldy)!=(-1*sign*(x1-y1))) break;
      å
   for (i=0; i<2*length; i+=2) æ
      x1 = x_fetch(i);
      y1 = y_fetch(i);
      if (oxmax < x1) oxmax = x1;
      if (oxmin > x1) oxmin = x1;
      if (oymax < y1) oymax = y1;
      if (oymin > y1) oymin = y1;
   å
   switch (pattern) æ
      case 2: wmin = oxmin; wmax = oxmax; break;
      case 1: wmin = oymin; wmax = oymax; break;
      case 4: wmin = oymin - oxmax; wmax = oymax - oxmin; break;
      case 3: wmax = oxmax + oymax; wmin = oxmin + oymin; break;
   å
   evenodd=0;
   for (raster=wmax; raster>=wmin; raster-=incr) æ
      j = 0;
      evenodd = (++evenodd)%2;
      for (i=0; i<(2*length-2); i+=2) æ
         x1 = x_fetch(i);
         y1 = y_fetch(i);
         x2 = x_fetch(i+2);
         y2 = y_fetch(i+2);
         intercept = -1;
         switch (pattern) æ
            case 2:
              if ((x1<=raster && x2>=raster) øø (x1>=raster && x2<=raster))
                 if (x1!=x2) æ
                    intercept = y1 + MULDIV(raster-x1,y1-y2,x1-x2);
                    if ((x1==raster) && ((x2<raster && oldx>raster) øø
                                     (x2>raster && oldx<raster))) 
                       intercept=-1;
                 å
              if (x1!=x2) æoldx=x1; oldy=y1;å
              break;
            case 1:
              if ((y1<=raster && y2>=raster) øø (y1>=raster && y2<=raster))
                 if (y1!=y2) æ
                    intercept = x1 + MULDIV(raster-y1,x1-x2,y1-y2);
                    if ((y1==raster) && ((y2<raster && oldy>raster) øø
                                     (y2>raster && oldy<raster))) 
                       intercept=-1;
                 å
              if (y1!=y2) æoldx=x1; oldy=y1;å
              break;
            case 3: 
            case 4:
              if (((sign*x1+y1)<=raster && (sign*x2+y2)>=raster) øø
                  ((sign*x1+y1)>=raster && (sign*x2+y2)<=raster))
                 if (((x1!=x2) øø (y1!=y2)) && (((y1-y2)+sign*(x1-x2))!=0)) æ
                    intercept = INTERCPT(raster,sign,x1,y1,x2,y2);
                    if (((sign*x1+y1)==raster) && (((sign*x2+y2)<raster && (sign*oldx+oldy)>raster) øø
                                     ((sign*x2+y2)>raster && (sign*oldx+oldy)<raster))) 
                       intercept=-1;
                 å
              if ((x1-x2)!=(-1*sign*(y1-y2))) æoldx=x1; oldy=y1;å
              break;
            å
            if (intercept>=0) æ
               intxÆj++Å=intercept;
               l_insert(intx,j-1,intxÆj-1Å,evenodd);
            å
      å
      i = 0;
      for (j2=0; j2<j; ++j2) æ
         switch (pattern) æ
            case 2:
              xyÆ0Å = raster; xyÆ1Å = intxÆj2Å; break;
            case 1:
              xyÆ0Å = intxÆj2Å; xyÆ1Å = raster; break;
            case 3:
            case 4:
              xyÆ0Å = intxÆj2Å;  xyÆ1Å = raster - sign*intxÆj2Å; break;
         å
         dr747x ((i++ % 2) + 1, xy);
      å
   å
å

l_insert(array,length,value,evenodd)
int arrayÆÅ, length, value, evenodd;
æ
   int j, j2;

   for (j=0; j<length; ++j) 
      if ((arrayÆjÅ > value && evenodd==0) øø (arrayÆjÅ < value && evenodd!=0)) æ
         for (j2=length-1; j2>=j; --j2) arrayÆj2+1Å=arrayÆj2Å;
         arrayÆjÅ=value;
         break;
      å
å
«eof»