Annotation of researchv10no/cmd/pic/print.c, revision 1.1

1.1     ! root        1: #include <stdio.h>
        !             2: #include <math.h>
        !             3: #include "pic.h"
        !             4: #include "y.tab.h"
        !             5: 
        !             6: void dotext(obj *);
        !             7: void dotline(double, double, double, double, int, double);
        !             8: void dotbox(double, double, double, double, int, double);
        !             9: void ellipse(double, double, double, double);
        !            10: void circle(double, double, double);
        !            11: void arc(double, double, double, double, double, double);
        !            12: void arrow(double, double, double, double, double, double, double, int);
        !            13: void line(double, double, double, double);
        !            14: void box(double, double, double, double);
        !            15: void spline(double x, double y, double n, ofloat *p, int dashed, double ddval);
        !            16: void move(double, double);
        !            17: void troff(char *);
        !            18: void dot(void);
        !            19: void fillstart(double), fillend(int vis, int noedge);
        !            20: 
        !            21: void print(void)
        !            22: {
        !            23:        obj *p;
        !            24:        int i, j, k, m;
        !            25:        double x0, y0, x1, y1, ox, oy, dx, dy, ndx, ndy;
        !            26: 
        !            27:        for (i = 0; i < nobj; i++) {
        !            28:                p = objlist[i];
        !            29:                ox = p->o_x;
        !            30:                oy = p->o_y;
        !            31:                if (p->o_count >= 1)
        !            32:                        x1 = p->o_val[0];
        !            33:                if (p->o_count >= 2)
        !            34:                        y1 = p->o_val[1];
        !            35:                m = p->o_mode;
        !            36:                switch (p->o_type) {
        !            37:                case TROFF:
        !            38:                        troff(text[p->o_nt1].t_val);
        !            39:                        break;
        !            40:                case BOX:
        !            41:                case BLOCK:
        !            42:                        x0 = ox - x1 / 2;
        !            43:                        y0 = oy - y1 / 2;
        !            44:                        x1 = ox + x1 / 2;
        !            45:                        y1 = oy + y1 / 2;
        !            46:                        if (p->o_attr & FILLBIT) {
        !            47:                                move(x0, y0);
        !            48:                                fillstart(p->o_fillval);
        !            49:                        }
        !            50:                        if (p->o_type == BLOCK)
        !            51:                                ;       /* nothing at all */
        !            52:                        else if (p->o_attr & INVIS && !(p->o_attr & FILLBIT))
        !            53:                                ;       /* nothing at all */
        !            54:                        else if (p->o_attr & (DOTBIT|DASHBIT))
        !            55:                                dotbox(x0, y0, x1, y1, p->o_attr, p->o_ddval);
        !            56:                        else
        !            57:                                box(x0, y0, x1, y1);
        !            58:                        if (p->o_attr & FILLBIT)
        !            59:                                fillend(!(p->o_attr & INVIS), p->o_attr&FILLBIT);
        !            60:                        move(ox, oy);
        !            61:                        dotext(p);      /* if there are any text strings */
        !            62:                        if (ishor(m))
        !            63:                                move(isright(m) ? x1 : x0, oy); /* right side */
        !            64:                        else
        !            65:                                move(ox, isdown(m) ? y0 : y1);  /* bottom */
        !            66:                        break;
        !            67:                case BLOCKEND:
        !            68:                        break;
        !            69:                case CIRCLE:
        !            70:                        if (p->o_attr & FILLBIT)
        !            71:                                fillstart(p->o_fillval);
        !            72:                        if ((p->o_attr & INVIS) == 0 || p->o_attr & FILLBIT)
        !            73:                                circle(ox, oy, x1);
        !            74:                        if (p->o_attr & FILLBIT)
        !            75:                                fillend(!(p->o_attr & INVIS), p->o_attr&FILLBIT);
        !            76:                        move(ox, oy);
        !            77:                        dotext(p);
        !            78:                        if (ishor(m))
        !            79:                                move(ox + isright(m) ? x1 : -x1, oy);
        !            80:                        else
        !            81:                                move(ox, oy + isup(m) ? x1 : -x1);
        !            82:                        break;
        !            83:                case ELLIPSE:
        !            84:                        if (p->o_attr & FILLBIT)
        !            85:                                fillstart(p->o_fillval);
        !            86:                        if ((p->o_attr & INVIS) == 0 || p->o_attr & FILLBIT)
        !            87:                                ellipse(ox, oy, x1, y1);
        !            88:                        if (p->o_attr & FILLBIT)
        !            89:                                fillend(!(p->o_attr & INVIS), p->o_attr&FILLBIT);
        !            90:                        move(ox, oy);
        !            91:                        dotext(p);
        !            92:                        if (ishor(m))
        !            93:                                move(ox + isright(m) ? x1 : -x1, oy);
        !            94:                        else
        !            95:                                move(ox, oy - isdown(m) ? y1 : -y1);
        !            96:                        break;
        !            97:                case ARC:
        !            98:                        if (p->o_attr & FILLBIT) {
        !            99:                                move(ox, oy);
        !           100:                                fillstart(p->o_fillval);
        !           101:                        }
        !           102:                        if (p->o_attr & HEAD1)
        !           103:                                arrow(x1 - (y1 - oy), y1 + (x1 - ox),
        !           104:                                      x1, y1, p->o_val[4], p->o_val[5], p->o_val[5]/p->o_val[6]/2, p->o_nhead);
        !           105:                         if (p->o_attr & INVIS && !(p->o_attr & FILLBIT))
        !           106:                                 /* probably wrong when it's cw */
        !           107:                                 move(x1, y1);
        !           108:                         else
        !           109:                                arc(ox, oy, x1, y1, p->o_val[2], p->o_val[3]);
        !           110:                        if (p->o_attr & HEAD2)
        !           111:                                arrow(p->o_val[2] + p->o_val[3] - oy, p->o_val[3] - (p->o_val[2] - ox),
        !           112:                                      p->o_val[2], p->o_val[3], p->o_val[4], p->o_val[5], -p->o_val[5]/p->o_val[6]/2, p->o_nhead);
        !           113:                        if (p->o_attr & FILLBIT)
        !           114:                                fillend(!(p->o_attr & INVIS), p->o_attr&FILLBIT);
        !           115:                        if (p->o_attr & CW_ARC)
        !           116:                                move(x1, y1);   /* because drawn backwards */
        !           117:                        move(ox, oy);
        !           118:                        dotext(p);
        !           119:                        break;
        !           120:                case LINE:
        !           121:                case ARROW:
        !           122:                case SPLINE:
        !           123:                        if (p->o_attr & FILLBIT) {
        !           124:                                move(ox, oy);
        !           125:                                fillstart(p->o_fillval);
        !           126:                        }
        !           127:                        if (p->o_attr & HEAD1)
        !           128:                                arrow(ox + p->o_val[5], oy + p->o_val[6], ox, oy, p->o_val[2], p->o_val[3], 0.0, p->o_nhead);
        !           129:                         if (p->o_attr & INVIS && !(p->o_attr & FILLBIT))
        !           130:                                 move(x1, y1);
        !           131:                        else if (p->o_type == SPLINE)
        !           132:                                spline(ox, oy, p->o_val[4], &p->o_val[5], p->o_attr & (DOTBIT|DASHBIT), p->o_ddval);
        !           133:                        else {
        !           134:                                dx = ox;
        !           135:                                dy = oy;
        !           136:                                for (k=0, j=5; k < p->o_val[4]; k++, j += 2) {
        !           137:                                        ndx = dx + p->o_val[j];
        !           138:                                        ndy = dy + p->o_val[j+1];
        !           139:                                        if (p->o_attr & (DOTBIT|DASHBIT))
        !           140:                                                dotline(dx, dy, ndx, ndy, p->o_attr, p->o_ddval);
        !           141:                                        else
        !           142:                                                line(dx, dy, ndx, ndy);
        !           143:                                        dx = ndx;
        !           144:                                        dy = ndy;
        !           145:                                }
        !           146:                        }
        !           147:                        if (p->o_attr & HEAD2) {
        !           148:                                dx = ox;
        !           149:                                dy = oy;
        !           150:                                for (k = 0, j = 5; k < p->o_val[4] - 1; k++, j += 2) {
        !           151:                                        dx += p->o_val[j];
        !           152:                                        dy += p->o_val[j+1];
        !           153:                                }
        !           154:                                arrow(dx, dy, x1, y1, p->o_val[2], p->o_val[3], 0.0, p->o_nhead);
        !           155:                        }
        !           156:                        if (p->o_attr & FILLBIT)
        !           157:                                fillend(!(p->o_attr & INVIS), p->o_attr&FILLBIT);
        !           158:                        move((ox + x1)/2, (oy + y1)/2); /* center */
        !           159:                        dotext(p);
        !           160:                        break;
        !           161:                case MOVE:
        !           162:                case TEXT:
        !           163:                        move(ox, oy);
        !           164:                        dotext(p);
        !           165:                        break;
        !           166:                }
        !           167:        }
        !           168: }
        !           169: 
        !           170: void dotline(double x0, double y0, double x1, double y1, int ddtype, double ddval) /* dotted line */
        !           171: {
        !           172:        static double prevval = 0.05;   /* 20 per inch by default */
        !           173:        int i, numdots;
        !           174:        double a, b, dx, dy;
        !           175: 
        !           176:        if (ddval == 0)
        !           177:                ddval = prevval;
        !           178:        prevval = ddval;
        !           179:        /* don't save dot/dash value */
        !           180:        dx = x1 - x0;
        !           181:        dy = y1 - y0;
        !           182:        if (ddtype & DOTBIT) {
        !           183:                numdots = sqrt(dx*dx + dy*dy) / prevval + 0.5;
        !           184:                if (numdots > 0)
        !           185:                        for (i = 0; i <= numdots; i++) {
        !           186:                                a = (double) i / (double) numdots;
        !           187:                                move(x0 + (a * dx), y0 + (a * dy));
        !           188:                                dot();
        !           189:                        }
        !           190:        } else if (ddtype & DASHBIT) {
        !           191:                double d, dashsize, spacesize;
        !           192:                d = sqrt(dx*dx + dy*dy);
        !           193:                if (d <= 2 * prevval) {
        !           194:                        line(x0, y0, x1, y1);
        !           195:                        return;
        !           196:                }
        !           197:                numdots = d / (2 * prevval) + 1;        /* ceiling */
        !           198:                dashsize = prevval;
        !           199:                spacesize = (d - numdots * dashsize) / (numdots - 1);
        !           200:                for (i = 0; i < numdots-1; i++) {
        !           201:                        a = i * (dashsize + spacesize) / d;
        !           202:                        b = a + dashsize / d;
        !           203:                        line(x0 + (a*dx), y0 + (a*dy), x0 + (b*dx), y0 + (b*dy));
        !           204:                        a = b;
        !           205:                        b = a + spacesize / d;
        !           206:                        move(x0 + (a*dx), y0 + (a*dy));
        !           207:                }
        !           208:                line(x0 + (b * dx), y0 + (b * dy), x1, y1);
        !           209:        }
        !           210:        prevval = 0.05;
        !           211: }
        !           212: 
        !           213: void dotbox(double x0, double y0, double x1, double y1, int ddtype, double ddval)      /* dotted or dashed box */
        !           214: {
        !           215:        dotline(x0, y0, x1, y0, ddtype, ddval);
        !           216:        dotline(x1, y0, x1, y1, ddtype, ddval);
        !           217:        dotline(x1, y1, x0, y1, ddtype, ddval);
        !           218:        dotline(x0, y1, x0, y0, ddtype, ddval);
        !           219: }
        !           220: 
        !           221: void dotext(obj *p)    /* print text strings of p in proper vertical spacing */
        !           222: {
        !           223:        int i, nhalf;
        !           224:        void label(char *, int, int);
        !           225: 
        !           226:        nhalf = p->o_nt2 - p->o_nt1 - 1;
        !           227:        for (i = p->o_nt1; i < p->o_nt2; i++) {
        !           228:                label(text[i].t_val, text[i].t_type, nhalf);
        !           229:                nhalf -= 2;
        !           230:        }
        !           231: }

unix.superglobalmegacorp.com

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