xref: /csrg-svn/usr.bin/window/wwframe.c (revision 33514)
118735Sedward /*
2*33514Sbostic  * Copyright (c) 1983 Regents of the University of California.
3*33514Sbostic  * All rights reserved.
4*33514Sbostic  *
5*33514Sbostic  * Redistribution and use in source and binary forms are permitted
6*33514Sbostic  * provided that this notice is preserved and that due credit is given
7*33514Sbostic  * to the University of California at Berkeley. The name of the University
8*33514Sbostic  * may not be used to endorse or promote products derived from this
9*33514Sbostic  * software without specific prior written permission. This software
10*33514Sbostic  * is provided ``as is'' without express or implied warranty.
1118735Sedward  */
1218735Sedward 
13*33514Sbostic #ifndef lint
14*33514Sbostic static char sccsid[] = "@(#)wwframe.c	3.17 (Berkeley) 02/21/88";
15*33514Sbostic #endif /* not lint */
16*33514Sbostic 
1713983Sedward #include "ww.h"
1814649Sedward #include "tt.h"
1913983Sedward 
2014756Sedward #define frameok(w, r, c) (w1 = wwindex[wwsmap[r][c]], \
2117406Sedward 	w1->ww_fmap || w1->ww_order > (w)->ww_order)
2214756Sedward 
2314415Sedward wwframe(w, wframe)
2414591Sedward register struct ww *w;
2514591Sedward struct ww *wframe;
2613983Sedward {
2714591Sedward 	register r, c;
2814591Sedward 	char a1, a2, a3;
2914591Sedward 	char b1, b2, b3;
3014591Sedward 	register char *smap;
3114591Sedward 	register code;
3214756Sedward 	register struct ww *w1;
3313983Sedward 
3414591Sedward 	if (w->ww_w.t > 0) {
3514591Sedward 		r = w->ww_w.t - 1;
3614972Sedward 		c = w->ww_i.l - 1;
3714591Sedward 		smap = &wwsmap[r + 1][c + 1];
3814591Sedward 		a1 = 0;
3914591Sedward 		a2 = 0;
4014591Sedward 		b1 = 0;
4114756Sedward 		b2 = c < 0 || frameok(w, r, c);
4213983Sedward 
4314972Sedward 		for (; c < w->ww_i.r; c++) {
4414829Sedward 			if (c + 1 >= wwncol) {
4514829Sedward 				a3 = 1;
4614829Sedward 				b3 = 1;
4714829Sedward 			} else {
4814829Sedward 				a3 = w->ww_index == *smap++;
4914829Sedward 				b3 = frameok(w, r, c + 1);
5014829Sedward 			}
5114591Sedward 			if (b2) {
5214591Sedward 				code = 0;
5314591Sedward 				if ((a1 || a2) && b1)
5414591Sedward 					code |= WWF_L;
5514591Sedward 				if ((a2 || a3) && b3)
5614591Sedward 					code |= WWF_R;
5714591Sedward 				if (code)
5814772Sedward 					wwframec(wframe, r, c, code|WWF_TOP);
5914591Sedward 			}
6014591Sedward 			a1 = a2;
6114591Sedward 			a2 = a3;
6214591Sedward 			b1 = b2;
6314591Sedward 			b2 = b3;
6414591Sedward 		}
6514591Sedward 		if ((a1 || a2) && b1 && b2)
6614772Sedward 			wwframec(wframe, r, c, WWF_L|WWF_TOP);
6713983Sedward 	}
6813983Sedward 
6914591Sedward 	if (w->ww_w.b < wwnrow) {
7014591Sedward 		r = w->ww_w.b;
7114972Sedward 		c = w->ww_i.l - 1;
7214591Sedward 		smap = &wwsmap[r - 1][c + 1];
7314591Sedward 		a1 = 0;
7414591Sedward 		a2 = 0;
7514591Sedward 		b1 = 0;
7614756Sedward 		b2 = c < 0 || frameok(w, r, c);
7713983Sedward 
7814972Sedward 		for (; c < w->ww_i.r; c++) {
7914829Sedward 			if (c + 1 >= wwncol) {
8014829Sedward 				a3 = 1;
8114829Sedward 				b3 = 1;
8214829Sedward 			} else {
8314829Sedward 				a3 = w->ww_index == *smap++;
8414829Sedward 				b3 = frameok(w, r, c + 1);
8514829Sedward 			}
8614591Sedward 			if (b2) {
8714591Sedward 				code = 0;
8814591Sedward 				if ((a1 || a2) && b1)
8914591Sedward 					code |= WWF_L;
9014591Sedward 				if ((a2 || a3) && b3)
9114591Sedward 					code |= WWF_R;
9214591Sedward 				if (code)
9314772Sedward 					wwframec(wframe, r, c, code);
9414591Sedward 			}
9514591Sedward 			a1 = a2;
9614591Sedward 			a2 = a3;
9714591Sedward 			b1 = b2;
9814591Sedward 			b2 = b3;
9914591Sedward 		}
10014591Sedward 		if ((a1 || a2) && b1 && b2)
10114772Sedward 			wwframec(wframe, r, c, WWF_L);
10213983Sedward 	}
10313983Sedward 
10414591Sedward 	if (w->ww_w.l > 0) {
10514972Sedward 		r = w->ww_i.t - 1;
10614591Sedward 		c = w->ww_w.l - 1;
10714591Sedward 		a1 = 0;
10814591Sedward 		a2 = 0;
10914591Sedward 		b1 = 0;
11014756Sedward 		b2 = r < 0 || frameok(w, r, c);
11114591Sedward 
11214972Sedward 		for (; r < w->ww_i.b; r++) {
11314829Sedward 			if (r + 1 >= wwnrow) {
11414829Sedward 				a3 = 1;
11514829Sedward 				b3 = 1;
11614829Sedward 			} else {
11714829Sedward 				a3 = w->ww_index == wwsmap[r + 1][c + 1];
11814829Sedward 				b3 = frameok(w, r + 1, c);
11914829Sedward 			}
12014591Sedward 			if (b2) {
12114591Sedward 				code = 0;
12214591Sedward 				if ((a1 || a2) && b1)
12314591Sedward 					code |= WWF_U;
12414591Sedward 				if ((a2 || a3) && b3)
12514591Sedward 					code |= WWF_D;
12614591Sedward 				if (code)
12714772Sedward 					wwframec(wframe, r, c, code);
12814591Sedward 			}
12914591Sedward 			a1 = a2;
13014591Sedward 			a2 = a3;
13114591Sedward 			b1 = b2;
13214591Sedward 			b2 = b3;
13314591Sedward 		}
13414591Sedward 		if ((a1 || a2) && b1 && b2)
13514772Sedward 			wwframec(wframe, r, c, WWF_U);
13613983Sedward 	}
13713983Sedward 
13814591Sedward 	if (w->ww_w.r < wwncol) {
13914972Sedward 		r = w->ww_i.t - 1;
14014591Sedward 		c = w->ww_w.r;
14114591Sedward 		a1 = 0;
14214591Sedward 		a2 = 0;
14314591Sedward 		b1 = 0;
14414756Sedward 		b2 = r < 0 || frameok(w, r, c);
14514415Sedward 
14614972Sedward 		for (; r < w->ww_i.b; r++) {
14714829Sedward 			if (r + 1 >= wwnrow) {
14814829Sedward 				a3 = 1;
14914829Sedward 				b3 = 1;
15014829Sedward 			} else {
15114829Sedward 				a3 = w->ww_index == wwsmap[r + 1][c - 1];
15214829Sedward 				b3 = frameok(w, r + 1, c);
15314829Sedward 			}
15414591Sedward 			if (b2) {
15514591Sedward 				code = 0;
15614591Sedward 				if ((a1 || a2) && b1)
15714591Sedward 					code |= WWF_U;
15814591Sedward 				if ((a2 || a3) && b3)
15914591Sedward 					code |= WWF_D;
16014591Sedward 				if (code)
16114772Sedward 					wwframec(wframe, r, c, code);
16214591Sedward 			}
16314591Sedward 			a1 = a2;
16414591Sedward 			a2 = a3;
16514591Sedward 			b1 = b2;
16614591Sedward 			b2 = b3;
16714591Sedward 		}
16814591Sedward 		if ((a1 || a2) && b1 && b2)
16914772Sedward 			wwframec(wframe, r, c, WWF_U);
17014415Sedward 	}
17113983Sedward }
17213983Sedward 
17314987Sedward wwframec(f, r, c, code)
17414415Sedward register struct ww *f;
17514987Sedward register r, c;
17614756Sedward char code;
17713983Sedward {
17814756Sedward 	char oldcode;
17915587Sedward 	register char *smap;
18013983Sedward 
18114987Sedward 	if (r < f->ww_i.t || r >= f->ww_i.b || c < f->ww_i.l || c >= f->ww_i.r)
18214415Sedward 		return;
18315587Sedward 
18415587Sedward 	smap = &wwsmap[r][c];
18515587Sedward 
18614591Sedward 	{
18714591Sedward 		register struct ww *w;
18814756Sedward 
18915587Sedward 		w = wwindex[*smap];
19014591Sedward 		if (w->ww_order > f->ww_order) {
19115587Sedward 			if (w != &wwnobody && w->ww_win[r][c] == 0)
19215587Sedward 				w->ww_nvis[r]--;
19315587Sedward 			*smap = f->ww_index;
19414415Sedward 		}
19513983Sedward 	}
19614772Sedward 
19714772Sedward 	if (f->ww_fmap != 0) {
19814591Sedward 		register char *fmap;
19914756Sedward 
20014772Sedward 		fmap = &f->ww_fmap[r][c];
20114756Sedward 		oldcode = *fmap;
20214591Sedward 		*fmap |= code;
20314591Sedward 		if (code & WWF_TOP)
20414591Sedward 			*fmap &= ~WWF_LABEL;
20514756Sedward 		code = *fmap;
20614756Sedward 	} else
20714756Sedward 		oldcode = 0;
20814756Sedward 	{
20914987Sedward 		register char *win = &f->ww_win[r][c];
21014756Sedward 
21115587Sedward 		if (*win == WWM_GLS && *smap == f->ww_index)
21214987Sedward 			f->ww_nvis[r]++;
21314987Sedward 		*win &= ~WWM_GLS;
21414987Sedward 	}
21514987Sedward 	if (oldcode != code && (code & WWF_LABEL) == 0) {
21614987Sedward 		register short frame;
21714756Sedward 
21815733Sedward 		frame = tt.tt_frame[code & WWF_MASK];
21914987Sedward 		f->ww_buf[r][c].c_w = frame;
22014987Sedward 		if (wwsmap[r][c] == f->ww_index) {
22115654Sedward 			wwtouched[r] |= WWU_TOUCHED;
22214987Sedward 			wwns[r][c].c_w = frame;
22314756Sedward 		}
22414591Sedward 	}
22513983Sedward }
226