|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.