Commit | Line | Data |
---|---|---|
60de5df9 | 1 | /* |
46e9ea25 KB |
2 | * Copyright (c) 1983 Regents of the University of California. |
3 | * All rights reserved. | |
4 | * | |
5 | * Redistribution and use in source and binary forms are permitted | |
5e8b0e60 KB |
6 | * provided that the above copyright notice and this paragraph are |
7 | * duplicated in all such forms and that any documentation, | |
8 | * advertising materials, and other materials related to such | |
9 | * distribution and use acknowledge that the software was developed | |
10 | * by the University of California, Berkeley. The name of the | |
11 | * University may not be used to endorse or promote products derived | |
12 | * from this software without specific prior written permission. | |
13 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR | |
14 | * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED | |
15 | * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. | |
60de5df9 EW |
16 | */ |
17 | ||
46e9ea25 | 18 | #ifndef lint |
ca67e7b4 | 19 | static char sccsid[] = "@(#)wwframe.c 3.18 (Berkeley) 6/29/88"; |
46e9ea25 KB |
20 | #endif /* not lint */ |
21 | ||
65478625 | 22 | #include "ww.h" |
e908bfac | 23 | #include "tt.h" |
65478625 | 24 | |
6e2a769e | 25 | #define frameok(w, r, c) (w1 = wwindex[wwsmap[r][c]], \ |
4a4250bc | 26 | w1->ww_fmap || w1->ww_order > (w)->ww_order) |
6e2a769e | 27 | |
85af59e4 | 28 | wwframe(w, wframe) |
0896e17e EW |
29 | register struct ww *w; |
30 | struct ww *wframe; | |
65478625 | 31 | { |
0896e17e EW |
32 | register r, c; |
33 | char a1, a2, a3; | |
34 | char b1, b2, b3; | |
35 | register char *smap; | |
36 | register code; | |
6e2a769e | 37 | register struct ww *w1; |
65478625 | 38 | |
0896e17e EW |
39 | if (w->ww_w.t > 0) { |
40 | r = w->ww_w.t - 1; | |
19f9784c | 41 | c = w->ww_i.l - 1; |
0896e17e EW |
42 | smap = &wwsmap[r + 1][c + 1]; |
43 | a1 = 0; | |
44 | a2 = 0; | |
45 | b1 = 0; | |
6e2a769e | 46 | b2 = c < 0 || frameok(w, r, c); |
65478625 | 47 | |
19f9784c | 48 | for (; c < w->ww_i.r; c++) { |
3531d4a4 EW |
49 | if (c + 1 >= wwncol) { |
50 | a3 = 1; | |
51 | b3 = 1; | |
52 | } else { | |
53 | a3 = w->ww_index == *smap++; | |
54 | b3 = frameok(w, r, c + 1); | |
55 | } | |
0896e17e EW |
56 | if (b2) { |
57 | code = 0; | |
58 | if ((a1 || a2) && b1) | |
59 | code |= WWF_L; | |
60 | if ((a2 || a3) && b3) | |
61 | code |= WWF_R; | |
62 | if (code) | |
2357b64e | 63 | wwframec(wframe, r, c, code|WWF_TOP); |
0896e17e EW |
64 | } |
65 | a1 = a2; | |
66 | a2 = a3; | |
67 | b1 = b2; | |
68 | b2 = b3; | |
69 | } | |
70 | if ((a1 || a2) && b1 && b2) | |
2357b64e | 71 | wwframec(wframe, r, c, WWF_L|WWF_TOP); |
65478625 EW |
72 | } |
73 | ||
0896e17e EW |
74 | if (w->ww_w.b < wwnrow) { |
75 | r = w->ww_w.b; | |
19f9784c | 76 | c = w->ww_i.l - 1; |
0896e17e EW |
77 | smap = &wwsmap[r - 1][c + 1]; |
78 | a1 = 0; | |
79 | a2 = 0; | |
80 | b1 = 0; | |
6e2a769e | 81 | b2 = c < 0 || frameok(w, r, c); |
0896e17e | 82 | |
19f9784c | 83 | for (; c < w->ww_i.r; c++) { |
3531d4a4 EW |
84 | if (c + 1 >= wwncol) { |
85 | a3 = 1; | |
86 | b3 = 1; | |
87 | } else { | |
88 | a3 = w->ww_index == *smap++; | |
89 | b3 = frameok(w, r, c + 1); | |
90 | } | |
0896e17e EW |
91 | if (b2) { |
92 | code = 0; | |
93 | if ((a1 || a2) && b1) | |
94 | code |= WWF_L; | |
95 | if ((a2 || a3) && b3) | |
96 | code |= WWF_R; | |
97 | if (code) | |
2357b64e | 98 | wwframec(wframe, r, c, code); |
0896e17e EW |
99 | } |
100 | a1 = a2; | |
101 | a2 = a3; | |
102 | b1 = b2; | |
103 | b2 = b3; | |
104 | } | |
105 | if ((a1 || a2) && b1 && b2) | |
2357b64e | 106 | wwframec(wframe, r, c, WWF_L); |
65478625 | 107 | } |
65478625 | 108 | |
0896e17e | 109 | if (w->ww_w.l > 0) { |
19f9784c | 110 | r = w->ww_i.t - 1; |
0896e17e EW |
111 | c = w->ww_w.l - 1; |
112 | a1 = 0; | |
113 | a2 = 0; | |
114 | b1 = 0; | |
6e2a769e | 115 | b2 = r < 0 || frameok(w, r, c); |
85af59e4 | 116 | |
19f9784c | 117 | for (; r < w->ww_i.b; r++) { |
3531d4a4 EW |
118 | if (r + 1 >= wwnrow) { |
119 | a3 = 1; | |
120 | b3 = 1; | |
121 | } else { | |
122 | a3 = w->ww_index == wwsmap[r + 1][c + 1]; | |
123 | b3 = frameok(w, r + 1, c); | |
124 | } | |
0896e17e EW |
125 | if (b2) { |
126 | code = 0; | |
127 | if ((a1 || a2) && b1) | |
128 | code |= WWF_U; | |
129 | if ((a2 || a3) && b3) | |
130 | code |= WWF_D; | |
131 | if (code) | |
2357b64e | 132 | wwframec(wframe, r, c, code); |
0896e17e EW |
133 | } |
134 | a1 = a2; | |
135 | a2 = a3; | |
136 | b1 = b2; | |
137 | b2 = b3; | |
138 | } | |
139 | if ((a1 || a2) && b1 && b2) | |
2357b64e | 140 | wwframec(wframe, r, c, WWF_U); |
85af59e4 | 141 | } |
0896e17e EW |
142 | |
143 | if (w->ww_w.r < wwncol) { | |
19f9784c | 144 | r = w->ww_i.t - 1; |
0896e17e EW |
145 | c = w->ww_w.r; |
146 | a1 = 0; | |
147 | a2 = 0; | |
148 | b1 = 0; | |
6e2a769e | 149 | b2 = r < 0 || frameok(w, r, c); |
0896e17e | 150 | |
19f9784c | 151 | for (; r < w->ww_i.b; r++) { |
3531d4a4 EW |
152 | if (r + 1 >= wwnrow) { |
153 | a3 = 1; | |
154 | b3 = 1; | |
155 | } else { | |
156 | a3 = w->ww_index == wwsmap[r + 1][c - 1]; | |
157 | b3 = frameok(w, r + 1, c); | |
158 | } | |
0896e17e EW |
159 | if (b2) { |
160 | code = 0; | |
161 | if ((a1 || a2) && b1) | |
162 | code |= WWF_U; | |
163 | if ((a2 || a3) && b3) | |
164 | code |= WWF_D; | |
165 | if (code) | |
2357b64e | 166 | wwframec(wframe, r, c, code); |
0896e17e EW |
167 | } |
168 | a1 = a2; | |
169 | a2 = a3; | |
170 | b1 = b2; | |
171 | b2 = b3; | |
172 | } | |
173 | if ((a1 || a2) && b1 && b2) | |
2357b64e | 174 | wwframec(wframe, r, c, WWF_U); |
65478625 | 175 | } |
65478625 EW |
176 | } |
177 | ||
f2a77fe1 | 178 | wwframec(f, r, c, code) |
85af59e4 | 179 | register struct ww *f; |
f2a77fe1 | 180 | register r, c; |
6e2a769e | 181 | char code; |
85af59e4 | 182 | { |
6e2a769e | 183 | char oldcode; |
84ad208b | 184 | register char *smap; |
85af59e4 | 185 | |
f2a77fe1 | 186 | if (r < f->ww_i.t || r >= f->ww_i.b || c < f->ww_i.l || c >= f->ww_i.r) |
85af59e4 | 187 | return; |
84ad208b EW |
188 | |
189 | smap = &wwsmap[r][c]; | |
190 | ||
0896e17e EW |
191 | { |
192 | register struct ww *w; | |
6e2a769e | 193 | |
84ad208b | 194 | w = wwindex[*smap]; |
0896e17e | 195 | if (w->ww_order > f->ww_order) { |
84ad208b EW |
196 | if (w != &wwnobody && w->ww_win[r][c] == 0) |
197 | w->ww_nvis[r]--; | |
198 | *smap = f->ww_index; | |
c417b691 | 199 | } |
85af59e4 | 200 | } |
2357b64e | 201 | |
2357b64e | 202 | if (f->ww_fmap != 0) { |
0896e17e | 203 | register char *fmap; |
6e2a769e | 204 | |
2357b64e | 205 | fmap = &f->ww_fmap[r][c]; |
6e2a769e | 206 | oldcode = *fmap; |
0896e17e EW |
207 | *fmap |= code; |
208 | if (code & WWF_TOP) | |
209 | *fmap &= ~WWF_LABEL; | |
6e2a769e EW |
210 | code = *fmap; |
211 | } else | |
212 | oldcode = 0; | |
213 | { | |
f2a77fe1 | 214 | register char *win = &f->ww_win[r][c]; |
6e2a769e | 215 | |
84ad208b | 216 | if (*win == WWM_GLS && *smap == f->ww_index) |
f2a77fe1 EW |
217 | f->ww_nvis[r]++; |
218 | *win &= ~WWM_GLS; | |
219 | } | |
220 | if (oldcode != code && (code & WWF_LABEL) == 0) { | |
221 | register short frame; | |
222 | ||
a830e8bb | 223 | frame = tt.tt_frame[code & WWF_MASK]; |
f2a77fe1 EW |
224 | f->ww_buf[r][c].c_w = frame; |
225 | if (wwsmap[r][c] == f->ww_index) { | |
04d70db4 | 226 | wwtouched[r] |= WWU_TOUCHED; |
f2a77fe1 | 227 | wwns[r][c].c_w = frame; |
861cd1ed | 228 | } |
0896e17e EW |
229 | } |
230 | } |