This is xfig.c in view mode; [Download] [Up]
/* This file contains drivers for the HP7475A plotter */
#include <stdio.h>
#include <string.h>
#define FIGX 599
#define FIGY 599
#define DPI 80
static FILE *OutDev=NULL;
static int fileopen=0;
static short *buffptr, bufflen;
#define BSIZE 25
void xfigsetup(xdpi, ydpi, xwid, ywid)
int xwid, ywid;
double xdpi, ydpi;
{
}
void xfigorient(ori)
int ori;
{
}
void xfigselect(file)
FILE *file;
{
OutDev=file;
fileopen=0;
}
/* Set up device specific stuff and initialize the device */
void xfiginit()
{
char line[80];
/* setpxl() sets the dots/mm in the x and y directions */
setpxl(3.1496,3.1496); /* 80 DPI */
/* 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,FIGX,0,FIGY);
/* 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;
}
/* Write out header */
fprintf(OutDev,"#FIG 1.4X\n");
fprintf(OutDev,"%d 2\n",DPI);
bufflen = 2*BSIZE;
buffptr = (short *)malloc(sizeof(short)*bufflen);
if(buffptr == NULL)
plexit("Out of memory!");
}
/* Sets to text mode */
void xfigtext()
{
}
/* Sets to graphics mode */
void xfiggraph()
{
}
static int firstline=1;
/* Clears the page */
void xfigclear()
{
void flushbuffer();
if(!firstline)
flushbuffer();
}
static short xlast, ylast;
void xfigpage()
{
firstline = 1;
xlast = -10000; ylast = -10000;
}
void xfigeop()
{
}
static int curwid;
void xfigwidth(width)
int width;
{
void flushbuffer();
flushbuffer();
firstline = 1;
if(width <= 1)
curwid = 1;
else if(width >= 4)
curwid = 3;
else
curwid = width;
}
/* Change the pen color */
void xfigcolor(color)
int color;
{
}
static short count;
/* Draws a line from (x1,y1) to (x2,y2) */
void xfigline(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;
firstline = 0;
}
else if(x1 == xlast && y1 == ylast) {
if(count+2 >= bufflen) {
bufflen += 2*BSIZE;
tempptr = (short *)realloc((char *)buffptr,bufflen*sizeof(short));
if(tempptr == NULL){
free((char *)buffptr);
plexit("Out of memory!");
}
buffptr = tempptr;
}
*(buffptr+count++) = x2;
*(buffptr+count++) = y2;
}
else {
flushbuffer();
*(buffptr+count++) = x1;
*(buffptr+count++) = y1;
*(buffptr+count++) = x2;
*(buffptr+count++) = y2;
}
xlast = x2;
ylast = y2;
}
static void flushbuffer()
{
short i=0;
if(count==0)
return;
fprintf(OutDev,"2 1 0 %d 0 0 0 0 0.000 0 0\n",curwid);
while(i<count) {
fprintf(OutDev,"%d %d ",*(buffptr+i),FIGY-*(buffptr+i+1));
i += 2;
}
fprintf(OutDev,"9999 9999\n");
count = 0;
}
/* Cleanup and close file. */
void xfigtidy()
{
flushbuffer();
free((char *)buffptr);
if(fileopen)
fclose(OutDev);
}
void xfigcwin()
{
}
void xfiggwin()
{
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.