add vdioctl
[unix-history] / usr / src / old / lib2648 / update.c
CommitLineData
97e3edfb
DF
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
8static char sccsid[] = "@(#)update.c 5.1 (Berkeley) %G%";
9#endif not lint
10
9999bdc7
RC
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
25update(mold, mnew, rows, cols, baser, basec)
26bitmat mold, mnew;
27int 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}