Commit | Line | Data |
---|---|---|
65478625 | 1 | #ifndef lint |
2357b64e | 2 | static char *sccsid = "@(#)wwframe.c 3.7 83/08/19"; |
65478625 EW |
3 | #endif |
4 | ||
5 | #include "ww.h" | |
e908bfac | 6 | #include "tt.h" |
65478625 | 7 | |
6e2a769e EW |
8 | #define frameok(w, r, c) (w1 = wwindex[wwsmap[r][c]], \ |
9 | !w1->ww_hasframe || w1->ww_order > (w)->ww_order) | |
10 | ||
85af59e4 | 11 | wwframe(w, wframe) |
0896e17e EW |
12 | register struct ww *w; |
13 | struct ww *wframe; | |
65478625 | 14 | { |
0896e17e EW |
15 | register r, c; |
16 | char a1, a2, a3; | |
17 | char b1, b2, b3; | |
18 | register char *smap; | |
19 | register code; | |
6e2a769e | 20 | register struct ww *w1; |
65478625 | 21 | |
0896e17e EW |
22 | if (w->ww_w.t > 0) { |
23 | r = w->ww_w.t - 1; | |
24 | c = w->ww_w.l - 1; | |
25 | smap = &wwsmap[r + 1][c + 1]; | |
26 | a1 = 0; | |
27 | a2 = 0; | |
28 | b1 = 0; | |
6e2a769e | 29 | b2 = c < 0 || frameok(w, r, c); |
65478625 | 30 | |
0896e17e EW |
31 | for (; c < w->ww_w.r; c++) { |
32 | a3 = w->ww_index == *smap++; | |
6e2a769e | 33 | b3 = c + 1 >= wwncol || frameok(w, r, c + 1); |
0896e17e EW |
34 | if (b2) { |
35 | code = 0; | |
36 | if ((a1 || a2) && b1) | |
37 | code |= WWF_L; | |
38 | if ((a2 || a3) && b3) | |
39 | code |= WWF_R; | |
40 | if (code) | |
2357b64e | 41 | wwframec(wframe, r, c, code|WWF_TOP); |
0896e17e EW |
42 | } |
43 | a1 = a2; | |
44 | a2 = a3; | |
45 | b1 = b2; | |
46 | b2 = b3; | |
47 | } | |
48 | if ((a1 || a2) && b1 && b2) | |
2357b64e | 49 | wwframec(wframe, r, c, WWF_L|WWF_TOP); |
65478625 EW |
50 | } |
51 | ||
0896e17e EW |
52 | if (w->ww_w.b < wwnrow) { |
53 | r = w->ww_w.b; | |
54 | c = w->ww_w.l - 1; | |
55 | smap = &wwsmap[r - 1][c + 1]; | |
56 | a1 = 0; | |
57 | a2 = 0; | |
58 | b1 = 0; | |
6e2a769e | 59 | b2 = c < 0 || frameok(w, r, c); |
0896e17e EW |
60 | |
61 | for (; c < w->ww_w.r; c++) { | |
62 | a3 = w->ww_index == *smap++; | |
6e2a769e | 63 | b3 = c + 1 >= wwncol || frameok(w, r, c + 1); |
0896e17e EW |
64 | if (b2) { |
65 | code = 0; | |
66 | if ((a1 || a2) && b1) | |
67 | code |= WWF_L; | |
68 | if ((a2 || a3) && b3) | |
69 | code |= WWF_R; | |
70 | if (code) | |
2357b64e | 71 | wwframec(wframe, r, c, code); |
0896e17e EW |
72 | } |
73 | a1 = a2; | |
74 | a2 = a3; | |
75 | b1 = b2; | |
76 | b2 = b3; | |
77 | } | |
78 | if ((a1 || a2) && b1 && b2) | |
2357b64e | 79 | wwframec(wframe, r, c, WWF_L); |
65478625 | 80 | } |
65478625 | 81 | |
0896e17e EW |
82 | if (w->ww_w.l > 0) { |
83 | r = w->ww_w.t - 1; | |
84 | c = w->ww_w.l - 1; | |
85 | a1 = 0; | |
86 | a2 = 0; | |
87 | b1 = 0; | |
6e2a769e | 88 | b2 = r < 0 || frameok(w, r, c); |
85af59e4 | 89 | |
0896e17e EW |
90 | for (; r < w->ww_w.b; r++) { |
91 | a3 = w->ww_index == wwsmap[r + 1][c + 1]; | |
6e2a769e | 92 | b3 = r + 1 >= wwnrow || frameok(w, r + 1, c); |
0896e17e EW |
93 | if (b2) { |
94 | code = 0; | |
95 | if ((a1 || a2) && b1) | |
96 | code |= WWF_U; | |
97 | if ((a2 || a3) && b3) | |
98 | code |= WWF_D; | |
99 | if (code) | |
2357b64e | 100 | wwframec(wframe, r, c, code); |
0896e17e EW |
101 | } |
102 | a1 = a2; | |
103 | a2 = a3; | |
104 | b1 = b2; | |
105 | b2 = b3; | |
106 | } | |
107 | if ((a1 || a2) && b1 && b2) | |
2357b64e | 108 | wwframec(wframe, r, c, WWF_U); |
85af59e4 | 109 | } |
0896e17e EW |
110 | |
111 | if (w->ww_w.r < wwncol) { | |
112 | r = w->ww_w.t - 1; | |
113 | c = w->ww_w.r; | |
114 | a1 = 0; | |
115 | a2 = 0; | |
116 | b1 = 0; | |
6e2a769e | 117 | b2 = r < 0 || frameok(w, r, c); |
0896e17e EW |
118 | |
119 | for (; r < w->ww_w.b; r++) { | |
120 | a3 = w->ww_index == wwsmap[r + 1][c - 1]; | |
6e2a769e | 121 | b3 = r + 1 >= wwnrow || frameok(w, r + 1, c); |
0896e17e EW |
122 | if (b2) { |
123 | code = 0; | |
124 | if ((a1 || a2) && b1) | |
125 | code |= WWF_U; | |
126 | if ((a2 || a3) && b3) | |
127 | code |= WWF_D; | |
128 | if (code) | |
2357b64e | 129 | wwframec(wframe, r, c, code); |
0896e17e EW |
130 | } |
131 | a1 = a2; | |
132 | a2 = a3; | |
133 | b1 = b2; | |
134 | b2 = b3; | |
135 | } | |
136 | if ((a1 || a2) && b1 && b2) | |
2357b64e | 137 | wwframec(wframe, r, c, WWF_U); |
65478625 | 138 | } |
65478625 EW |
139 | } |
140 | ||
2357b64e | 141 | wwframec(f, rr, cc, code) |
85af59e4 EW |
142 | register struct ww *f; |
143 | register rr, cc; | |
6e2a769e | 144 | char code; |
85af59e4 | 145 | { |
2357b64e | 146 | register r, c; |
6e2a769e | 147 | char oldcode; |
85af59e4 | 148 | |
43c1dd56 EW |
149 | if (rr < f->ww_w.t || rr >= f->ww_w.b |
150 | || cc < f->ww_w.l || cc >= f->ww_w.r) | |
85af59e4 | 151 | return; |
0896e17e EW |
152 | { |
153 | register struct ww *w; | |
6e2a769e | 154 | |
0896e17e EW |
155 | w = wwindex[wwsmap[rr][cc]]; |
156 | if (w->ww_order > f->ww_order) { | |
157 | if (w != &wwnobody) { | |
158 | r = rr - w->ww_w.t; | |
159 | c = cc - w->ww_w.l; | |
160 | if ((w->ww_win[r][c] |= WWM_COV) == WWM_COV) | |
161 | w->ww_nvis[r]--; | |
162 | w->ww_cov[r][c] = f->ww_index; | |
163 | } | |
164 | wwsmap[rr][cc] = f->ww_index; | |
c417b691 | 165 | } |
85af59e4 | 166 | } |
2357b64e EW |
167 | |
168 | r = rr - f->ww_w.t; | |
169 | c = cc - f->ww_w.l; | |
170 | if (f->ww_fmap != 0) { | |
0896e17e | 171 | register char *fmap; |
6e2a769e | 172 | |
2357b64e | 173 | fmap = &f->ww_fmap[r][c]; |
6e2a769e | 174 | oldcode = *fmap; |
0896e17e EW |
175 | *fmap |= code; |
176 | if (code & WWF_TOP) | |
177 | *fmap &= ~WWF_LABEL; | |
6e2a769e EW |
178 | code = *fmap; |
179 | } else | |
180 | oldcode = 0; | |
181 | { | |
6e2a769e EW |
182 | { |
183 | register char *win = &f->ww_win[r][c]; | |
184 | ||
185 | if (*win == WWM_GLS) | |
186 | f->ww_nvis[r]++; | |
187 | *win &= ~WWM_GLS; | |
188 | } | |
189 | if (oldcode != code && (code & WWF_LABEL) == 0) { | |
190 | register short frame; | |
191 | ||
192 | frame = tt.tt_frame[code & WWF_MASK] & WWC_CMASK; | |
193 | f->ww_buf[f->ww_scroll + r][c].c_w = frame; | |
194 | if (wwsmap[rr][cc] == f->ww_index) { | |
195 | wwtouched[rr] = 1; | |
196 | wwns[rr][cc].c_w = frame; | |
197 | } | |
861cd1ed | 198 | } |
0896e17e EW |
199 | } |
200 | } |