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: }