1 /*
2 * Copyright (c) 1983, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Edward Wang at The University of California, Berkeley.
7 *
8 * %sccs.include.redist.c%
9 */
10
11 #ifndef lint
12 static char sccsid[] = "@(#)wwframe.c 8.1 (Berkeley) 06/06/93";
13 #endif /* not lint */
14
15 #include "ww.h"
16 #include "tt.h"
17
18 #define frameok(w, r, c) (w1 = wwindex[wwsmap[r][c]], \
19 w1->ww_fmap || w1->ww_order > (w)->ww_order)
20
wwframe(w,wframe)21 wwframe(w, wframe)
22 register struct ww *w;
23 struct ww *wframe;
24 {
25 register r, c;
26 char a1, a2, a3;
27 char b1, b2, b3;
28 register char *smap;
29 register code;
30 register struct ww *w1;
31
32 if (w->ww_w.t > 0) {
33 r = w->ww_w.t - 1;
34 c = w->ww_i.l - 1;
35 smap = &wwsmap[r + 1][c + 1];
36 a1 = 0;
37 a2 = 0;
38 b1 = 0;
39 b2 = c < 0 || frameok(w, r, c);
40
41 for (; c < w->ww_i.r; c++) {
42 if (c + 1 >= wwncol) {
43 a3 = 1;
44 b3 = 1;
45 } else {
46 a3 = w->ww_index == *smap++;
47 b3 = frameok(w, r, c + 1);
48 }
49 if (b2) {
50 code = 0;
51 if ((a1 || a2) && b1)
52 code |= WWF_L;
53 if ((a2 || a3) && b3)
54 code |= WWF_R;
55 if (code)
56 wwframec(wframe, r, c, code|WWF_TOP);
57 }
58 a1 = a2;
59 a2 = a3;
60 b1 = b2;
61 b2 = b3;
62 }
63 if ((a1 || a2) && b1 && b2)
64 wwframec(wframe, r, c, WWF_L|WWF_TOP);
65 }
66
67 if (w->ww_w.b < wwnrow) {
68 r = w->ww_w.b;
69 c = w->ww_i.l - 1;
70 smap = &wwsmap[r - 1][c + 1];
71 a1 = 0;
72 a2 = 0;
73 b1 = 0;
74 b2 = c < 0 || frameok(w, r, c);
75
76 for (; c < w->ww_i.r; c++) {
77 if (c + 1 >= wwncol) {
78 a3 = 1;
79 b3 = 1;
80 } else {
81 a3 = w->ww_index == *smap++;
82 b3 = frameok(w, r, c + 1);
83 }
84 if (b2) {
85 code = 0;
86 if ((a1 || a2) && b1)
87 code |= WWF_L;
88 if ((a2 || a3) && b3)
89 code |= WWF_R;
90 if (code)
91 wwframec(wframe, r, c, code);
92 }
93 a1 = a2;
94 a2 = a3;
95 b1 = b2;
96 b2 = b3;
97 }
98 if ((a1 || a2) && b1 && b2)
99 wwframec(wframe, r, c, WWF_L);
100 }
101
102 if (w->ww_w.l > 0) {
103 r = w->ww_i.t - 1;
104 c = w->ww_w.l - 1;
105 a1 = 0;
106 a2 = 0;
107 b1 = 0;
108 b2 = r < 0 || frameok(w, r, c);
109
110 for (; r < w->ww_i.b; r++) {
111 if (r + 1 >= wwnrow) {
112 a3 = 1;
113 b3 = 1;
114 } else {
115 a3 = w->ww_index == wwsmap[r + 1][c + 1];
116 b3 = frameok(w, r + 1, c);
117 }
118 if (b2) {
119 code = 0;
120 if ((a1 || a2) && b1)
121 code |= WWF_U;
122 if ((a2 || a3) && b3)
123 code |= WWF_D;
124 if (code)
125 wwframec(wframe, r, c, code);
126 }
127 a1 = a2;
128 a2 = a3;
129 b1 = b2;
130 b2 = b3;
131 }
132 if ((a1 || a2) && b1 && b2)
133 wwframec(wframe, r, c, WWF_U);
134 }
135
136 if (w->ww_w.r < wwncol) {
137 r = w->ww_i.t - 1;
138 c = w->ww_w.r;
139 a1 = 0;
140 a2 = 0;
141 b1 = 0;
142 b2 = r < 0 || frameok(w, r, c);
143
144 for (; r < w->ww_i.b; r++) {
145 if (r + 1 >= wwnrow) {
146 a3 = 1;
147 b3 = 1;
148 } else {
149 a3 = w->ww_index == wwsmap[r + 1][c - 1];
150 b3 = frameok(w, r + 1, c);
151 }
152 if (b2) {
153 code = 0;
154 if ((a1 || a2) && b1)
155 code |= WWF_U;
156 if ((a2 || a3) && b3)
157 code |= WWF_D;
158 if (code)
159 wwframec(wframe, r, c, code);
160 }
161 a1 = a2;
162 a2 = a3;
163 b1 = b2;
164 b2 = b3;
165 }
166 if ((a1 || a2) && b1 && b2)
167 wwframec(wframe, r, c, WWF_U);
168 }
169 }
170
wwframec(f,r,c,code)171 wwframec(f, r, c, code)
172 register struct ww *f;
173 register r, c;
174 char code;
175 {
176 char oldcode;
177 register char *smap;
178
179 if (r < f->ww_i.t || r >= f->ww_i.b || c < f->ww_i.l || c >= f->ww_i.r)
180 return;
181
182 smap = &wwsmap[r][c];
183
184 {
185 register struct ww *w;
186
187 w = wwindex[*smap];
188 if (w->ww_order > f->ww_order) {
189 if (w != &wwnobody && w->ww_win[r][c] == 0)
190 w->ww_nvis[r]--;
191 *smap = f->ww_index;
192 }
193 }
194
195 if (f->ww_fmap != 0) {
196 register char *fmap;
197
198 fmap = &f->ww_fmap[r][c];
199 oldcode = *fmap;
200 *fmap |= code;
201 if (code & WWF_TOP)
202 *fmap &= ~WWF_LABEL;
203 code = *fmap;
204 } else
205 oldcode = 0;
206 {
207 register char *win = &f->ww_win[r][c];
208
209 if (*win == WWM_GLS && *smap == f->ww_index)
210 f->ww_nvis[r]++;
211 *win &= ~WWM_GLS;
212 }
213 if (oldcode != code && (code & WWF_LABEL) == 0) {
214 register short frame;
215
216 frame = tt.tt_frame[code & WWF_MASK];
217 f->ww_buf[r][c].c_w = frame;
218 if (wwsmap[r][c] == f->ww_index) {
219 wwtouched[r] |= WWU_TOUCHED;
220 wwns[r][c].c_w = frame;
221 }
222 }
223 }
224