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.