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

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

/* This file contains the PostScript device dependent subroutines for */
/* use with plplot. */

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

#define LINELENGTH      70
#define COPIES          1
/* 7.5" x 10"  (72 points equal 1 inch) */
#define XSIZE           540
#define YSIZE           720
#define ENLARGE         5
#define XPSSIZE         ENLARGE*XSIZE
#define YPSSIZE         ENLARGE*YSIZE
/* Offsets are .5" each */
#define XOFFSET         36
#define YOFFSET         36
#define XSCALE          100
#define YSCALE          100
#define LINESCALE       100
#define PSX             XPSSIZE-1
#define PSY             YPSSIZE-1

char *getdate();
static int numpages = 0;
static int linepos = 0;

static FILE *OutFile=NULL;
static int orient=1;
static int fileopen=0;

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

void psorient(ori)
int ori;
{
   orient = ori;
}

void psselect(file)
FILE *file;
{
  OutFile = file;
  fileopen=0;
}


/* Open file.  Set up for graphics. */
void psinit()
{
      char line[80];

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

   /* 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. */
   /* postscript default is portrait */
      if(!orient)
         setphy(0,PSY,0,PSX);
      else
         setphy(0,PSX,0,PSY);

   /* 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);

   /* Well that's all the information plplot needs. Let's prompt for a */
   /* graphics file name. */
      while(!OutFile) {
         printf("Enter PostScript graphics file name. ");
         scanf("%s",line);
         if (!(OutFile = fopen(line,"w"))) 
            fprintf(stderr,"Can't open %s.\n",line);
         else
            fileopen=1;
      }

  /* Header comments into PostScript file */

      fprintf(OutFile,"%%!PS-Adobe-2.0 EPSF-2.0\n");
      fprintf(OutFile,"%%%%BoundingBox: (atend)\n");
      fprintf(OutFile,"%%%%Title: PLPLOT Graph\n");
      fprintf(OutFile,"%%%%Creator: PLPLOT Version 3.0\n");
      fprintf(OutFile,"%%%%CreationDate: %s\n", getdate());
      fprintf(OutFile,"%%%%Pages: (atend)\n");
      fprintf(OutFile,"%%%%EndComments\n\n");

  /* Definitions */

      fprintf(OutFile, "/PSSave save def\n");      /* save VM state */
      fprintf(OutFile, "/PSDict 200 dict def\n");  /* define a dictionary */
      fprintf(OutFile, "PSDict begin\n");          /* start using it */
      fprintf(OutFile, "/@restore /restore load def\n");
      fprintf(OutFile, "/restore\n");
      fprintf(OutFile, "   {vmstatus pop\n");
      fprintf(OutFile, "    dup @VMused lt {pop @VMused} if\n");
      fprintf(OutFile, "    exch pop exch @restore /@VMused exch def\n");
      fprintf(OutFile, "   } def\n");
      fprintf(OutFile, "/@pri\n");
      fprintf(OutFile, "   {\n");
      fprintf(OutFile, "    ( ) print\n");
      fprintf(OutFile, "    (                                       ) cvs print\n");
      fprintf(OutFile, "   } def\n");
      fprintf(OutFile, "/@copies\n");   /* n @copies - */
      fprintf(OutFile, "   {\n");
      fprintf(OutFile, "    /#copies exch def\n");
      fprintf(OutFile, "   } def\n");
      fprintf(OutFile, "/@start\n");    /* - @start -  -- start everything */
      fprintf(OutFile, "   {\n");
      fprintf(OutFile, "    vmstatus pop /@VMused exch def pop\n");
      fprintf(OutFile, "   } def\n");
      fprintf(OutFile, "/@end\n");      /* - @end -  -- finished */
      fprintf(OutFile, "   {(VM Used: ) print @VMused @pri\n");
      fprintf(OutFile, "    (. Unused: ) print vmstatus @VMused sub @pri pop pop\n");
      fprintf(OutFile, "    (\\n) print flush\n");
      fprintf(OutFile, "    end\n");
      fprintf(OutFile, "    PSSave restore\n");
      fprintf(OutFile, "   } def\n");
      fprintf(OutFile, "/bop\n");       /* bop -  -- begin a new page */
      fprintf(OutFile, "   {\n");
      fprintf(OutFile, "    /SaveImage save def\n");
      fprintf(OutFile, "   } def\n");
      fprintf(OutFile, "/eop\n");       /* - eop -  -- end a page */
      fprintf(OutFile, "   {\n");
      fprintf(OutFile, "    showpage\n");
      fprintf(OutFile, "    SaveImage restore\n");
      fprintf(OutFile, "   } def\n");
      fprintf(OutFile, "/@line\n");     /* set line parameters */
      fprintf(OutFile, "   {0 setlinecap\n");
      fprintf(OutFile, "    0 setlinejoin\n");
      fprintf(OutFile, "    1 setmiterlimit\n");
      fprintf(OutFile, "   } def\n");
                        /* d @hsize -  horizontal clipping dimension */
      fprintf(OutFile, "/@hsize   {/hs exch def} def\n");
      fprintf(OutFile, "/@vsize   {/vs exch def} def\n");
                        /* d @hoffset - shift for the plots */
      fprintf(OutFile, "/@hoffset {/ho exch def} def\n");
      fprintf(OutFile, "/@voffset {/vo exch def} def\n");
                        /* s @hscale - scale factors */
      fprintf(OutFile, "/@hscale  {100 div /hsc exch def} def\n");
      fprintf(OutFile, "/@vscale  {100 div /vsc exch def} def\n");
                        /* s @lscale - linewidth scale factor */
      fprintf(OutFile, "/@lscale  {100 div /lin exch def} def\n");
      fprintf(OutFile, "/@lwidth  {lin lw mul setlinewidth} def\n");
      fprintf(OutFile, "/@SetPlot\n");  /* setup user specified offsets, */
      fprintf(OutFile, "   {\n");       /* scales, sizes for clipping    */
      fprintf(OutFile, "    ho vo translate\n");
      fprintf(OutFile, "    XScale YScale scale\n");
      fprintf(OutFile, "    lin lw mul setlinewidth\n");
      fprintf(OutFile, "   } def\n");
      fprintf(OutFile, "/XScale\n");    /* setup x scale */
      fprintf(OutFile, "   {hsc hs mul %d div} def\n", YPSSIZE);
      fprintf(OutFile, "/YScale\n");    /* setup y scale */
      fprintf(OutFile, "   {vsc vs mul %d div} def\n", XPSSIZE);
      fprintf(OutFile, "/lw 1 def\n");  /* default line width */
      fprintf(OutFile, "/M {moveto} def\n");
      fprintf(OutFile, "/D {lineto} def\n");
      fprintf(OutFile, "/S {stroke} def\n");
      fprintf(OutFile, "/Z {stroke newpath} def\n");
      fprintf(OutFile, "end\n\n");      /* end of dictionary definition */

  /* Set up the plots */

      fprintf(OutFile, "PSDict begin\n");
      fprintf(OutFile, "@start\n");
      fprintf(OutFile, "%d @copies\n", COPIES);
      fprintf(OutFile, "@line\n");
      fprintf(OutFile, "%d @hsize\n", YSIZE);
      fprintf(OutFile, "%d @vsize\n", XSIZE);
      fprintf(OutFile, "%d @hoffset\n", YOFFSET);
      fprintf(OutFile, "%d @voffset\n", XOFFSET);
      fprintf(OutFile, "%d @hscale\n", YSCALE);
      fprintf(OutFile, "%d @vscale\n", XSCALE);
      fprintf(OutFile, "%d @lscale\n", LINESCALE);
      fprintf(OutFile, "@SetPlot\n\n");
      fprintf(OutFile, "bop\n");
}

/* Sets the printer to text mode */
void pstext()
{
}

/* Sets the printer to graphics mode */
void psgraph()
{
}

/* Form feed */
void psclear()
{
     fprintf(OutFile," S\neop\nbop\n");
}

static int xlast, ylast;

void pspage()
{
     numpages++;
     fprintf(OutFile, "%%%%Page: %d %d\n", numpages, numpages);
     linepos = 0;
     xlast = -100000; ylast = -100000;
}

void pseop()
{
     fprintf(OutFile," S\neop\nbop\n");
     fflush(OutFile);
}

/* May put something here someday */
void pscolor(colour)
int colour;
{
}

void pswidth(width)
int width;
{
  if(width<1 || width>10)
    fprintf(stderr,"\nInvalid pen width selection.");
  else 
    fprintf(OutFile, " S\n/lw %d def\n@lwidth\n",width);
}

/* define coordinates of bounding box */
static int llx=XPSSIZE, lly=YPSSIZE, urx=0, ury=0;

void psline(x1,y1,x2,y2)
int x1,y1,x2,y2;
{
      static int ptcnt;
       
      if (linepos + 21 > LINELENGTH) {
          putc('\n', OutFile);
          linepos = 0;
      } else
          putc(' ', OutFile);

      if(!orient) {
         if(x1 == xlast && y1 == ylast && ptcnt < 40 ) {
            fprintf(OutFile, "%ld %ld D", PSX-y2, x2);
	    ptcnt++;
	 }
         else {
            fprintf(OutFile, "Z %ld %ld M %ld %ld D", PSX-y1, x1, PSX-y2, x2);
            llx = MIN(llx,PSX-y1);
            lly = MIN(lly,x1);
            urx = MAX(urx,PSX-y1);
            ury = MAX(ury,x1);
	    ptcnt = 1;
         }
         llx = MIN(llx,PSX-y2);
         lly = MIN(lly,x2);
         urx = MAX(urx,PSX-y2);
         ury = MAX(ury,x2);
      }
      else {
         if(x1 == xlast && y1 == ylast && ptcnt < 40 ) {
            fprintf(OutFile, "%ld %ld D", x2, y2);
	    ptcnt++;
	 }
         else {
            fprintf(OutFile, "Z %ld %ld M %ld %ld D", x1, y1, x2, y2);
            llx = MIN(llx,x1);
            lly = MIN(lly,y1);
            urx = MAX(urx,x1);
            ury = MAX(ury,y1);
	    ptcnt = 1;
         }
         llx = MIN(llx,x2);
         lly = MIN(lly,y2);
         urx = MAX(urx,x2);
         ury = MAX(ury,y2);
      }

      xlast = x2;
      ylast = y2;
      linepos += 21;
}

/* Close graphics file */
void pstidy()
{
      fprintf(OutFile," S\neop\n");
      fprintf(OutFile, "@end\n\n");
      fprintf(OutFile, "%%%%Trailer\n");
      llx /= ENLARGE;
      lly /= ENLARGE;
      urx /= ENLARGE;
      ury /= ENLARGE;
      llx += XOFFSET;
      lly += YOFFSET;
      urx += XOFFSET;
      ury += YOFFSET;
      fprintf(OutFile, "%%%%BoundingBox: %d %d %d %d\n",llx,lly,urx,ury);
      fprintf(OutFile, "%%%%Pages: %d\n", numpages);
      if(fileopen)
        fclose(OutFile);
      numpages = 0;
      linepos = 0;
      OutFile=NULL;
      orient=1;
}

void pscwin()
{
}

void psgwin()
{
}

/* Get the date and time */
static char *getdate()
{
        int len;
        long t, time();
        char *p, *ctime();

        t = time((long *) 0);
        p = ctime(&t);
        len = strlen(p);
        *(p + len - 1) = '\0';  /* zap the newline character */
        return p;
}

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