|
|
researchv10 Norman
/* Copyright (c) 1990 AT&T */
/* All Rights Reserved */
/* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T */
/* The copyright notice above does not evidence any */
/* actual or intended publication of such source code. */
/* @(#)picasso:picgen.c 1.0 */
#include "picasso.h"
#include "y.tab.h"
obj *picgen()
{
static double prevht = HT;
static double prevwid = WID; /* golden mean, sort of */
static char *prevname = "";
char *checkeps();
struct objattr obat;
double x0, y0, x1, y1, xwith, ywith;
char *epsname;
int i, at, with;
obj *p, *ppos;
Attr *ap;
epsname = NULL;
obat.a_ht = 0;
obat.a_wid = 0;
obat.a_layer = (int)getfval("curlayer");
obat.a_flags = EDGED;
obat.a_weight = obat.a_lcolor = obat.a_pcolor = obat.a_tcolor = -1;
obat.a_dashpat.a = (float *)0;
set_text();
at = with = xwith = ywith = 0;
for (i = 0; i < nattr; i++) {
ap = &attr[i];
switch (ap->a_type) {
default:
miscattrs(ap, &obat);
break;
case SAME:
obat.a_ht = prevht;
obat.a_wid = prevwid;
epsname = prevname;
break;
case WITH:
with = ap->a_val.i; /* corner */
break;
case AT:
ppos = ap->a_val.o;
curx = Xformx(ppos, 1, ppos->o_x, ppos->o_y);
cury = Xformy(ppos, 0, ppos->o_x, ppos->o_y);
at++;
break;
}
}
/*
* The first text string should be used as the name of an
* Encapsulated PostScript file. If missing, or if not an
* EPSF, it's an error.
*/
if ((epsname = checkeps(&obat, epsname)) == NULL)
return NULL;
if (with) {
switch (with) {
case NORTH: ywith = -obat.a_ht/2; break;
case SOUTH: ywith = obat.a_ht/2; break;
case EAST: xwith = -obat.a_wid/2; break;
case WEST: xwith = obat.a_wid/2; break;
case NE: xwith = -obat.a_wid/2;
ywith = -obat.a_ht/2; break;
case SE: xwith = -obat.a_wid/2;
ywith = obat.a_ht/2; break;
case NW: xwith = obat.a_wid/2;
ywith = -obat.a_ht/2; break;
case SW: xwith = obat.a_wid/2;
ywith = obat.a_ht/2; break;
case CENTER:
case START:
case END: break;
default: xwith = -obat.a_wid/2 * xdelta[with%8];
ywith = -obat.a_ht/2 * ydelta[with%8]; break;
}
curx += xwith;
cury += ywith;
}
if (!at) {
if (isright(hvmode))
curx += obat.a_wid/2;
else if (isleft(hvmode))
curx -= obat.a_wid/2;
else if (isup(hvmode))
cury += obat.a_ht/2;
else
cury -= obat.a_ht/2;
}
p = makenode(PSFILE, N_VAL+1, obat.a_layer);
p->o_val[N_VAL-1].p = epsname;
p->o_val[N_VAL].f = 0.; /* rounded corners, yet */
p->o_wid = obat.a_wid;
p->o_ht = obat.a_ht;
x0 = curx - obat.a_wid/2;
y0 = cury - obat.a_ht/2;
x1 = curx + obat.a_wid/2;
y1 = cury + obat.a_ht/2;
primattrs(p,&obat);
text_bounds(p);
track_bounds(x0-p->o_weight/2, y0-p->o_weight/2,
x1+p->o_weight/2, y1+p->o_weight/2);
if (isright(hvmode))
curx = x1;
else if (isleft(hvmode))
curx = x0;
else if (isup(hvmode))
cury = y1;
else
cury = y0;
prevht = obat.a_ht;
prevwid = obat.a_wid;
prevname = epsname;
return(p);
}
char *
checkeps(obat, tname)
struct objattr *obat;
char *tname;
{
int urx, ury, llx, lly;
char buf[128];
FILE *fp;
if (tname != NULL)
return tname;
if (ntext1 == ntext) { /* nostrings */
yyerror("no EPS file named");
return NULL;
}
tname = text[ntext1].t_val;
if ((fp = fopen(tname, "r")) == NULL) {
yyerror("can't read EPS file %s", tname);
return NULL;
}
ntext1++; /* filename is NOT one of the label strings */
llx = lly == - (urx = ury = -65535);
while (fgets(buf, 128, fp) != NULL) {
if (strncmp(buf, "%%BoundingBox:", 14) != 0)
continue;
llx = lly == - (urx = ury = -65535);
if (sscanf(buf+14, "%d %d %d %d", &llx, &lly, &urx, &ury) > 2)
break;
}
fclose(fp);
/* NOTE: if no BoundingBox comment was found, size will be 0x0 */
/* unless height and width were set explicitly */
if (urx < llx)
urx = llx;
if (ury < lly)
ury = lly;
if (obat->a_wid == 0 && obat->a_ht == 0) {
obat->a_wid = (double) (urx - llx) / pgscale;
obat->a_ht = (double) (ury - lly) / pgscale;
}
else if (obat->a_wid == 0 && ury - lly != 0)
obat->a_wid = obat->a_ht * (urx - llx) / (ury - lly);
else if (obat->a_ht == 0 && urx - llx != 0)
obat->a_ht = obat->a_wid * (ury - lly) / (urx - llx);
if (obat->a_wid == 0)
obat->a_wid = getfval("boxwid");
if (obat->a_ht == 0)
obat->a_ht = getfval("boxht");
return tname;
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.