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

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

unix.superglobalmegacorp.com

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