|
|
1.1 ! root 1: /* ! 2: * Reads standard graphics input ! 3: * Makes a plot on a 200 dot-per-inch 11" wide ! 4: * Versatek plotter. ! 5: * ! 6: * Creates and leaves /usr/tmp/raster (1000 blocks) ! 7: * which is the bitmap ! 8: */ ! 9: #include "stdio.h" ! 10: #include <signal.h> ! 11: ! 12: #define NB 88 ! 13: #define BSIZ 512 ! 14: #define mapx(x) ((1536*((x)-botx)/del)+centx) ! 15: #define mapy(y) ((1536*(del-(y)+boty)/del)-centy) ! 16: #define SOLID -1 ! 17: #define DOTTED 014 ! 18: #define SHORTDASHED 034 ! 19: #define DOTDASHED 054 ! 20: #define LONGDASHED 074 ! 21: #define SETSTATE (('v'<<8)+1) ! 22: ! 23: int linmod = SOLID; ! 24: int again; ! 25: int done1; ! 26: char chrtab[][16]; ! 27: int plotcom[] = { 0200, 0, 0}; ! 28: int eotcom[] = { 0210, 0, 0}; ! 29: char blocks [NB][BSIZ]; ! 30: int obuf[264]; ! 31: int lastx; ! 32: int lasty; ! 33: double topx = 1536; ! 34: double topy = 1536; ! 35: double botx = 0; ! 36: double boty = 0; ! 37: int centx; ! 38: int centy; ! 39: double delx = 1536; ! 40: double dely = 1536; ! 41: double del = 1536; ! 42: ! 43: struct buf { ! 44: int bno; ! 45: char *block; ! 46: }; ! 47: struct buf bufs[NB]; ! 48: ! 49: int in, out; ! 50: char *picture = "/usr/tmp/raster"; ! 51: ! 52: main(argc, argv) ! 53: char **argv; ! 54: { ! 55: extern int onintr(); ! 56: register i; ! 57: ! 58: if (argc>1) { ! 59: in = open(argv[1], 0); ! 60: putpict(); ! 61: exit(0); ! 62: } ! 63: signal(SIGTERM, onintr); ! 64: if (signal(SIGINT, SIG_IGN) != SIG_IGN) ! 65: signal(SIGINT, onintr); ! 66: another: ! 67: for (i=0; i<NB; i++) { ! 68: bufs[i].bno = -1; ! 69: bufs[i].block = blocks[i]; ! 70: } ! 71: out = creat(picture, 0666); ! 72: in = open(picture, 0); ! 73: zseek(out, 32*32); ! 74: write(out, blocks[0], BSIZ); ! 75: /*delete following code when filsys deals properly with ! 76: holes in files*/ ! 77: for(i=0;i<512;i++) ! 78: blocks[0][i] = 0; ! 79: zseek(out, 0); ! 80: for(i=0;i<32*32;i++) ! 81: write(out,blocks[0],512); ! 82: /**/ ! 83: getpict(); ! 84: for (i=0; i<NB; i++) ! 85: if (bufs[i].bno != -1) { ! 86: zseek(out, bufs[i].bno); ! 87: write(out, bufs[i].block, BSIZ); ! 88: } ! 89: putpict(); ! 90: if (again) { ! 91: close(in); ! 92: close(out); ! 93: goto another; ! 94: } ! 95: exit(0); ! 96: } ! 97: ! 98: getpict() ! 99: { ! 100: register x1, y1; ! 101: ! 102: again = 0; ! 103: for (;;) switch (x1 = getc(stdin)) { ! 104: ! 105: case 's': ! 106: botx = getw(stdin); ! 107: boty = getw(stdin); ! 108: topx = getw(stdin); ! 109: topy = getw(stdin); ! 110: delx = topx-botx; ! 111: dely = topy-boty; ! 112: if (dely/delx > 1536./2048.) ! 113: del = dely; ! 114: else ! 115: del = delx * (1566./2048.); ! 116: centx = 0; ! 117: centx = (2048 - mapx(topx)) / 2; ! 118: centy = 0; ! 119: centy = mapy(topy) / 2; ! 120: continue; ! 121: ! 122: case 'l': ! 123: done1 |= 01; ! 124: x1 = mapx(getw(stdin)); ! 125: y1 = mapy(getw(stdin)); ! 126: lastx = mapx(getw(stdin)); ! 127: lasty = mapy(getw(stdin)); ! 128: line(x1, y1, lastx, lasty); ! 129: continue; ! 130: ! 131: case 'm': ! 132: lastx = mapx(getw(stdin)); ! 133: lasty = mapy(getw(stdin)); ! 134: continue; ! 135: ! 136: case 't': ! 137: done1 |= 01; ! 138: while ((x1 = getc(stdin)) != '\n') ! 139: plotch(x1); ! 140: continue; ! 141: ! 142: case 'e': ! 143: if (done1) { ! 144: again++; ! 145: return; ! 146: } ! 147: continue; ! 148: ! 149: case 'p': ! 150: done1 |= 01; ! 151: lastx = mapx(getw(stdin)); ! 152: lasty = mapy(getw(stdin)); ! 153: point(lastx, lasty); ! 154: point(lastx+1, lasty); ! 155: point(lastx, lasty+1); ! 156: point(lastx+1, lasty+1); ! 157: continue; ! 158: ! 159: case 'n': ! 160: done1 |= 01; ! 161: x1 = mapx(getw(stdin)); ! 162: y1 = mapy(getw(stdin)); ! 163: line(lastx, lasty, x1, y1); ! 164: lastx = x1; ! 165: lasty = y1; ! 166: continue; ! 167: ! 168: case 'f': ! 169: getw(stdin); ! 170: getc(stdin); ! 171: switch(getc(stdin)) { ! 172: case 't': ! 173: linmod = DOTTED; ! 174: break; ! 175: default: ! 176: case 'i': ! 177: linmod = SOLID; ! 178: break; ! 179: case 'g': ! 180: linmod = LONGDASHED; ! 181: break; ! 182: case 'r': ! 183: linmod = SHORTDASHED; ! 184: break; ! 185: case 'd': ! 186: linmod = DOTDASHED; ! 187: break; ! 188: } ! 189: while((x1=getc(stdin))!='\n') ! 190: if(x1==-1) return; ! 191: continue; ! 192: ! 193: case 'd': ! 194: getw(stdin); ! 195: getw(stdin); ! 196: getw(stdin); ! 197: x1 = getw(stdin); ! 198: while (--x1 >= 0) ! 199: getw(stdin); ! 200: continue; ! 201: ! 202: case -1: ! 203: return; ! 204: ! 205: default: ! 206: printf("Botch\n"); ! 207: return; ! 208: } ! 209: } ! 210: ! 211: plotch(c) ! 212: register c; ! 213: { ! 214: register j; ! 215: register char *cp; ! 216: int i; ! 217: ! 218: if (c<' ' || c >0177) ! 219: return; ! 220: cp = chrtab[c-' ']; ! 221: for (i = -16; i<16; i += 2) { ! 222: c = *cp++; ! 223: for (j=7; j>=0; --j) ! 224: if ((c>>j)&1) { ! 225: point(lastx+6-j*2, lasty+i); ! 226: point(lastx+7-j*2, lasty+i); ! 227: point(lastx+6-j*2, lasty+i+1); ! 228: point(lastx+7-j*2, lasty+i+1); ! 229: } ! 230: } ! 231: lastx += 16; ! 232: } ! 233: ! 234: int f; /* versatec file number */ ! 235: putpict() ! 236: { ! 237: register x, *ip, *op; ! 238: int y; ! 239: ! 240: if (f==0){ ! 241: f = open("/dev/vp0", 1); ! 242: if (f < 0) { ! 243: printf("Cannot open vp\n"); ! 244: exit(1); ! 245: } ! 246: ioctl(f, SETSTATE, plotcom); ! 247: } ! 248: op = obuf; ! 249: lseek(in, 0L, 0); ! 250: for (y=0; y<2048; y++) { ! 251: if ((y&077) == 0) ! 252: read(in, blocks[0], 32*BSIZ); ! 253: for (x=0; x<32; x++) { ! 254: ip = (int *)&blocks[x][(y&077)<<3]; ! 255: *op++ = *ip++; ! 256: *op++ = *ip++; ! 257: *op++ = *ip++; ! 258: *op++ = *ip++; ! 259: } ! 260: *op++ = 0; ! 261: *op++ = 0; ! 262: *op++ = 0; ! 263: *op++ = 0; ! 264: if (y&1) { ! 265: write(f, (char *)obuf, sizeof(obuf)); ! 266: op = obuf; ! 267: } ! 268: } ! 269: } ! 270: ! 271: line(x0, y0, x1, y1) ! 272: register x0, y0; ! 273: { ! 274: int dx, dy; ! 275: int xinc, yinc; ! 276: register res1; ! 277: int res2; ! 278: int slope; ! 279: ! 280: xinc = 1; ! 281: yinc = 1; ! 282: if ((dx = x1-x0) < 0) { ! 283: xinc = -1; ! 284: dx = -dx; ! 285: } ! 286: if ((dy = y1-y0) < 0) { ! 287: yinc = -1; ! 288: dy = -dy; ! 289: } ! 290: slope = xinc*yinc; ! 291: res1 = 0; ! 292: res2 = 0; ! 293: if (dx >= dy) while (x0 != x1) { ! 294: if((x0+slope*y0)&linmod) ! 295: if (((x0>>6) + ((y0&~077)>>1)) == bufs[0].bno) ! 296: bufs[0].block[((y0&077)<<3)+((x0>>3)&07)] |= 1 << (7-(x0&07)); ! 297: else ! 298: point(x0, y0); ! 299: if (res1 > res2) { ! 300: res2 += dx - res1; ! 301: res1 = 0; ! 302: y0 += yinc; ! 303: } ! 304: res1 += dy; ! 305: x0 += xinc; ! 306: } else while (y0 != y1) { ! 307: if((x0+slope*y0)&linmod) ! 308: if (((x0>>6) + ((y0&~077)>>1)) == bufs[0].bno) ! 309: bufs[0].block[((y0&077)<<3)+((x0>>3)&07)] |= 1 << (7-(x0&07)); ! 310: else ! 311: point(x0, y0); ! 312: if (res1 > res2) { ! 313: res2 += dy - res1; ! 314: res1 = 0; ! 315: x0 += xinc; ! 316: } ! 317: res1 += dx; ! 318: y0 += yinc; ! 319: } ! 320: if((x1+slope*y1)&linmod) ! 321: if (((x1>>6) + ((y1&~077)>>1)) == bufs[0].bno) ! 322: bufs[0].block[((y1&077)<<3)+((x1>>3)&07)] |= 1 << (7-(x1&07)); ! 323: else ! 324: point(x1, y1); ! 325: } ! 326: ! 327: point(x, y) ! 328: register x, y; ! 329: { ! 330: register bno; ! 331: ! 332: bno = ((x&03700)>>6) + ((y&03700)>>1); ! 333: if (bno != bufs[0].bno) { ! 334: if (bno < 0 || bno >= 1024) ! 335: return; ! 336: getblk(bno); ! 337: } ! 338: bufs[0].block[((y&077)<<3)+((x>>3)&07)] |= 1 << (7-(x&07)); ! 339: } ! 340: ! 341: getblk(b) ! 342: register b; ! 343: { ! 344: register struct buf *bp1, *bp2; ! 345: register char *tp; ! 346: ! 347: loop: ! 348: for (bp1 = bufs; bp1 < &bufs[NB]; bp1++) { ! 349: if (bp1->bno == b || bp1->bno == -1) { ! 350: tp = bp1->block; ! 351: for (bp2 = bp1; bp2>bufs; --bp2) { ! 352: bp2->bno = (bp2-1)->bno; ! 353: bp2->block = (bp2-1)->block; ! 354: } ! 355: bufs[0].bno = b; ! 356: bufs[0].block = tp; ! 357: return; ! 358: } ! 359: } ! 360: zseek(out, bufs[NB-1].bno); ! 361: write(out, bufs[NB-1].block, BSIZ); ! 362: zseek(in, b); ! 363: read(in, bufs[NB-1].block, BSIZ); ! 364: bufs[NB-1].bno = b; ! 365: goto loop; ! 366: } ! 367: ! 368: onintr() ! 369: { ! 370: exit(1); ! 371: } ! 372: ! 373: zseek(a, b) ! 374: { ! 375: return(lseek(a, (long)b*512, 0)); ! 376: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.