|
|
1.1 ! root 1: /******************************************************************* ! 2: * * ! 3: * File: CIFPLOT/fill.c * ! 4: * Written by Dan Fitzpatrick & Dennis Wellborne * ! 5: * copyright 1980 -- Regents of the University of California * ! 6: * * ! 7: ********************************************************************/ ! 8: ! 9: #include "defs.h" ! 10: #include "globals.h" ! 11: #include "structs.h" ! 12: #include "out_structs.h" ! 13: #include "masks.h" ! 14: #include <stdio.h> ! 15: #include <sys/types.h> ! 16: #include <sys/stat.h> ! 17: #include <sys/vcmd.h> ! 18: #include <signal.h> ! 19: #include <errno.h> ! 20: ! 21: extern int errno; ! 22: ! 23: int plotmd [] = { VPLOT, 0, 0 }; ! 24: int prtmd [] = { VPRINT, 0, 0 }; ! 25: struct stat stbuf; ! 26: int offline; ! 27: int Lock = 0; ! 28: char *tail = "a"; /* letter appended to temp file name for uniqueness */ ! 29: int NormalSize; ! 30: double StartNextPlot; ! 31: ! 32: IMPORT char *Concat(); ! 33: IMPORT char *mktemp(); ! 34: IMPORT char *getlogin(); ! 35: IMPORT char *ctime(); ! 36: IMPORT time(); ! 37: ! 38: #define VLIMIT 2112 ! 39: #define VMAX 2000 ! 40: #define VEXTRA 2100 ! 41: #define VMIN 0 ! 42: #define VRESOL 200.0 ! 43: #define VSPLFL "/usr/spool/vad/dfcXXXXXX" ! 44: #define VDAEMON "/vb/grad/fitz/graphics/vad" ! 45: ! 46: #define WLIMIT 7040 ! 47: #define WMAX 7000 ! 48: #define WEXTRA 7030 ! 49: #define WMIN 0 ! 50: #define WRESOL 200.0 ! 51: #define WSPLFL "/usr/spool/vpd/dfcXXXXXX" ! 52: #define WDAEMON "/vb/grad/fitz/graphics/vpd" ! 53: ! 54: #define HLIMIT 704 ! 55: #define HMAX 700 ! 56: #define HMIN 0 ! 57: #define HRESOL 10.0 ! 58: ! 59: #define LOCK "/usr/spool/vpd/lock" ! 60: #define DEVICE "/dev/vp0" ! 61: #define NAME "Versatec" ! 62: #define DAEMON "/vb/grad/fitz/graphics/vpd" ! 63: #define VDUMP "/usr/ucb/vdump" ! 64: #define VDMP "/vb/grad/fitz/graphics/vdmp" ! 65: ! 66: int xmax,xlimit,xlimitDiv32,xmin; ! 67: real resolution = 200; ! 68: char *heading,*name; ! 69: ! 70: #ifdef SHIFT ! 71: #define FROMMASK(from) ( 0xffffff00 | (0xff >> (from & 0x07))) << (from & 0x18) ! 72: ! 73: #define TOMASK(to) (~((0xffffff00 | (0xff >> (to & 0x07))) << (to & 0x18))) ! 74: #else ! 75: #define FROMMASK(from) fromMask[from&0x1f] ! 76: #define TOMASK(to) toMask[to&0x1f] ! 77: #endif ! 78: #define DOTMASK(x) dotMask[x&0x1f] ! 79: ! 80: char *outfile; ! 81: int filedesc; ! 82: int *OutBuf,*ScanLine; ! 83: int NoLine; ! 84: ! 85: ! 86: Fill(line,from,to,pattern) ! 87: int from,to; ! 88: register int pattern; ! 89: { ! 90: int start,end; ! 91: register int i; ! 92: ! 93: to++; ! 94: if(to < from || xlimit < to || from < 0) { ! 95: /* fprintf(stderr,"Out of range in fill(%d,%d)\n",from,to); */ ! 96: return; ! 97: } ! 98: start = (from >> 5) + ((line - Bottom) % OUT_BUF_SIZE)*xlimitDiv32; ! 99: end = (to >> 5) + ((line - Bottom) % OUT_BUF_SIZE)*xlimitDiv32; ! 100: ! 101: if (start == end) ! 102: OutBuf[start] |= pattern & (FROMMASK(from)) & (TOMASK(to)); ! 103: else { ! 104: OutBuf[start] |= pattern & (FROMMASK(from)); ! 105: ! 106: for (i=start+1; i<end;) ! 107: OutBuf[i++] |= pattern; ! 108: ! 109: OutBuf[end] |= pattern & TOMASK(to); ! 110: } ! 111: } ! 112: ! 113: #define ORDER(x,y) if(x > y) { temp=x; x=y;y=temp;} ! 114: ! 115: FillTrap(xLeft,xRight,deltaxLeft,deltaxRight,yBottom,yTop,patNo) ! 116: real xLeft,xRight,deltaxLeft,deltaxRight; ! 117: int yTop,yBottom; ! 118: int patNo; ! 119: { ! 120: register int xStart,xEnd,from,to; ! 121: register int i,pattern; ! 122: int y,yStart,yEnd; ! 123: int n,temp; ! 124: ! 125: if(yBottom > yTop) Error("yBottom > yTop in FillTrap",INTERNAL); ! 126: yStart = (yBottom - Bottom) % OUT_BUF_SIZE; ! 127: yEnd = (yTop - yBottom) + yStart; ! 128: if(yEnd > OUT_BUF_SIZE || yStart < 0) Error("Trap bigger than buf size",INTERNAL); ! 129: ! 130: if(!(deltaxLeft == 0.0 && deltaxRight == 0.0)) { ! 131: for(y=yStart; y<yEnd; y++) { ! 132: from = xLeft; ! 133: to = xRight+1; ! 134: if(to < from || xlimit < to || from < 0) { ! 135: /* fprintf(stderr,"Out of range in fill(%d,%d)\n",from,to); */ ! 136: return; ! 137: } ! 138: xStart = (from >> 5) + (y*xlimitDiv32); ! 139: xEnd = (to >> 5) + (y*xlimitDiv32); ! 140: pattern = Pats[patNo][y%NO_PAT_LINE]; ! 141: if(pattern != 0) { ! 142: if(xStart == xEnd) ! 143: OutBuf[xStart] |= pattern & (FROMMASK(from)) & (TOMASK(to)); ! 144: else { ! 145: OutBuf[xStart] |= pattern & (FROMMASK(from)); ! 146: for(i=xStart+1; i<xEnd;) ! 147: OutBuf[i++] |= pattern; ! 148: OutBuf[xEnd] |= pattern & (TOMASK(to)); ! 149: } ! 150: } ! 151: if(outline || pattern == 0xffffffff) { ! 152: to = xLeft + deltaxLeft; ! 153: ORDER(from,to); to++; ! 154: xStart = (from >> 5) + (y*xlimitDiv32); ! 155: n = (to >> 5) + (y*xlimitDiv32); ! 156: if(xStart == n) ! 157: OutBuf[xStart] |= 0xffffffff & (FROMMASK(from)) & (TOMASK(to)); ! 158: else { ! 159: OutBuf[xStart] |= 0xffffffff & (FROMMASK(from)); ! 160: for(i=xStart+1; i<n;) ! 161: OutBuf[i++] |= 0xffffffff; ! 162: OutBuf[n] |= 0xffffffff & (TOMASK(to)); ! 163: } ! 164: to = xRight; ! 165: from = xRight + deltaxRight; ! 166: ORDER(from,to); to++; ! 167: n = (from >> 5) + (y*xlimitDiv32); ! 168: xEnd = (to >> 5) + (y*xlimitDiv32); ! 169: if(n == xEnd) ! 170: OutBuf[n] |= 0xffffffff & (FROMMASK(from)) & (TOMASK(to)); ! 171: else { ! 172: OutBuf[n] |= 0xffffffff & (FROMMASK(from)); ! 173: for(i=n+1; i<xEnd;) ! 174: OutBuf[i++] |= 0xffffffff; ! 175: OutBuf[xEnd] |= 0xffffffff & (TOMASK(to)); ! 176: } ! 177: } ! 178: xLeft += deltaxLeft; ! 179: xRight += deltaxRight; ! 180: } ! 181: } ! 182: else { ! 183: from = xLeft; ! 184: to = xRight+1; ! 185: if(to < from || xlimit < to || from < 0) { ! 186: /* fprintf(stderr,"Out of range in fill(%d,%d)\n",from,to); */ ! 187: return; ! 188: } ! 189: xStart = (from >> 5) + (yStart*xlimitDiv32); ! 190: xEnd = (to >> 5) + (yStart*xlimitDiv32); ! 191: for(y=yStart; y<yEnd; y++) { ! 192: pattern = Pats[patNo][y%NO_PAT_LINE]; ! 193: if(pattern != 0) { ! 194: if(xStart == xEnd) ! 195: OutBuf[xStart] |= pattern & (FROMMASK(from)) & (TOMASK(to)); ! 196: else { ! 197: OutBuf[xStart] |= pattern & (FROMMASK(from)); ! 198: for(i=xStart+1; i<xEnd;) ! 199: OutBuf[i++] |= pattern; ! 200: OutBuf[xEnd] |= pattern & (TOMASK(to)); ! 201: } ! 202: } ! 203: if(outline || pattern == 0xffffffff) { ! 204: OutBuf[xStart] |= DOTMASK(from); ! 205: OutBuf[xEnd] |= DOTMASK(to); ! 206: } ! 207: xEnd += xlimitDiv32; ! 208: xStart += xlimitDiv32; ! 209: } ! 210: } ! 211: } ! 212: ! 213: blank(from,to,line) ! 214: int from,to; ! 215: { ! 216: int start,end; ! 217: register int i; ! 218: ! 219: to++; ! 220: if(to < from || xlimit < to || from < 0) { ! 221: /* fprintf(stderr,"Out of range in blank(%d,%d)\n",from,to); */ ! 222: return; ! 223: } ! 224: start = (from >> 5) + ((line - Bottom) % OUT_BUF_SIZE)*xlimitDiv32; ! 225: end = (to >> 5) + ((line - Bottom) % OUT_BUF_SIZE)*xlimitDiv32; ! 226: ! 227: if (start == end) ! 228: OutBuf[start] &= ~((FROMMASK(from)) & (TOMASK(to))); ! 229: else { ! 230: OutBuf[start] &= ~(FROMMASK(from)); ! 231: ! 232: for (i=start+1; i<end;) ! 233: OutBuf[i++] = 0; ! 234: ! 235: OutBuf[end] &= ~(TOMASK(to)); ! 236: } ! 237: } ! 238: ! 239: match(pat,pos,line) ! 240: int pat,pos,line; ! 241: { ! 242: int pat1,pat2,offset; ! 243: ! 244: line = (line-Bottom) % OUT_BUF_SIZE; ! 245: offset = (line*xlimitDiv32); ! 246: pat &= 0xff; ! 247: /* ! 248: pat1 = ((0xff >> (pos & 07)) & 0xff) << (pos & 0x18); ! 249: OutBuf[(pos>>5)+offset] &= ~pat1; ! 250: */ ! 251: pat1 = ((pat >> (pos & 07)) & 0xff) << (pos & 0x18); ! 252: OutBuf[(pos>>5)+offset] |= pat1; ! 253: pos += 8; ! 254: /* ! 255: pat2 = ((0xff00 >> (pos & 07)) & 0xff) << (pos & 0x18); ! 256: OutBuf[(pos>>5)+offset] &= ~pat2; ! 257: */ ! 258: pat = pat << 8; ! 259: pat2 = ((pat >> (pos & 07)) & 0xff) << (pos & 0x18); ! 260: OutBuf[(pos>>5)+offset] |= pat2; ! 261: } ! 262: ! 263: /* ! 264: ClearLine(){ ! 265: register int i,limit; ! 266: limit = (OUT_BUF_SIZE*xlimit)/32; ! 267: for(i=0; i<limit ; OutBuf[i++] = 0); ! 268: } ! 269: */ ! 270: ! 271: Clear(lp, nbytes) ! 272: int *lp; ! 273: int nbytes; ! 274: { ! 275: ! 276: asm("movc5 $0,(sp),$0,8(ap),*4(ap)"); ! 277: ! 278: } ! 279: ! 280: DumpBuf(x) ! 281: int x; ! 282: { ! 283: int i; ! 284: for(i=xLast; i < x; i++) Text(i); ! 285: if(plot) { ! 286: if(write(filedesc, OutBuf, (OUT_BUF_SIZE*xlimit)/8) != (OUT_BUF_SIZE*xlimit/8)) { ! 287: perror(outfile); ! 288: if(output != VERSATEC) ! 289: Error("Bad Write on temp file",RUNTIME); ! 290: else ! 291: Error("Looks like someone turned off the Versatec",RUNTIME); ! 292: } ! 293: Clear(OutBuf,(OUT_BUF_SIZE*xlimit)/8); ! 294: xLast = x; ! 295: } ! 296: } ! 297: ! 298: /* ! 299: DumpLine() ! 300: { ! 301: NoLine++; ! 302: if(NoLine == OUT_BUF_SIZE) { ! 303: if(plot) ! 304: if(write( filedesc, OutBuf, (OUT_BUF_SIZE*xlimit)/8) != (OUT_BUF_SIZE*xlimit/8)) { ! 305: perror(outfile); ! 306: if(output != VERSATEC) ! 307: Error("Bad Write on temp file",RUNTIME); ! 308: else ! 309: Error("Looks like someone turned off the Versatec",RUNTIME); ! 310: } ! 311: Clear(OutBuf,(OUT_BUF_SIZE*xlimit)/8); ! 312: NoLine = 0; ! 313: } ! 314: ScanLine = &(OutBuf[(NoLine*xlimit)/32]); ! 315: } ! 316: */ ! 317: ! 318: FlushLine() ! 319: { ! 320: NoLine++; ! 321: if(plot) ! 322: if(write( filedesc, &(OutBuf[0]), (NoLine*xlimit)/8) != (NoLine*xlimit)/8) { ! 323: perror(outfile); ! 324: Error("Bad Write on temp file",RUNTIME); ! 325: } ! 326: Clear(OutBuf,(OUT_BUF_SIZE*xlimit)/8); ! 327: NoLine = 0; ! 328: ScanLine = OutBuf; ! 329: } ! 330: ! 331: InitFill(){ ! 332: switch(output) { ! 333: case VARIAN: ! 334: xlimit = VLIMIT; ! 335: NoPixcels = NormalSize = VMAX; ! 336: xmax = VEXTRA; ! 337: xmin = VMIN; ! 338: resolution = VRESOL; ! 339: break; ! 340: case VSPOOL: ! 341: case VERSATEC: ! 342: xlimit = WLIMIT; ! 343: NoPixcels = NormalSize = WMAX; ! 344: xmax = WEXTRA; ! 345: xmin = WMIN; ! 346: resolution = WRESOL; ! 347: break;; ! 348: case HP2648A: ! 349: xlimit = HLIMIT; ! 350: NoPixcels = NormalSize = xmax = HMAX; ! 351: xmin = HMIN; ! 352: resolution = HRESOL; ! 353: break;; ! 354: default: ! 355: Error("Unknown output device in InitFill",INTERNAL); ! 356: } ! 357: OutBuf = (int *) alloc((int) ((OUT_BUF_SIZE * xlimit)/8)); ! 358: ScanLine = OutBuf; ! 359: NoLine = 0; ! 360: xlimitDiv32 = xlimit/32; ! 361: } ! 362: ! 363: ! 364: vopen() ! 365: { ! 366: char s[256]; ! 367: int i; ! 368: long clock; ! 369: ! 370: name = getlogin(); ! 371: if(Window.ymax != Window.ymin) /* Check for divide by zero */ ! 372: sprintf(s,"%s Window: %d %d %d %d --- Scale: 1 micron is %f inches", ! 373: programName,(int)Window.xmin,(int)Window.xmax, ! 374: (int)Window.ymin,(int)Window.ymax,scale); ! 375: heading = Concat(s,"\n",banner,0); ! 376: ! 377: ! 378: if((output==VARIAN || output==HP2648A) && plot) { ! 379: outfile = (char *) mktemp("/usr/tmp/cifXXXXXX"); ! 380: outfile = Concat(outfile,tail,0); ! 381: *tail += 1; /* insures uniqueness */ ! 382: if((filedesc = creat(outfile,0666)) < 0) { ! 383: perror(outfile); ! 384: Error("Can't create temp file",RUNTIME); ! 385: } ! 386: fileopen = 1; ! 387: } ! 388: ! 389: if(output==VSPOOL && plot) { ! 390: outfile = (char *) mktemp("/usr/tmp/cifXXXXXX"); ! 391: outfile = Concat(outfile,tail,0); ! 392: *tail += 1; /* insures uniqueness */ ! 393: if((filedesc = creat(outfile,0666)) < 0) { ! 394: perror(outfile); ! 395: Error("Can't create temp file",RUNTIME); ! 396: } ! 397: fileopen = 1; ! 398: } ! 399: ! 400: if(output==VERSATEC && plot) { ! 401: /* Drive the Versatec directly */ ! 402: while( stat(LOCK, &stbuf) >= 0) { ! 403: sleep(30); ! 404: } ! 405: ! 406: if( (i = creat(LOCK, 0666)) < 0) { ! 407: perror(LOCK); ! 408: Error("Can't create lock file",RUNTIME); ! 409: } ! 410: if( close(i) < 0) { ! 411: perror(LOCK); ! 412: Error("Can't close lock file",RUNTIME); ! 413: } ! 414: ! 415: Lock = 1; ! 416: while(1) { ! 417: if( (filedesc = open(DEVICE, 1)) >= 0) break; ! 418: if( errno != EIO ) { ! 419: perror(DEVICE); ! 420: Error("I/O Error",RUNTIME); ! 421: } ! 422: if(offline == 0) { ! 423: fprintf(stderr,"%s is offline\n",NAME); ! 424: offline = 1; ! 425: } ! 426: sleep(30); ! 427: } ! 428: fileopen = 1; ! 429: fprintf(stderr,"Plotting\n"); ! 430: ioctl(filedesc,VSETSTATE,prtmd); ! 431: clock = time(0); ! 432: sprintf(s,"%s: %s",getlogin(),ctime(&clock)); ! 433: if(write(filedesc,s,LengthString(s)) != LengthString(s) || ! 434: write(filedesc,heading,LengthString(heading)) != LengthString(heading)) { ! 435: perror(""); ! 436: Error("Can't write on Versatec",RUNTIME); ! 437: } ! 438: write(filedesc,"\n\n",2); ! 439: ioctl(filedesc,VSETSTATE,plotmd); ! 440: } ! 441: } ! 442: ! 443: vclose() ! 444: { ! 445: int i; ! 446: fileopen = 0; ! 447: FlushLine(); ! 448: if(plot && close(filedesc) < 0) { ! 449: perror("outfile"); ! 450: Error("Can't close temp file",RUNTIME); ! 451: } ! 452: ! 453: if(output==VERSATEC) { ! 454: ioctl(filedesc,VSETSTATE,prtmd); ! 455: for(i=0; i < 10; i++) ! 456: write(filedesc,"\n\n\n\n\n\n\n\n\n\n",10); ! 457: unlock(); ! 458: Lock = 0; ! 459: fprintf(stderr,"Plotting Done\n"); ! 460: } ! 461: ! 462: if(plot && (output==VARIAN)) /* || output==VSPOOL)) */ ! 463: if(vfork() == 0) ! 464: if(! 1) { ! 465: char *tmpFile; ! 466: char *spoolFile; ! 467: FILE *tmp; ! 468: tmpFile = mktemp("/usr/tmp/cpltXXXXXX"); ! 469: if(output==VARIAN) ! 470: spoolFile = mktemp(VSPLFL); ! 471: else ! 472: spoolFile = mktemp(WSPLFL); ! 473: spoolFile = Concat(spoolFile,tail,0); ! 474: if((tmp = fopen(tmpFile,"w")) == NULL) { ! 475: perror(tmpFile); ! 476: Error("Can't open temp spool file",RUNTIME); ! 477: } ! 478: fprintf(tmp,"L%s\n",name); ! 479: fprintf(tmp,"B%s\n",heading); ! 480: fprintf(tmp,"B%s\n",banner); ! 481: fprintf(tmp,"C%s\n",outfile); ! 482: fprintf(tmp,"U%s\n",outfile); ! 483: fclose(tmp); ! 484: link(tmpFile,spoolFile); ! 485: unlink(tmpFile); ! 486: if(output==VARIAN) ! 487: execl(VDAEMON,"vad",0); ! 488: else ! 489: execl(WDAEMON,"vpd",0); ! 490: Error("Can't start up daemon",RUNTIME); ! 491: } ! 492: else { ! 493: if(execl(VDUMP,"vdump",outfile,heading,"Plotting Done",0) < 0) { ! 494: perror(VDUMP); ! 495: Error("Can't start up plotting routine",RUNTIME); ! 496: } ! 497: } ! 498: ! 499: if(plot && output==VSPOOL) ! 500: if(vfork() == 0) ! 501: if(!debug) { ! 502: if(execl(VDUMP,"vdump",outfile,heading,"","-W",0) < 0) { ! 503: perror(VDUMP); ! 504: Error("Can't start up plotting routine",RUNTIME); ! 505: } ! 506: } ! 507: else { ! 508: if(execl(VDUMP,"vdump",outfile,heading,"Plotting Done","-W",0) < 0) { ! 509: perror(VDUMP); ! 510: Error("Can't start up plotting routine",RUNTIME); ! 511: } ! 512: } ! 513: } ! 514: ! 515: unlock() ! 516: { ! 517: if(output==VERSATEC && Lock) { ! 518: if(unlink(LOCK) < 0) { ! 519: perror(LOCK); ! 520: Error("Can't remove lock",RUNTIME); ! 521: } ! 522: if(vfork()==0) { ! 523: if(execl(DAEMON,DAEMON) < 0) { ! 524: perror(DAEMON); ! 525: Error("Can't start up daemon",RUNTIME); ! 526: } ! 527: } ! 528: } ! 529: } ! 530: ! 531: float ! 532: PlotSize() ! 533: { ! 534: return(((float) (Top-Bottom))/(resolution * 12.0)); ! 535: } ! 536: ! 537: float ! 538: PlotScale() ! 539: { ! 540: if(Window.ymax == Window.ymin) return(0.0); ! 541: return((100.0 * ((real) xmax))/(resolution * (Window.ymax-Window.ymin))); ! 542: } ! 543: ! 544: FixScale() ! 545: /* Set up the correct conversion factor for chip to plotter conversion*/ ! 546: { ! 547: if(SetScale && scale != 0.0) { ! 548: ConvertFactor = (scale * resolution)/100.0; ! 549: StartNextPlot = GWindow.ymin; ! 550: NoPixcels = xmax; ! 551: } ! 552: else { ! 553: if(GWindow.ymax == GWindow.ymin) { ! 554: ConvertFactor = 0.0; ! 555: scale = 0.0; ! 556: } ! 557: else { ! 558: ConvertFactor = NormalSize/(GWindow.ymax - GWindow.ymin); ! 559: scale = 100.0 * ((real) NoPixcels)/(resolution * (GWindow.ymax-GWindow.ymin)); ! 560: } ! 561: StartNextPlot = GWindow.ymin; ! 562: } ! 563: } ! 564: ! 565: AdjustWindow() ! 566: { ! 567: Window.xmin = GWindow.xmin; ! 568: Window.xmax = GWindow.xmax; ! 569: Window.ymin = StartNextPlot; ! 570: Window.ymax = NoPixcels/ConvertFactor + Window.ymin; ! 571: StartNextPlot = NormalSize/ConvertFactor + Window.ymin; ! 572: if(Window.ymax < GWindow.ymax-1) { ! 573: MoreToPlot = ((GWindow.ymax - Window.ymax)*ConvertFactor)/NormalSize + 0.9999; ! 574: } ! 575: else { ! 576: MoreToPlot = 0; ! 577: Window.ymax = GWindow.ymax; ! 578: NoPixcels = CONVERT(Window.ymax) + 1; ! 579: } ! 580: } ! 581:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.