home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 15
/
CD_ASCQ_15_070894.iso
/
news
/
683
/
hpgl312
/
to_eps.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-04-18
|
9KB
|
371 lines
/*
Copyright (c) 1991 - 1993 Heinz W. Werntges. All rights reserved.
Distributed by Free Software Foundation, Inc.
This file is part of HP2xx.
HP2xx is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY. No author or distributor accepts responsibility
to anyone for the consequences of using it or for whether it serves any
particular purpose or works at all, unless he says so in writing. Refer
to the GNU General Public License, Version 2 or later, for full details.
Everyone is granted permission to copy, modify and redistribute
HP2xx, but only under the conditions described in the GNU General Public
License. A copy of this license is supposed to have been
given to you along with HP2xx so you can know your rights and
responsibilities. It should be in a file named COPYING. Among other
things, the copyright notice and this notice must be preserved on all
copies.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
/** to_eps.c: Converter to Encapsulated PostScript format;
** (derived from PLPLOT driver "postscript.c")
**
** 91/06/29 V 1.00 HWW Derived from postscript.c
** 91/10/15 V 1.01 HWW ANSI_C
** 91/11/20 V 1.02 HWW Changes due to "SPn;"
** 91/12/22 V 1.02a HWW Many small changes
** 92/05/17 V 1.02b HWW Output to stdout if outfile == '-'
** 92/05/24 V 1.10a HWW Color supported (RGB)
** 92/10/20 V 1.10b HWW Bug fix: Setting color implies a new path
** 92/12/12 V 1.10c HWW Info line now interprets outfile=='-' as "stdout"
** 93/04/12 V 1.10d HWW Explicit prototypes for time() and ctime() removed;
** VMstatus reports only if !p->quiet
**/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h>
#include "bresnham.h"
#include "hp2xx.h"
#define A4_height 297 /* in [mm] */
extern float xmin, xmax, ymin, ymax;
static linecount = 0;
static float coord2mm;
/**
** Close graphics file
**/
void ps_end (FILE *fd)
{
fprintf(fd," S\neop\n");
fprintf(fd, "@end\n");
fprintf(fd, "%%Trailer\n");
fclose (fd);
linecount = 0;
}
/**
** Flush old path and move
**/
void ps_stroke_and_move_to (HPGL_Pt *ppt, FILE *fd)
{
fprintf(fd, " S\n%6.2f %6.2f M", /* S: Start a new path */
(ppt->x-xmin) * coord2mm, (ppt->y-ymin) * coord2mm);
linecount = 0;
}
/**
** Set line width
**/
void ps_set_linewidth (double width, HPGL_Pt *ppt, FILE *fd)
{
ps_stroke_and_move_to (ppt, fd); /* MUST start a new path! */
fprintf (fd," %6.3f W\n", width);
}
/**
** Set RGB color
**/
void ps_set_color (double red, double green, double blue,
HPGL_Pt *ppt, FILE *fd)
{
ps_stroke_and_move_to (ppt, fd); /* MUST start a new path! */
fprintf (fd," %6.3f %6.3f %6.3f C\n", red, green, blue);
}
void ps_line_to (HPGL_Pt *ppt, char mode, FILE *fd)
{
if (linecount > 3)
{
putc('\n', fd);
linecount = 0;
}
else
putc(' ', fd);
fprintf(fd, "%6.2f %6.2f %c",
(ppt->x-xmin) * coord2mm, (ppt->y-ymin) * coord2mm, mode);
linecount++;
}
/**
** Get the date and time: This is optional, since its result only
** appeares in the PS header.
**/
char *Getdate (void)
{
int len;
long t;
char *p;
t = time((long *) 0);
p = ctime(&t);
len = strlen(p);
*(p + len - 1) = '\0'; /* zap the newline character */
return p;
}
/**
** PostScript definitions
**/
void ps_init (PAR *p, FILE *fd)
{
long left, right, low, high;
int pensize;
pensize = p->pensize[p->pen];
/**
** Header comments into PostScript file
**/
fprintf(fd,"%%!PS-Adobe-2.0 EPSF-2.0\n");
fprintf(fd,"%%%%Title: %s\n", p->outfile);
fprintf(fd,"%%%%Creator: hp2xx (c) 1991, 1992 by H. Werntges\n");
fprintf(fd,"%%%%CreationDate: %s\n", Getdate());
fprintf(fd,"%%%%Pages: 1\n");
/**
** Bounding Box limits: Conversion factor: 2.834646 * 1/72" = 1 mm
**/
left = (long) floor( p->xoff * 2.834646);
low = (long) floor((A4_height-p->yoff-p->height)* 2.834646);
right = (long) ceil ((p->xoff + p->width) * 2.834646);
high = (long) ceil ((A4_height - p->yoff) * 2.834646);
fprintf(fd,"%%%%BoundingBox: %ld %ld %ld %ld\n", left, low, right, high);
if (!p->quiet)
fprintf(stderr,"Bounding Box: [%ld %ld %ld %ld]\n",
left, low, right, high);
fprintf(fd,"%%%%EndComments\n\n");
/**
** Definitions
**/
fprintf(fd,"%%%%BeginProcSet\n");
fprintf(fd,"/PSSave save def\n"); /* save VM state */
fprintf(fd,"/PSDict 200 dict def\n"); /* define a dictionary */
fprintf(fd,"PSDict begin\n"); /* start using it */
fprintf(fd,"/@restore /restore load def\n");
fprintf(fd,"/restore\n");
fprintf(fd," {vmstatus pop\n");
fprintf(fd," dup @VMused lt {pop @VMused} if\n");
fprintf(fd," exch pop exch @restore /@VMused exch def\n");
fprintf(fd," } def\n");
fprintf(fd,"/@pri\n");
fprintf(fd," {\n");
fprintf(fd," ( ) print\n");
fprintf(fd," ( ) cvs print\n");
fprintf(fd," } def\n");
fprintf(fd,"/@start\n"); /* - @start - -- start everything */
fprintf(fd," {\n");
fprintf(fd," vmstatus pop /@VMused exch def pop\n");
fprintf(fd," } def\n");
fprintf(fd,"/@end\n"); /* - @end - -- finished */
fprintf(fd," {");
if (!p->quiet)
{
fprintf(fd, "(VM Used: ) print @VMused @pri\n");
fprintf(fd," (. Unused: ) print vmstatus @VMused sub @pri pop pop\n");
fprintf(fd," (\\n) print flush\n");
}
fprintf(fd," end\n");
fprintf(fd," PSSave restore\n");
fprintf(fd," } def\n");
fprintf(fd,"/bop\n"); /* bop - -- begin a new page */
fprintf(fd," {\n");
fprintf(fd," /SaveImage save def\n");
fprintf(fd," } def\n");
fprintf(fd,"/eop\n"); /* - eop - -- end a page */
fprintf(fd," {\n");
fprintf(fd," showpage\n");
fprintf(fd," SaveImage restore\n");
fprintf(fd," } def\n");
fprintf(fd,"/@line\n"); /* set line parameters */
fprintf(fd," {1 setlinecap %%%% Replace 1 by 0 for cut-off lines\n");
fprintf(fd," 1 setlinejoin %%%% Replace 1 by 0 for cut-off lines\n");
fprintf(fd,"%%%% 1 setmiterlimit %%%% Uncomment this for cut-off lines\n");
fprintf(fd," } def\n");
fprintf(fd,"/@SetPlot\n");
fprintf(fd," {\n");
fprintf(fd," 2.834646 2.834646 scale\n"); /* 1/72"--> mm */
fprintf(fd," %7.3f %7.3f translate\n", p->xoff,
A4_height - p->yoff - p->height);
fprintf(fd," %6.3f setlinewidth\n", pensize/10.0);
fprintf(fd," } def\n");
fprintf(fd,"/C {setrgbcolor} def\n");
fprintf(fd,"/D {lineto} def\n");
fprintf(fd,"/M {moveto} def\n");
fprintf(fd,"/S {stroke} def\n");
fprintf(fd,"/W {setlinewidth} def\n");
fprintf(fd,"/Z {stroke newpath} def\n");
fprintf(fd,"%%%%EndProcSet\n");
fprintf(fd,"end\n\n"); /* end of dictionary definition */
/**
** Set up the plots
**/
fprintf(fd,"%%%%BeginSetup\n");
fprintf(fd,"PSDict begin\n");
fprintf(fd,"@start\n");
fprintf(fd,"@line\n");
fprintf(fd,"@SetPlot\n\n");
fprintf(fd,"bop\n");
fprintf(fd,"%%%%EndSetup\n");
}
/**
** Higher-level interface: Output Encapsulated PostScript format
**/
void to_eps (PAR *p, FILE *td)
{
PlotCmd cmd;
HPGL_Pt pt1 = {0};
FILE *md;
int pensize, pencolor;
if (!p->quiet)
fprintf(stderr,"\n\n- Writing EPS code to \"%s\"\n",
*p->outfile == '-' ? "stdout" : p->outfile);
/* Init. of PostScript file: */
if (*p->outfile != '-')
{
if ((md = fopen(p->outfile, "w")) == NULL)
{
perror("hp2xx (eps)");
exit(ERROR);
}
}
else
md = stdout;
/* PS header */
ps_init (p, md);
/* Factor for transformation of HP coordinates to mm */
coord2mm = p->height / (ymax-ymin);
pensize = p->pensize[p->pen];
if (pensize != 0)
fprintf(md," %6.3f W\n", pensize/10.0);
/**
** Command loop: While temporaty file not empty process command.
**/
while ((cmd = PlotCmd_from_tmpfile()) != EOF)
{
switch (cmd)
{
case NOP:
break;
case SET_PEN:
if ((p->pen = fgetc(td)) == EOF)
{
perror("Unexpected end of temp. file: ");
exit (ERROR);
}
pensize = p->pensize[p->pen];
if (pensize != 0)
ps_set_linewidth ((double) pensize/10.0, &pt1, md);
pencolor = p->pencolor[p->pen];
ps_set_color ( p->Clut[pencolor][0]/255.0,
p->Clut[pencolor][1]/255.0,
p->Clut[pencolor][2]/255.0,
&pt1, md);
break;
case MOVE_TO:
HPGL_Pt_from_tmpfile (&pt1);
if (pensize != 0)
ps_stroke_and_move_to (&pt1, md);
break;
case DRAW_TO:
HPGL_Pt_from_tmpfile (&pt1);
if (pensize != 0)
ps_line_to (&pt1, 'D', md);
break;
case PLOT_AT:
HPGL_Pt_from_tmpfile (&pt1);
if (pensize != 0)
{
ps_line_to (&pt1, 'M', md);
ps_line_to (&pt1, 'D', md);
}
break;
default:
fprintf(stderr,"Illegal cmd in temp. file!");
exit (ERROR);
}
}
/* Finish up */
ps_end (md);
if (md != stdout)
fclose (md);
if (!p->quiet)
fputc ('\n', stderr);
}