Annotation of researchv10no/cmd/picasso/picgen.c, revision 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.