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