Annotation of researchv10no/cmd/picasso/picgen.c, revision 1.1.1.1

1.1       root        1: /*     Copyright (c) 1990 AT&T */
                      2: /*       All Rights Reserved   */
                      3: 
                      4: /*     THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T     */
                      5: /*     The copyright notice above does not evidence any        */
                      6: /*     actual or intended publication of such source code.     */
                      7: 
                      8: /*     @(#)picasso:picgen.c    1.0     */
                      9: #include       "picasso.h"
                     10: #include       "y.tab.h"
                     11: 
                     12: obj *picgen()
                     13: {
                     14:        static  double  prevht  = HT;
                     15:        static  double  prevwid = WID;  /* golden mean, sort of */
                     16:        static  char    *prevname = "";
                     17: 
                     18:        char    *checkeps();
                     19:        struct  objattr obat;
                     20:        double  x0, y0, x1, y1, xwith, ywith;
                     21:        char    *epsname;
                     22:        int     i, at, with;
                     23:        obj     *p, *ppos;
                     24:        Attr    *ap;
                     25: 
                     26:        epsname = NULL;
                     27:        obat.a_ht  = 0;
                     28:        obat.a_wid = 0;
                     29:        obat.a_layer = (int)getfval("curlayer");
                     30:        obat.a_flags = EDGED;
                     31:        obat.a_weight = obat.a_lcolor = obat.a_pcolor = obat.a_tcolor = -1;
                     32:        obat.a_dashpat.a = (float *)0;
                     33:        set_text();
                     34:        at = with = xwith = ywith = 0;
                     35:        for (i = 0; i < nattr; i++) {
                     36:                ap = &attr[i];
                     37:                switch (ap->a_type) {
                     38:                default:
                     39:                        miscattrs(ap, &obat);
                     40:                        break;
                     41:                case SAME:
                     42:                        obat.a_ht  = prevht;
                     43:                        obat.a_wid = prevwid;
                     44:                        epsname = prevname;
                     45:                        break;
                     46:                case WITH:
                     47:                        with = ap->a_val.i;     /* corner */
                     48:                        break;
                     49:                case AT:
                     50:                        ppos = ap->a_val.o;
                     51:                        curx = Xformx(ppos, 1, ppos->o_x, ppos->o_y);
                     52:                        cury = Xformy(ppos, 0, ppos->o_x, ppos->o_y);
                     53:                        at++;
                     54:                        break;
                     55:                }
                     56:        }
                     57:        /*
                     58:         *      The first text string should be used as the name of an
                     59:         *      Encapsulated PostScript file.  If missing, or if not an
                     60:         *      EPSF, it's an error.
                     61:         */
                     62:        if ((epsname = checkeps(&obat, epsname)) == NULL)
                     63:                return NULL;
                     64:        if (with) {
                     65:                switch (with) {
                     66:                case NORTH:     ywith = -obat.a_ht/2;                   break;
                     67:                case SOUTH:     ywith =  obat.a_ht/2;                   break;
                     68:                case EAST:      xwith = -obat.a_wid/2;                  break;
                     69:                case WEST:      xwith =  obat.a_wid/2;                  break;
                     70:                case NE:        xwith = -obat.a_wid/2;
                     71:                                ywith = -obat.a_ht/2;                   break;
                     72:                case SE:        xwith = -obat.a_wid/2;
                     73:                                ywith =  obat.a_ht/2;                   break;
                     74:                case NW:        xwith =  obat.a_wid/2;
                     75:                                ywith = -obat.a_ht/2;                   break;
                     76:                case SW:        xwith =  obat.a_wid/2;
                     77:                                ywith =  obat.a_ht/2;                   break;
                     78:                case CENTER:
                     79:                case START:
                     80:                case END:                                               break;
                     81:                default:        xwith =  -obat.a_wid/2 * xdelta[with%8];
                     82:                                ywith =  -obat.a_ht/2  * ydelta[with%8];         break;
                     83:                }
                     84:                curx += xwith;
                     85:                cury += ywith;
                     86:        }
                     87:        if (!at) {
                     88:                if (isright(hvmode))
                     89:                        curx += obat.a_wid/2;
                     90:                else if (isleft(hvmode))
                     91:                        curx -= obat.a_wid/2;
                     92:                else if (isup(hvmode))
                     93:                        cury += obat.a_ht/2;
                     94:                else
                     95:                        cury -= obat.a_ht/2;
                     96:        }
                     97:        p = makenode(PSFILE, N_VAL+1, obat.a_layer);
                     98:        p->o_val[N_VAL-1].p = epsname;
                     99:        p->o_val[N_VAL].f = 0.;         /* rounded corners, yet */
                    100:        p->o_wid = obat.a_wid;
                    101:        p->o_ht  = obat.a_ht;
                    102:        x0 = curx - obat.a_wid/2;
                    103:        y0 = cury - obat.a_ht/2;
                    104:        x1 = curx + obat.a_wid/2;
                    105:        y1 = cury + obat.a_ht/2;
                    106:        primattrs(p,&obat);
                    107:        text_bounds(p);
                    108:        track_bounds(x0-p->o_weight/2, y0-p->o_weight/2,
                    109:                     x1+p->o_weight/2, y1+p->o_weight/2);
                    110:        if (isright(hvmode))
                    111:                curx = x1;
                    112:        else if (isleft(hvmode))
                    113:                curx = x0;
                    114:        else if (isup(hvmode))
                    115:                cury = y1;
                    116:        else
                    117:                cury = y0;
                    118:        prevht  = obat.a_ht;
                    119:        prevwid = obat.a_wid;
                    120:        prevname = epsname;
                    121:        return(p);
                    122: }
                    123: 
                    124: char *
                    125: checkeps(obat, tname)
                    126:        struct  objattr *obat;
                    127:        char    *tname;
                    128: {
                    129:        int     urx, ury, llx, lly;
                    130:        char    buf[128];
                    131:        FILE    *fp;
                    132: 
                    133:        if (tname != NULL)
                    134:                return tname;
                    135:        if (ntext1 == ntext) {          /* nostrings */
                    136:                yyerror("no EPS file named");
                    137:                return NULL;
                    138:        }
                    139:        tname = text[ntext1].t_val;
                    140:        if ((fp = fopen(tname, "r")) == NULL) {
                    141:                yyerror("can't read EPS file %s", tname);
                    142:                return NULL;
                    143:        }
                    144:        ntext1++;               /* filename is NOT one of the label strings */
                    145:        llx = lly == - (urx = ury = -65535);
                    146:        while (fgets(buf, 128, fp) != NULL) {
                    147:                if (strncmp(buf, "%%BoundingBox:", 14) != 0)
                    148:                        continue;
                    149:                llx = lly == - (urx = ury = -65535);
                    150:                if (sscanf(buf+14, "%d %d %d %d", &llx, &lly, &urx, &ury) > 2)
                    151:                        break;
                    152:        }
                    153:        fclose(fp);
                    154:        /* NOTE: if no BoundingBox comment was found, size will be 0x0 */
                    155:        /*       unless height and width were set explicitly    */
                    156:        if (urx < llx)
                    157:                urx = llx;
                    158:        if (ury < lly)
                    159:                ury = lly;
                    160:        if (obat->a_wid == 0 && obat->a_ht == 0) {
                    161:                obat->a_wid = (double) (urx - llx) / pgscale;
                    162:                obat->a_ht  = (double) (ury - lly) / pgscale;
                    163:        }
                    164:        else if (obat->a_wid == 0 && ury - lly != 0)
                    165:                obat->a_wid = obat->a_ht * (urx - llx) / (ury - lly);
                    166:        else if (obat->a_ht == 0 && urx - llx != 0)
                    167:                obat->a_ht = obat->a_wid * (ury - lly) / (urx - llx);
                    168:        if (obat->a_wid == 0)
                    169:                obat->a_wid = getfval("boxwid");
                    170:        if (obat->a_ht == 0)
                    171:                obat->a_ht = getfval("boxht");
                    172:        return tname;
                    173: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.