xref: /csrg-svn/usr.bin/window/wwframe.c (revision 14987)
113983Sedward #ifndef lint
2*14987Sedward static	char *sccsid = "@(#)wwframe.c	3.10 83/09/15";
313983Sedward #endif
413983Sedward 
513983Sedward #include "ww.h"
614649Sedward #include "tt.h"
713983Sedward 
814756Sedward #define frameok(w, r, c) (w1 = wwindex[wwsmap[r][c]], \
914756Sedward 	!w1->ww_hasframe || w1->ww_order > (w)->ww_order)
1014756Sedward 
1114415Sedward wwframe(w, wframe)
1214591Sedward register struct ww *w;
1314591Sedward struct ww *wframe;
1413983Sedward {
1514591Sedward 	register r, c;
1614591Sedward 	char a1, a2, a3;
1714591Sedward 	char b1, b2, b3;
1814591Sedward 	register char *smap;
1914591Sedward 	register code;
2014756Sedward 	register struct ww *w1;
2113983Sedward 
2214591Sedward 	if (w->ww_w.t > 0) {
2314591Sedward 		r = w->ww_w.t - 1;
2414972Sedward 		c = w->ww_i.l - 1;
2514591Sedward 		smap = &wwsmap[r + 1][c + 1];
2614591Sedward 		a1 = 0;
2714591Sedward 		a2 = 0;
2814591Sedward 		b1 = 0;
2914756Sedward 		b2 = c < 0 || frameok(w, r, c);
3013983Sedward 
3114972Sedward 		for (; c < w->ww_i.r; c++) {
3214829Sedward 			if (c + 1 >= wwncol) {
3314829Sedward 				a3 = 1;
3414829Sedward 				b3 = 1;
3514829Sedward 			} else {
3614829Sedward 				a3 = w->ww_index == *smap++;
3714829Sedward 				b3 = frameok(w, r, c + 1);
3814829Sedward 			}
3914591Sedward 			if (b2) {
4014591Sedward 				code = 0;
4114591Sedward 				if ((a1 || a2) && b1)
4214591Sedward 					code |= WWF_L;
4314591Sedward 				if ((a2 || a3) && b3)
4414591Sedward 					code |= WWF_R;
4514591Sedward 				if (code)
4614772Sedward 					wwframec(wframe, r, c, code|WWF_TOP);
4714591Sedward 			}
4814591Sedward 			a1 = a2;
4914591Sedward 			a2 = a3;
5014591Sedward 			b1 = b2;
5114591Sedward 			b2 = b3;
5214591Sedward 		}
5314591Sedward 		if ((a1 || a2) && b1 && b2)
5414772Sedward 			wwframec(wframe, r, c, WWF_L|WWF_TOP);
5513983Sedward 	}
5613983Sedward 
5714591Sedward 	if (w->ww_w.b < wwnrow) {
5814591Sedward 		r = w->ww_w.b;
5914972Sedward 		c = w->ww_i.l - 1;
6014591Sedward 		smap = &wwsmap[r - 1][c + 1];
6114591Sedward 		a1 = 0;
6214591Sedward 		a2 = 0;
6314591Sedward 		b1 = 0;
6414756Sedward 		b2 = c < 0 || frameok(w, r, c);
6513983Sedward 
6614972Sedward 		for (; c < w->ww_i.r; c++) {
6714829Sedward 			if (c + 1 >= wwncol) {
6814829Sedward 				a3 = 1;
6914829Sedward 				b3 = 1;
7014829Sedward 			} else {
7114829Sedward 				a3 = w->ww_index == *smap++;
7214829Sedward 				b3 = frameok(w, r, c + 1);
7314829Sedward 			}
7414591Sedward 			if (b2) {
7514591Sedward 				code = 0;
7614591Sedward 				if ((a1 || a2) && b1)
7714591Sedward 					code |= WWF_L;
7814591Sedward 				if ((a2 || a3) && b3)
7914591Sedward 					code |= WWF_R;
8014591Sedward 				if (code)
8114772Sedward 					wwframec(wframe, r, c, code);
8214591Sedward 			}
8314591Sedward 			a1 = a2;
8414591Sedward 			a2 = a3;
8514591Sedward 			b1 = b2;
8614591Sedward 			b2 = b3;
8714591Sedward 		}
8814591Sedward 		if ((a1 || a2) && b1 && b2)
8914772Sedward 			wwframec(wframe, r, c, WWF_L);
9013983Sedward 	}
9113983Sedward 
9214591Sedward 	if (w->ww_w.l > 0) {
9314972Sedward 		r = w->ww_i.t - 1;
9414591Sedward 		c = w->ww_w.l - 1;
9514591Sedward 		a1 = 0;
9614591Sedward 		a2 = 0;
9714591Sedward 		b1 = 0;
9814756Sedward 		b2 = r < 0 || frameok(w, r, c);
9914591Sedward 
10014972Sedward 		for (; r < w->ww_i.b; r++) {
10114829Sedward 			if (r + 1 >= wwnrow) {
10214829Sedward 				a3 = 1;
10314829Sedward 				b3 = 1;
10414829Sedward 			} else {
10514829Sedward 				a3 = w->ww_index == wwsmap[r + 1][c + 1];
10614829Sedward 				b3 = frameok(w, r + 1, c);
10714829Sedward 			}
10814591Sedward 			if (b2) {
10914591Sedward 				code = 0;
11014591Sedward 				if ((a1 || a2) && b1)
11114591Sedward 					code |= WWF_U;
11214591Sedward 				if ((a2 || a3) && b3)
11314591Sedward 					code |= WWF_D;
11414591Sedward 				if (code)
11514772Sedward 					wwframec(wframe, r, c, code);
11614591Sedward 			}
11714591Sedward 			a1 = a2;
11814591Sedward 			a2 = a3;
11914591Sedward 			b1 = b2;
12014591Sedward 			b2 = b3;
12114591Sedward 		}
12214591Sedward 		if ((a1 || a2) && b1 && b2)
12314772Sedward 			wwframec(wframe, r, c, WWF_U);
12413983Sedward 	}
12513983Sedward 
12614591Sedward 	if (w->ww_w.r < wwncol) {
12714972Sedward 		r = w->ww_i.t - 1;
12814591Sedward 		c = w->ww_w.r;
12914591Sedward 		a1 = 0;
13014591Sedward 		a2 = 0;
13114591Sedward 		b1 = 0;
13214756Sedward 		b2 = r < 0 || frameok(w, r, c);
13314415Sedward 
13414972Sedward 		for (; r < w->ww_i.b; r++) {
13514829Sedward 			if (r + 1 >= wwnrow) {
13614829Sedward 				a3 = 1;
13714829Sedward 				b3 = 1;
13814829Sedward 			} else {
13914829Sedward 				a3 = w->ww_index == wwsmap[r + 1][c - 1];
14014829Sedward 				b3 = frameok(w, r + 1, c);
14114829Sedward 			}
14214591Sedward 			if (b2) {
14314591Sedward 				code = 0;
14414591Sedward 				if ((a1 || a2) && b1)
14514591Sedward 					code |= WWF_U;
14614591Sedward 				if ((a2 || a3) && b3)
14714591Sedward 					code |= WWF_D;
14814591Sedward 				if (code)
14914772Sedward 					wwframec(wframe, r, c, code);
15014591Sedward 			}
15114591Sedward 			a1 = a2;
15214591Sedward 			a2 = a3;
15314591Sedward 			b1 = b2;
15414591Sedward 			b2 = b3;
15514591Sedward 		}
15614591Sedward 		if ((a1 || a2) && b1 && b2)
15714772Sedward 			wwframec(wframe, r, c, WWF_U);
15814415Sedward 	}
15913983Sedward }
16013983Sedward 
161*14987Sedward wwframec(f, r, c, code)
16214415Sedward register struct ww *f;
163*14987Sedward register r, c;
16414756Sedward char code;
16513983Sedward {
16614756Sedward 	char oldcode;
16713983Sedward 
168*14987Sedward 	if (r < f->ww_i.t || r >= f->ww_i.b || c < f->ww_i.l || c >= f->ww_i.r)
16914415Sedward 		return;
17014591Sedward 	{
17114591Sedward 		register struct ww *w;
17214756Sedward 
173*14987Sedward 		w = wwindex[wwsmap[r][c]];
17414591Sedward 		if (w->ww_order > f->ww_order) {
17514591Sedward 			if (w != &wwnobody) {
17614591Sedward 				if ((w->ww_win[r][c] |= WWM_COV) == WWM_COV)
17714591Sedward 					w->ww_nvis[r]--;
17814591Sedward 				w->ww_cov[r][c] = f->ww_index;
17914591Sedward 			}
180*14987Sedward 			wwsmap[r][c] = f->ww_index;
18114415Sedward 		}
18213983Sedward 	}
18314772Sedward 
18414772Sedward 	if (f->ww_fmap != 0) {
18514591Sedward 		register char *fmap;
18614756Sedward 
18714772Sedward 		fmap = &f->ww_fmap[r][c];
18814756Sedward 		oldcode = *fmap;
18914591Sedward 		*fmap |= code;
19014591Sedward 		if (code & WWF_TOP)
19114591Sedward 			*fmap &= ~WWF_LABEL;
19214756Sedward 		code = *fmap;
19314756Sedward 	} else
19414756Sedward 		oldcode = 0;
19514756Sedward 	{
196*14987Sedward 		register char *win = &f->ww_win[r][c];
19714756Sedward 
198*14987Sedward 		if (*win == WWM_GLS)
199*14987Sedward 			f->ww_nvis[r]++;
200*14987Sedward 		*win &= ~WWM_GLS;
201*14987Sedward 	}
202*14987Sedward 	if (oldcode != code && (code & WWF_LABEL) == 0) {
203*14987Sedward 		register short frame;
20414756Sedward 
205*14987Sedward 		frame = tt.tt_frame[code & WWF_MASK] & WWC_CMASK;
206*14987Sedward 		f->ww_buf[r][c].c_w = frame;
207*14987Sedward 		if (wwsmap[r][c] == f->ww_index) {
208*14987Sedward 			wwtouched[r] = 1;
209*14987Sedward 			wwns[r][c].c_w = frame;
21014756Sedward 		}
21114591Sedward 	}
21213983Sedward }
213