ftp.nice.ch/pub/next/unix/developer/plplot.3.0.s.tar.gz#/plplot/drivers/aegis.c

This is aegis.c in view mode; [Download] [Up]

/* This file contains drivers for the HP7475A plotter */

#include "plplot.h"
#include <stdio.h>
#include <string.h>

#define AEGX       10000
#define AEGY       10000

static FILE *OutDev=NULL;
static int fileopen=0;
static short *buffptr, bufflen;
#define BSIZE  25

void aegissetup(xdpi, ydpi, xwid, ywid)
int xwid, ywid;
double xdpi, ydpi;
{
}

void aegisorient(orient)
int orient;
{
}

void aegisselect(fptr)
FILE *fptr;
{
   OutDev = fptr;
}

/* Set up device specific stuff and initialize the device */
void aegisinit()
{
   char line[80];

   /* setpxl() sets the dots/mm in the x and y directions */
   setpxl(39.37, 39.37);

   /* setphy() sets the device coordinates. These are integer */
   /* values. Set up for landscape orientation (long axis of page in the */
   /* x direction). Origin is in the lower left hand corner. */
   setphy(0,AEGX,0,AEGY);

   /* Set default pen color using scol(color). */
   /* Any default pen color can be used but a black pen is probably best. */
   scol(1);

   /* Set default pen width using swid(width) */
   swid(1);

   /* Set device interaction mode using smod(mode). Set mode to 0 for */
   /* a noninteractive device, Unless you are writing your */
   /* own Amiga screen driver mode should be 0. */
   smod(0);

   while(!OutDev) {
     printf("Enter graphics file name. ");
     fgets(line,sizeof(line),stdin);
     line[strlen(line)-1] = '\0';

     if (!(OutDev = fopen(line,"w"))) {
        fprintf(stderr,"Can't open %s.\n",line);
     }
     else {
        fileopen = 1;
        break;
     }
   }

   /* Write out header */
   fprintf(OutDev,"81086 0.0 0.0 100.0 100.0 0 10.\n");
   fprintf(OutDev,"\"%s\"\n-1\n","PLPLOT Graph");

   bufflen = 2*BSIZE;
   buffptr = (short *)malloc(sizeof(short)*bufflen);
   if(buffptr == NULL)
      plexit("Out of memory!");

}

/* Sets to text mode */
void aegistext()
{
}

/* Sets to graphics mode */
void aegisgraph()
{
}

static int firstline;
/* Clears the page */
void aegisclear()
{
   void flushbuffer();

   /* Close the file */
   if(!firstline) {
      flushbuffer();
   }
}

static short xlast, ylast;

void aegispage()
{
   firstline = 1;
   xlast = -10000; ylast = -10000;

}

void aegiseop()
{
}

static int curwid;
void aegiswidth(width)
int width;
{
   void flushbuffer();

   flushbuffer();
   firstline = 1;

   if(width <= 1)
      curwid = 0;
   else if(width >= 4)
      curwid = 3;
   else
      curwid = width-1;
}

static int curcol;
/* Change the pen color */
void aegiscolor(color)
int color;
{
   void flushbuffer();

   flushbuffer();
   firstline = 1;
   /* Aegis pen 1 is the "paper" color */
   if (color >= 2 && color <=15)
      curcol = color;
   else
      curcol = 0;
}

static short count, xmin, xmax, ymin, ymax;

/* Draws a line from (x1,y1) to (x2,y2) */
void aegisline(x1,y1,x2,y2)
int x1,y1,x2,y2;
{
   short *tempptr;
   void flushbuffer();

   /* If starting point of this line is the same as the ending point of */
   /* the previous line then don't raise the pen. (This really speeds up */
   /* plotting and reduces the size of the file. */
   if(firstline) {
      count = 0;
      *(buffptr+count++) = x1;
      *(buffptr+count++) = y1;
      *(buffptr+count++) = x2;
      *(buffptr+count++) = y2;
      xmin = MIN(x1,x2); ymin = MIN(y1,y2);
      xmax = MAX(x1,x2); ymax = MAX(y1,y2);
      firstline = 0;
   }
   else if(x1 == xlast && y1 == ylast) {
      if(count+2 >= bufflen) {
         bufflen += 2*BSIZE;
         tempptr = (short *)realloc((void *)buffptr,bufflen*sizeof(short));
         if(tempptr == NULL){
            free((void *)buffptr);
            plexit("Out of memory!");
         }
         buffptr = tempptr;
      }
      *(buffptr+count++) = x2;
      *(buffptr+count++) = y2;
      xmin = MIN(x2,xmin); ymin = MIN(y2,ymin);
      xmax = MAX(x2,xmax); ymax = MAX(y2,ymax);
   }
   else {
      flushbuffer();
      *(buffptr+count++) = x1;
      *(buffptr+count++) = y1;
      *(buffptr+count++) = x2;
      *(buffptr+count++) = y2;
      xmin = MIN(x1,x2); ymin = MIN(y1,y2);
      xmax = MAX(x1,x2); ymax = MAX(y1,y2);
   }

   xlast = x2;
   ylast = y2;
}

static void flushbuffer()
{
   short i=0;

   fprintf(OutDev,"1 52 %.2f %.2f",xmin/100.,ymin/100.);
   fprintf(OutDev," %.2f %.2f",xmax/100.,ymax/100.);
   fprintf(OutDev," %d 0 0 %d 0\n",curcol,curwid);
   while(i<count) {
     fprintf(OutDev," 1 %.2f %.2f\n",*(buffptr+i)/100.,*(buffptr+i+1)/100.);
     i += 2;
   }
   fprintf(OutDev," 0\n");
   count = 0;
}

/* Cleanup and close file. */
void aegistidy()
{
   flushbuffer();
   free((VOID *)buffptr);
   if(fileopen)
     fclose(OutDev);
}

void aegiscwin()
{
}

void aegisgwin()
{
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.