|
|
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.