|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1980 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: */ ! 6: ! 7: #ifndef lint ! 8: static char sccsid[] = "@(#)update.c 5.1 (Berkeley) 4/26/85"; ! 9: #endif not lint ! 10: ! 11: /* ! 12: * update: the key output optimization routine of the whole editor. ! 13: * The input consists of two bit matrices (mold is what's on the screen, ! 14: * mnew is what we want to be on the screen) and the coordinates of ! 15: * the lower left corner on the screen where this matrix is. ! 16: * This routine does whatever is necessary to get the screen to look ! 17: * like mnew, assuming that it currently looks like mold. ! 18: * ! 19: * (If I could patent this process for bread and other food I ! 20: * would be a rich man.) ! 21: */ ! 22: ! 23: #include "bit.h" ! 24: ! 25: update(mold, mnew, rows, cols, baser, basec) ! 26: bitmat mold, mnew; ! 27: int rows, cols, baser, basec; ! 28: { ! 29: int irow; ! 30: register int i, j, k; ! 31: int r1, r2, c1, c2, nr1, nr2, nc1, nc2; ! 32: extern int QUIET; ! 33: ! 34: #ifdef TRACE ! 35: if (trace) ! 36: fprintf(trace, "update(mold=%x, mnew=%x, rows=%d, cols=%d, baser=%d, basec=%d)\n", mold, mnew, rows, cols, baser, basec); ! 37: #endif ! 38: ! 39: if (QUIET) ! 40: return; ! 41: aminmax(mold, rows, cols, &r1, &c1, &r2, &c2); ! 42: aminmax(mnew, rows, cols, &nr1, &nc1, &nr2, &nc2); ! 43: r1 = min(r1, nr1); r2 = max(r2, nr2); ! 44: c1 = min(c1, nc1); c2 = max(c2, nc2); ! 45: ! 46: dumpmat("mold:", mold, rows, cols); ! 47: dumpmat("mnew:", mnew, rows, cols); ! 48: ! 49: for (i=r1; i<=r2; i++) { ! 50: irow = baser + rows - i - 1; ! 51: if (emptyrow(mnew, rows, cols, i)) { ! 52: if (emptyrow(mold, rows, cols, i)) { ! 53: continue; /* identically blank. skip. */ ! 54: } ! 55: /* ! 56: * Row i is to be cleared. Look for some more ! 57: * rows to clear and do it all at once. ! 58: */ ! 59: for (j=i+1; j<rows && emptyrow(mnew,rows,cols,j); j++) ! 60: ; ! 61: areaclear(baser+rows-j, basec, irow, basec+cols-1); ! 62: i = j-1; /* skip the others */ ! 63: } else for (j=c1; j<=c2; j++) { ! 64: /* ! 65: * Result row is not all blank. We look for stretches ! 66: * of bits that have to be changed (in either ! 67: * direction) and draw an exclusive or line over all ! 68: * the bits in each stretch. ! 69: */ ! 70: if (mat(mold,rows,cols,i,j,1)!=mat(mnew,rows,cols,i,j,2)){ ! 71: for (k=j+1; k<cols && mat(mold,rows,cols,i,k,3)!= ! 72: mat(mnew,rows,cols,i,k,4); k++) ! 73: ; ! 74: k--; ! 75: setxor(); ! 76: line(basec+j, irow, basec+k, irow); ! 77: j = k; /* skip the others */ ! 78: } ! 79: } ! 80: } ! 81: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.