xref: /csrg-svn/usr.bin/window/wwframe.c (revision 18735)
113983Sedward #ifndef lint
2*18735Sedward static char sccsid[] = "@(#)wwframe.c	3.16 04/24/85";
313983Sedward #endif
413983Sedward 
5*18735Sedward /*
6*18735Sedward  * Copyright (c) 1983 Regents of the University of California,
7*18735Sedward  * All rights reserved.  Redistribution permitted subject to
8*18735Sedward  * the terms of the Berkeley Software License Agreement.
9*18735Sedward  */
10*18735Sedward 
1113983Sedward #include "ww.h"
1214649Sedward #include "tt.h"
1313983Sedward 
1414756Sedward #define frameok(w, r, c) (w1 = wwindex[wwsmap[r][c]], \
1517406Sedward 	w1->ww_fmap || w1->ww_order > (w)->ww_order)
1614756Sedward 
1714415Sedward wwframe(w, wframe)
1814591Sedward register struct ww *w;
1914591Sedward struct ww *wframe;
2013983Sedward {
2114591Sedward 	register r, c;
2214591Sedward 	char a1, a2, a3;
2314591Sedward 	char b1, b2, b3;
2414591Sedward 	register char *smap;
2514591Sedward 	register code;
2614756Sedward 	register struct ww *w1;
2713983Sedward 
2814591Sedward 	if (w->ww_w.t > 0) {
2914591Sedward 		r = w->ww_w.t - 1;
3014972Sedward 		c = w->ww_i.l - 1;
3114591Sedward 		smap = &wwsmap[r + 1][c + 1];
3214591Sedward 		a1 = 0;
3314591Sedward 		a2 = 0;
3414591Sedward 		b1 = 0;
3514756Sedward 		b2 = c < 0 || frameok(w, r, c);
3613983Sedward 
3714972Sedward 		for (; c < w->ww_i.r; c++) {
3814829Sedward 			if (c + 1 >= wwncol) {
3914829Sedward 				a3 = 1;
4014829Sedward 				b3 = 1;
4114829Sedward 			} else {
4214829Sedward 				a3 = w->ww_index == *smap++;
4314829Sedward 				b3 = frameok(w, r, c + 1);
4414829Sedward 			}
4514591Sedward 			if (b2) {
4614591Sedward 				code = 0;
4714591Sedward 				if ((a1 || a2) && b1)
4814591Sedward 					code |= WWF_L;
4914591Sedward 				if ((a2 || a3) && b3)
5014591Sedward 					code |= WWF_R;
5114591Sedward 				if (code)
5214772Sedward 					wwframec(wframe, r, c, code|WWF_TOP);
5314591Sedward 			}
5414591Sedward 			a1 = a2;
5514591Sedward 			a2 = a3;
5614591Sedward 			b1 = b2;
5714591Sedward 			b2 = b3;
5814591Sedward 		}
5914591Sedward 		if ((a1 || a2) && b1 && b2)
6014772Sedward 			wwframec(wframe, r, c, WWF_L|WWF_TOP);
6113983Sedward 	}
6213983Sedward 
6314591Sedward 	if (w->ww_w.b < wwnrow) {
6414591Sedward 		r = w->ww_w.b;
6514972Sedward 		c = w->ww_i.l - 1;
6614591Sedward 		smap = &wwsmap[r - 1][c + 1];
6714591Sedward 		a1 = 0;
6814591Sedward 		a2 = 0;
6914591Sedward 		b1 = 0;
7014756Sedward 		b2 = c < 0 || frameok(w, r, c);
7113983Sedward 
7214972Sedward 		for (; c < w->ww_i.r; c++) {
7314829Sedward 			if (c + 1 >= wwncol) {
7414829Sedward 				a3 = 1;
7514829Sedward 				b3 = 1;
7614829Sedward 			} else {
7714829Sedward 				a3 = w->ww_index == *smap++;
7814829Sedward 				b3 = frameok(w, r, c + 1);
7914829Sedward 			}
8014591Sedward 			if (b2) {
8114591Sedward 				code = 0;
8214591Sedward 				if ((a1 || a2) && b1)
8314591Sedward 					code |= WWF_L;
8414591Sedward 				if ((a2 || a3) && b3)
8514591Sedward 					code |= WWF_R;
8614591Sedward 				if (code)
8714772Sedward 					wwframec(wframe, r, c, code);
8814591Sedward 			}
8914591Sedward 			a1 = a2;
9014591Sedward 			a2 = a3;
9114591Sedward 			b1 = b2;
9214591Sedward 			b2 = b3;
9314591Sedward 		}
9414591Sedward 		if ((a1 || a2) && b1 && b2)
9514772Sedward 			wwframec(wframe, r, c, WWF_L);
9613983Sedward 	}
9713983Sedward 
9814591Sedward 	if (w->ww_w.l > 0) {
9914972Sedward 		r = w->ww_i.t - 1;
10014591Sedward 		c = w->ww_w.l - 1;
10114591Sedward 		a1 = 0;
10214591Sedward 		a2 = 0;
10314591Sedward 		b1 = 0;
10414756Sedward 		b2 = r < 0 || frameok(w, r, c);
10514591Sedward 
10614972Sedward 		for (; r < w->ww_i.b; r++) {
10714829Sedward 			if (r + 1 >= wwnrow) {
10814829Sedward 				a3 = 1;
10914829Sedward 				b3 = 1;
11014829Sedward 			} else {
11114829Sedward 				a3 = w->ww_index == wwsmap[r + 1][c + 1];
11214829Sedward 				b3 = frameok(w, r + 1, c);
11314829Sedward 			}
11414591Sedward 			if (b2) {
11514591Sedward 				code = 0;
11614591Sedward 				if ((a1 || a2) && b1)
11714591Sedward 					code |= WWF_U;
11814591Sedward 				if ((a2 || a3) && b3)
11914591Sedward 					code |= WWF_D;
12014591Sedward 				if (code)
12114772Sedward 					wwframec(wframe, r, c, code);
12214591Sedward 			}
12314591Sedward 			a1 = a2;
12414591Sedward 			a2 = a3;
12514591Sedward 			b1 = b2;
12614591Sedward 			b2 = b3;
12714591Sedward 		}
12814591Sedward 		if ((a1 || a2) && b1 && b2)
12914772Sedward 			wwframec(wframe, r, c, WWF_U);
13013983Sedward 	}
13113983Sedward 
13214591Sedward 	if (w->ww_w.r < wwncol) {
13314972Sedward 		r = w->ww_i.t - 1;
13414591Sedward 		c = w->ww_w.r;
13514591Sedward 		a1 = 0;
13614591Sedward 		a2 = 0;
13714591Sedward 		b1 = 0;
13814756Sedward 		b2 = r < 0 || frameok(w, r, c);
13914415Sedward 
14014972Sedward 		for (; r < w->ww_i.b; r++) {
14114829Sedward 			if (r + 1 >= wwnrow) {
14214829Sedward 				a3 = 1;
14314829Sedward 				b3 = 1;
14414829Sedward 			} else {
14514829Sedward 				a3 = w->ww_index == wwsmap[r + 1][c - 1];
14614829Sedward 				b3 = frameok(w, r + 1, c);
14714829Sedward 			}
14814591Sedward 			if (b2) {
14914591Sedward 				code = 0;
15014591Sedward 				if ((a1 || a2) && b1)
15114591Sedward 					code |= WWF_U;
15214591Sedward 				if ((a2 || a3) && b3)
15314591Sedward 					code |= WWF_D;
15414591Sedward 				if (code)
15514772Sedward 					wwframec(wframe, r, c, code);
15614591Sedward 			}
15714591Sedward 			a1 = a2;
15814591Sedward 			a2 = a3;
15914591Sedward 			b1 = b2;
16014591Sedward 			b2 = b3;
16114591Sedward 		}
16214591Sedward 		if ((a1 || a2) && b1 && b2)
16314772Sedward 			wwframec(wframe, r, c, WWF_U);
16414415Sedward 	}
16513983Sedward }
16613983Sedward 
16714987Sedward wwframec(f, r, c, code)
16814415Sedward register struct ww *f;
16914987Sedward register r, c;
17014756Sedward char code;
17113983Sedward {
17214756Sedward 	char oldcode;
17315587Sedward 	register char *smap;
17413983Sedward 
17514987Sedward 	if (r < f->ww_i.t || r >= f->ww_i.b || c < f->ww_i.l || c >= f->ww_i.r)
17614415Sedward 		return;
17715587Sedward 
17815587Sedward 	smap = &wwsmap[r][c];
17915587Sedward 
18014591Sedward 	{
18114591Sedward 		register struct ww *w;
18214756Sedward 
18315587Sedward 		w = wwindex[*smap];
18414591Sedward 		if (w->ww_order > f->ww_order) {
18515587Sedward 			if (w != &wwnobody && w->ww_win[r][c] == 0)
18615587Sedward 				w->ww_nvis[r]--;
18715587Sedward 			*smap = f->ww_index;
18814415Sedward 		}
18913983Sedward 	}
19014772Sedward 
19114772Sedward 	if (f->ww_fmap != 0) {
19214591Sedward 		register char *fmap;
19314756Sedward 
19414772Sedward 		fmap = &f->ww_fmap[r][c];
19514756Sedward 		oldcode = *fmap;
19614591Sedward 		*fmap |= code;
19714591Sedward 		if (code & WWF_TOP)
19814591Sedward 			*fmap &= ~WWF_LABEL;
19914756Sedward 		code = *fmap;
20014756Sedward 	} else
20114756Sedward 		oldcode = 0;
20214756Sedward 	{
20314987Sedward 		register char *win = &f->ww_win[r][c];
20414756Sedward 
20515587Sedward 		if (*win == WWM_GLS && *smap == f->ww_index)
20614987Sedward 			f->ww_nvis[r]++;
20714987Sedward 		*win &= ~WWM_GLS;
20814987Sedward 	}
20914987Sedward 	if (oldcode != code && (code & WWF_LABEL) == 0) {
21014987Sedward 		register short frame;
21114756Sedward 
21215733Sedward 		frame = tt.tt_frame[code & WWF_MASK];
21314987Sedward 		f->ww_buf[r][c].c_w = frame;
21414987Sedward 		if (wwsmap[r][c] == f->ww_index) {
21515654Sedward 			wwtouched[r] |= WWU_TOUCHED;
21614987Sedward 			wwns[r][c].c_w = frame;
21714756Sedward 		}
21814591Sedward 	}
21913983Sedward }
220