home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Photo CD Demo 1
/
Demo.bin
/
gle
/
gle
/
d_ps.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-11-29
|
16KB
|
600 lines
/*--------------------------------------------------------------*/
/* Post Script Driver, for GLE V3.0 */
/*--------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
#include "all.h"
#include <math.h>
#include "core.h"
#include "mygraph.h"
#include "mydev.h"
char *fontdir(char *s);
extern int MAX_VECTOR; /* Cant send POSTSCRIPT too complex a path */
static int ps_nvec;
extern int control_d;
extern int dev_eps;
extern struct gmodel g;
/*---------------------------------------------------------------------------*/
#define pi 3.141592653
#define false 0
#define true (!false)
extern int BLACKANDWHITE;
#define dbg if ((gle_debug & 64)>0)
extern int gle_debug;
char *font_getname(int i);
/*---------------------------------------------------------------------------*/
/* The global variables that CORE keeps track of */
/*-----------------------------------------------*/
FILE *psfile;
int i,l,j;
colortyp g_cur_fill,g_cur_color;
/*---------------------------------------------------------------------------*/
d_dfont(char *c)
{
/* only used for the DFONT driver which builds fonts */
}
/*---------------------------------------------------------------------------*/
d_tidyup()
{}
d_message(char *s)
{
#ifdef unix
printw("%s\n",s);
#else
printf("%s\n",s);
#endif
}
/*---------------------------------------------------------------------------*/
d_devcmd(char *s)
{
fprintf(psfile,"%s",s);
}
d_source(char *s)
{
dbg fprintf(psfile,"%% SOURCE, %s",s);
}
/*---------------------------------------------------------------------------*/
d_get_type(char *t)
{
strcpy(t,"HARDCOPY, PS, FILLPATH");
if (dev_eps) strcat(t,", EPS,");
}
/*---------------------------------------------------------------------------*/
d_set_path(int onoff)
{
}
/*---------------------------------------------------------------------------*/
d_newpath()
{
fprintf(psfile," newpath ");
ps_nvec = 0;
}
/*---------------------------------------------------------------------------*/
extern char output_file[];
extern char input_file[];
d_open(double width, double height)
{
char *outfile;
char *s;
char outfileb[90] = "out.ps";
outfile = &outfileb[0];
s = strrchr(input_file,'.');
if (s!=NULL) {
strcpy(outfile,input_file);
s = strrchr(outfile,'.');
if (dev_eps) strcpy(s,".eps");
else strcpy(s,".ps");
}
if (output_file[0]!=0) outfile = &output_file[0];
psfile = fopen(outfile,"w");
if (psfile == NULL) { perror("PS open file GLE_OUTPUT: ") ; exit(2); }
#ifdef __TURBOC__
printf("\n Writing output to file (%s) \n",outfile);
#endif
if (!dev_eps) {
if (control_d) fprintf(psfile,"\x04 \n");
fprintf(psfile,"%%!PS-Adobe-1.0 \n");
} else {
fprintf(psfile,"%%!PS-Adobe-2.0 EPSF-2.0 \n");
}
fprintf(psfile,"%%%%BoundingBox: -1 -1 %g %g \n",72*width/2.54+1,72*height/2.54+1);
fprintf(psfile,"%%%%EndComments \n");
fprintf(psfile,"%%%%EndProlog \n");
fprintf(psfile,"gsave \n");
fprintf(psfile," \n");
fprintf(psfile,"/f {findfont exch scalefont setfont} bind def \n");
fprintf(psfile,"/s {show} bind def \n");
fprintf(psfile,"/ps {true charpath} bind def \n");
fprintf(psfile,"/l {lineto} bind def \n");
fprintf(psfile,"/m {newpath moveto} bind def \n");
fprintf(psfile,"matrix currentmatrix /originmat exch def \n");
fprintf(psfile,"/umatrix {originmat matrix concatmatrix setmatrix} def \n");
fprintf(psfile," \n");
}
/*---------------------------------------------------------------------------*/
d_close()
{
g_flush();
fprintf(psfile,"showpage \n");
fprintf(psfile,"grestore \n");
fprintf(psfile,"%%%%Trailer \n");
if (!dev_eps) if (control_d) fprintf(psfile,"\x04 \n");
fclose(psfile);
}
/*---------------------------------------------------------------------------*/
d_set_line_cap(int i)
{
/* lcap, 0= butt, 1=round, 2=projecting square */
if (!g.inpath) g_flush();
fprintf(psfile,"%d setlinecap \n",i);
}
/*---------------------------------------------------------------------------*/
d_set_line_join(int i)
{
if (!g.inpath) g_flush();
fprintf(psfile,"%d setlinejoin \n",i);
}
/*---------------------------------------------------------------------------*/
d_set_line_miterlimit(double d)
{
if (!g.inpath) g_flush();
fprintf(psfile,"%g setmiterlimit \n",d);
}
/*---------------------------------------------------------------------------*/
d_set_line_width(double w)
{
if (w==0) w = 0.02;
if (w<.0002) w = 0;
if (!g.inpath) g_flush();
fprintf(psfile,"%g setlinewidth \n",w);
}
/*---------------------------------------------------------------------------*/
d_set_line_styled(double dd)
{}
d_set_line_style(char *s)
{
/* should deal with [] for solid lines */
static char *defline[] = {"","","12","41","14","92","1282"
,"9229","4114","54","73","7337","6261","2514"};
static char ob[200];
int l;
if (!g.inpath) g_flush();
strcpy(ob,"[");
if (strlen(s)==1) s = defline[*s-'0'];
l = strlen(s);
for (i=0;i<l;i++)
sprintf(ob+strlen(ob),"%g ",(*(s+i)-'0')*g.lstyled);
strcat(ob,"]");
fprintf(psfile,"%s 0 setdash \n",ob);
}
/*---------------------------------------------------------------------------*/
d_fill()
{
fprintf(psfile,"gsave \n");
ddfill();
fprintf(psfile,"grestore \n");
}
ddfill()
{
if (g_cur_fill.b[B_F] == 255) return; /* clear fill, do nothing */
if (g_cur_fill.b[B_F] == 2) {d_shade(); return;}
set_fill(); /*because color and fill are the same*/
fprintf(psfile,"fill \n");
set_color();
}
d_shade()
{
double x,y,step1,step2;
fprintf(psfile,"gsave \n");
fprintf(psfile,"clip \n");
fprintf(psfile,"newpath \n");
fprintf(psfile,"0 setgray \n");
step1 = g_cur_fill.b[B_B]/160.0;
step2 = g_cur_fill.b[B_G]/160.0;
fprintf(psfile,"%g setlinewidth\n",(double) g_cur_fill.b[B_R]/160.0);
if (step1>0) {
fprintf(psfile,"%g %g %g { /x exch def \n",-40.0,step1,40.0);
fprintf(psfile,"x 0 moveto 40 x add 40 lineto stroke\n");
fprintf(psfile,"} for \n");
}
if (step2>0) {
fprintf(psfile,"%g %g %g { /x exch def \n",0.0,step2,80.0);
fprintf(psfile,"x 0 moveto -40 x add 40 lineto stroke\n");
fprintf(psfile,"} for \n");
}
fprintf(psfile,"grestore \n");
/* d_set_line_width(g.lwidth); */
}
/*---------------------------------------------------------------------------*/
d_fill_ary(int nwk,double (*wkx)[],double (*wky)[])
{
int i;
fprintf(psfile,"gsave \n");
fprintf(psfile,"newpath \n");
fprintf(psfile,"%g %g moveto \n",(*wkx)[0],(*wky)[0]);
for (i=1;i<nwk;i++)
fprintf(psfile,"%g %g l \n",(*wkx)[i],(*wky)[i]);
set_fill();
fprintf(psfile,"fill \n");
set_color();
fprintf(psfile,"grestore \n");
}
d_line_ary(int nwk,double (*wkx)[],double (*wky)[])
{
int i;
fprintf(psfile,"gsave \n");
fprintf(psfile,"newpath \n");
fprintf(psfile,"%g %g moveto \n",(*wkx)[0],(*wky)[0]);
for (i=1;i<nwk;i++)
fprintf(psfile,"%g %g l \n",(*wkx)[i],(*wky)[i]);
fprintf(psfile,"stroke \n");
fprintf(psfile,"grestore \n");
}
/*---------------------------------------------------------------------------*/
d_stroke()
{
fprintf(psfile,"gsave \n");
fprintf(psfile,"stroke \n");
fprintf(psfile,"grestore \n");
}
/*---------------------------------------------------------------------------*/
d_clip()
{
fprintf(psfile,"clip \n");
}
/*---------------------------------------------------------------------------*/
d_set_matrix(double newmat[3][3])
{
fprintf(psfile," [%g %g %g %g %g %g] umatrix \n ",
newmat[0][0],newmat[1][0],newmat[0][1],
newmat[1][1],newmat[0][2],newmat[1][2]);
}
/*---------------------------------------------------------------------------*/
d_move(double zx,double zy)
{
if (g.inpath==true)
fprintf(psfile,"%g %g moveto \n",zx,zy);
else {
ps_nvec++;
fprintf(psfile,"%g %g m \n",zx,zy);
}
}
/*---------------------------------------------------------------------------*/
d_reverse() /* reverse the order of stuff in the current path */
{
fprintf(psfile,"reversepath \n");
}
/*---------------------------------------------------------------------------*/
d_closepath()
{
fprintf(psfile,"closepath \n");
}
/*---------------------------------------------------------------------------*/
d_line(double zx,double zy)
{
dbg gprint("in d_line g.curx,y %g %g ",g.curx,g.cury);
if (g.xinline==false) {
d_move(g.curx,g.cury);
}
ps_nvec++;
if (ps_nvec>MAX_VECTOR) {
gprint("Warning, complex path, if filling fails then try /nomaxpath \n");
ps_nvec = 0; g_flush(); d_move(g.curx,g.cury);
}
if (fprintf(psfile,"%g %g l \n",zx,zy)==EOF) {
perror("=========Unable to write to output file ");
}
}
/*---------------------------------------------------------------------------*/
d_clear()
{
int flipit;
g_scale(72.0,72.0);
g_scale(.393701,.393701);
if (!dev_eps) g_translate(1.5,1.01);
if ((!dev_eps) && (g.userwidth>g.userheight)) {
fprintf(psfile,"%% Flipping coord system \n");
g_move(0.0,0.0);
g_rotate(90.0);
g_translate(0.0,-g.userheight);
g_move(0.0,0.0);
}
}
/*---------------------------------------------------------------------------*/
d_flush()
{
if (g.inpath) return;
if (g.xinline) {
fprintf(psfile,"stroke \n");
ps_nvec = 0;
}
}
/*---------------------------------------------------------------------------*/
d_arcto(dbl x1,dbl y1,dbl x2,dbl y2,dbl rrr)
{
if (g.xinline==false) d_move(g.curx,g.cury);
fprintf(psfile,"%g %g %g %g %g arcto %g %g l \n",x1,y1,x2,y2,rrr,x2,y2);
g.xinline = true;
}
/*---------------------------------------------------------------------------*/
d_arc(dbl r,dbl t1,dbl t2,dbl cx,dbl cy)
{
double dx,dy;
polar_xy(r,t1,&dx,&dy);
if (!g.inpath) g_move(cx+dx,cy+dy);
fprintf(psfile,"%g %g %g %g %g arc \n",cx,cy,r,t1,t2);
g.xinline = true;
if (!g.inpath) g_move(cx,cy);
}
/*---------------------------------------------------------------------------*/
d_narc(dbl r,dbl t1,dbl t2,dbl cx,dbl cy)
{
double dx,dy;
polar_xy(r,t1,&dx,&dy);
if (!g.inpath) g_move(cx+dx,cy+dy);
fprintf(psfile,"%g %g %g %g %g arcn \n",cx,cy,r,t1,t2);
g.xinline = true;
if (!g.inpath) g_move(cx,cy);
}
/*---------------------------------------------------------------------------*/
d_box_fill(dbl x1, dbl y1, dbl x2, dbl y2)
{
if (g.inpath==true) xdbox(x1,y1,x2,y2);
else {
g_flush();
fprintf(psfile," newpath ");
xdbox(x1,y1,x2,y2);
ddfill();
fprintf(psfile,"newpath \n");
/* set_fill();
fprintf(psfile,"fill \n");
set_color();
*/
}
}
d_box_stroke(dbl x1, dbl y1, dbl x2, dbl y2)
{
if (g.inpath==true) xdbox(x1,y1,x2,y2);
else {
g_flush();
fprintf(psfile," newpath ");
xdbox(x1,y1,x2,y2);
fprintf(psfile,"stroke \n");
ps_nvec = 0;
}
}
/*---------------------------------------------------------------------------*/
xdbox(double x1, double y1, double x2, double y2)
{
fprintf(psfile," %g %g moveto %g %g l %g %g l %g %g l closepath \n"
,x1,y1,x2,y1,x2,y2,x1,y2);
}
/*---------------------------------------------------------------------------*/
d_circle_stroke(double zr)
{
double x,y;
g_get_xy(&x,&y);
if (g.inpath==true)
fprintf(psfile," %g %g %g 0 360 arc \n",x,y,zr);
else {
g_flush();
fprintf(psfile," newpath ");
fprintf(psfile," %g %g %g 0 360 arc \n",x,y,zr);
fprintf(psfile,"stroke \n");
}
}
d_circle_fill(double zr)
{
double x=g.curx,y=g.cury;
if (g.inpath==true)
fprintf(psfile," %g %g %g 0 360 arc \n",x,y,zr);
else {
g_flush();
fprintf(psfile,"newpath ");
fprintf(psfile,"%g %g %g 0 360 arc \n",x,y,zr);
ddfill();
fprintf(psfile,"newpath \n");
/*
set_fill();
fprintf(psfile,"fill \n");
set_color();
*/
}
}
/*---------------------------------------------------------------------------*/
d_bezier(dbl x1,dbl y1,dbl x2,dbl y2,dbl x3,dbl y3)
{
double x=g.curx,y=g.cury;
if (g.inpath==true)
fprintf(psfile,"%g %g %g %g %g %g curveto \n"
,x1,y1,x2,y2,x3,y3);
else {
g_flush();
if (!g.xinline) fprintf(psfile,"%g %g moveto ",x,y);
fprintf(psfile,"%g %g %g %g %g %g curveto \n"
,x1,y1,x2,y2,x3,y3);
g.xinline = true;
}
}
/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
test_psfile()
{
if (psfile==NULL) return;
set_color();
}
set_color()
{
if (BLACKANDWHITE) {
fprintf(psfile,"%g setgray \n",((g_cur_color.b[B_R]*3.0/255.0
+g_cur_color.b[B_G]*2.0/255.0+g_cur_color.b[B_B]/255.0) / 6));
} else
fprintf(psfile,"%g %g %g setrgbcolor \n",g_cur_color.b[B_R]/255.0
,g_cur_color.b[B_G]/255.0,g_cur_color.b[B_B]/255.0);
}
set_fill()
{
if (BLACKANDWHITE) {
fprintf(psfile,"%g setgray \n",((g_cur_fill.b[B_R]*3.0/255.0
+g_cur_fill.b[B_G]*2.0/255.0+g_cur_fill.b[B_B]/255.0) / 6));
} else
fprintf(psfile,"%g %g %g setrgbcolor \n",g_cur_fill.b[B_R]/255.0
,g_cur_fill.b[B_G]/255.0,g_cur_fill.b[B_B]/255.0);
}
/*---------------------------------------------------------------------------*/
d_set_color(long f)
{
g_flush();
g_cur_color.l = f;
set_color();
}
d_set_fill(long f)
{
g_cur_fill.l = f;
}
/*---------------------------------------------------------------------------*/
d_beginclip()
{
fprintf(psfile,"gsave \n");
}
d_endclip()
{
char *state;
g_flush();
fprintf(psfile,"grestore \n");
state = myallocz(300);
g_get_state(state);
g_set_state(state);
myfree(state);
}
/*---------------------------------------------------------------------------*/
struct psfont_struct {char *sname; char *lname;} ;
struct psfont_struct psf[70] = { /* leaves room for twenty more from PSFONT.DAT*/
"PSTR", "Times-Roman",
"PSTI", "Times-Italic",
"PSTB", "Times-Bold",
"PSTBI", "Times-BoldItalic",
"RM", "Times-Roman",
"RMI", "Times-Italic",
"RMB", "Times-Bold",
"RMBI", "Times-BoldItalic",
"SS", "Helvetica",
"SSB", "Helvetica-Bold",
"SSI", "Helvetica-Oblique",
"SSBI", "Helvetica-BoldOblique",
"PSH", "Helvetica",
"PSHB", "Helvetica-Bold",
"PSHBO", "Helvetica-BoldOblique",
"PSHO", "Helvetica-Oblique",
"PSAGB", "AvantGarde-Book",
"PSAGBO", "AvantGarde-BookOblique",
"PSAGD", "AvantGarde-Demi",
"PSAGDO", "AvantGarde-DemiOblique",
"PSBD", "Bookman-Demi",
"PSBDI", "Bookman-DemiItalic",
"PSBL", "Bookman-Light",
"PSBLI", "Bookman-LightItalic",
"PSC", "Courier",
"PSCB", "Courier-Bold",
"PSCBO", "Courier-BoldOblique",
"PSCO", "Courier-Oblique",
"TT", "Courier",
"TTB", "Courier-Bold",
"TTBI", "Courier-BoldOblique",
"TTI", "Courier-Oblique",
"PSNCSB", "NewCenturySchlbk-Bold",
"PSNCSBI", "NewCenturySchlbk-BoldItalic",
"PSNCSI", "NewCenturySchlbk-Italic",
"PSNCSR", "NewCenturySchlbk-Roman",
"PSPB", "Palatino-Bold",
"PSPBI", "Palatino-BoldItalic",
"PSPI", "Palatino-Italic",
"PSPR", "Palatino-Roman",
"PSZCMI", "ZapfChancery-MediumItalic",
"PSZD", "ZapfDingbats",
"PSSYM", "Symbol",
NULL,NULL
};
/*---------------------------------------------------------------------------*/
d_char(int font, int cc)
{
double x,y;
char *s;
static int this_font;
static double this_size;
read_psfont();
if (font_get_encoding(font)>2) {
my_char(font,cc);
return;
}
if (this_font!=font || this_size!=g.fontsz) {
if (g.fontsz<0.00001) {
gprint("Font size is zero, error ********* \n");
return;
}
s = font_getname(font);
for (i=0;;i++) {
if (psf[i].sname==NULL) break;
dbg printf("font match {%s} {%s} \n",s,psf[i].sname);
if (strcmp(psf[i].sname,s)==0) break;
}
if (psf[i].sname==NULL) {
my_char(font,cc);
return;
}
this_font = font;
this_size = g.fontsz;
fprintf(psfile," %f /%s f ",g.fontsz,psf[i].lname);
}
if (g.inpath==true) {
if (isalnum(cc) && cc<127) fprintf(psfile,"(%c) ps ",cc);
else fprintf(psfile,"(\\%o) ps ",cc);
} else {
if (isalnum(cc) && cc<127) fprintf(psfile,"(%c) s ",cc);
else fprintf(psfile,"(\\%o) s ",cc);
}
}
char *fontdir(char *s);
read_psfont() /* add aditional ps fonts, e.g. pstr = TimesRoman */
{
static init_done;
FILE *fptr;
char fname[80],*s;
char inbuff[90];
if (init_done) return;
init_done = true;
/* Find last used psf */
for (i=0;;i++) if (psf[i].sname==NULL) break;
strcpy(fname,fontdir("psfont.dat"));
fptr = fopen(fname,"r");
if (fptr==0) return; /* if not exists then don't bother */
for (fgets(inbuff,200,fptr);!feof(fptr);fgets(inbuff,200,fptr)) {
s = strchr(inbuff,'!');
if (s!=NULL) *s=0;
s = strtok(inbuff," \t,\n");
if (s!=NULL) if (*s!='\n') {
psf[i].sname = sdup(s);
s = strtok(0," \t,\n");
psf[i].lname = sdup(s);
i++;
}
}
psf[i].sname = NULL;
psf[i].lname = NULL;
}