118735Sedward /*
2*62479Sbostic * Copyright (c) 1983, 1993
3*62479Sbostic * The Regents of the University of California. All rights reserved.
433514Sbostic *
542954Sbostic * This code is derived from software contributed to Berkeley by
642954Sbostic * Edward Wang at The University of California, Berkeley.
742954Sbostic *
842835Sbostic * %sccs.include.redist.c%
918735Sedward */
1018735Sedward
1133514Sbostic #ifndef lint
12*62479Sbostic static char sccsid[] = "@(#)wwframe.c 8.1 (Berkeley) 06/06/93";
1333514Sbostic #endif /* not lint */
1433514Sbostic
1513983Sedward #include "ww.h"
1614649Sedward #include "tt.h"
1713983Sedward
1814756Sedward #define frameok(w, r, c) (w1 = wwindex[wwsmap[r][c]], \
1917406Sedward w1->ww_fmap || w1->ww_order > (w)->ww_order)
2014756Sedward
wwframe(w,wframe)2114415Sedward wwframe(w, wframe)
2214591Sedward register struct ww *w;
2314591Sedward struct ww *wframe;
2413983Sedward {
2514591Sedward register r, c;
2614591Sedward char a1, a2, a3;
2714591Sedward char b1, b2, b3;
2814591Sedward register char *smap;
2914591Sedward register code;
3014756Sedward register struct ww *w1;
3113983Sedward
3214591Sedward if (w->ww_w.t > 0) {
3314591Sedward r = w->ww_w.t - 1;
3414972Sedward c = w->ww_i.l - 1;
3514591Sedward smap = &wwsmap[r + 1][c + 1];
3614591Sedward a1 = 0;
3714591Sedward a2 = 0;
3814591Sedward b1 = 0;
3914756Sedward b2 = c < 0 || frameok(w, r, c);
4013983Sedward
4114972Sedward for (; c < w->ww_i.r; c++) {
4214829Sedward if (c + 1 >= wwncol) {
4314829Sedward a3 = 1;
4414829Sedward b3 = 1;
4514829Sedward } else {
4614829Sedward a3 = w->ww_index == *smap++;
4714829Sedward b3 = frameok(w, r, c + 1);
4814829Sedward }
4914591Sedward if (b2) {
5014591Sedward code = 0;
5114591Sedward if ((a1 || a2) && b1)
5214591Sedward code |= WWF_L;
5314591Sedward if ((a2 || a3) && b3)
5414591Sedward code |= WWF_R;
5514591Sedward if (code)
5614772Sedward wwframec(wframe, r, c, code|WWF_TOP);
5714591Sedward }
5814591Sedward a1 = a2;
5914591Sedward a2 = a3;
6014591Sedward b1 = b2;
6114591Sedward b2 = b3;
6214591Sedward }
6314591Sedward if ((a1 || a2) && b1 && b2)
6414772Sedward wwframec(wframe, r, c, WWF_L|WWF_TOP);
6513983Sedward }
6613983Sedward
6714591Sedward if (w->ww_w.b < wwnrow) {
6814591Sedward r = w->ww_w.b;
6914972Sedward c = w->ww_i.l - 1;
7014591Sedward smap = &wwsmap[r - 1][c + 1];
7114591Sedward a1 = 0;
7214591Sedward a2 = 0;
7314591Sedward b1 = 0;
7414756Sedward b2 = c < 0 || frameok(w, r, c);
7513983Sedward
7614972Sedward for (; c < w->ww_i.r; c++) {
7714829Sedward if (c + 1 >= wwncol) {
7814829Sedward a3 = 1;
7914829Sedward b3 = 1;
8014829Sedward } else {
8114829Sedward a3 = w->ww_index == *smap++;
8214829Sedward b3 = frameok(w, r, c + 1);
8314829Sedward }
8414591Sedward if (b2) {
8514591Sedward code = 0;
8614591Sedward if ((a1 || a2) && b1)
8714591Sedward code |= WWF_L;
8814591Sedward if ((a2 || a3) && b3)
8914591Sedward code |= WWF_R;
9014591Sedward if (code)
9114772Sedward wwframec(wframe, r, c, code);
9214591Sedward }
9314591Sedward a1 = a2;
9414591Sedward a2 = a3;
9514591Sedward b1 = b2;
9614591Sedward b2 = b3;
9714591Sedward }
9814591Sedward if ((a1 || a2) && b1 && b2)
9914772Sedward wwframec(wframe, r, c, WWF_L);
10013983Sedward }
10113983Sedward
10214591Sedward if (w->ww_w.l > 0) {
10314972Sedward r = w->ww_i.t - 1;
10414591Sedward c = w->ww_w.l - 1;
10514591Sedward a1 = 0;
10614591Sedward a2 = 0;
10714591Sedward b1 = 0;
10814756Sedward b2 = r < 0 || frameok(w, r, c);
10914591Sedward
11014972Sedward for (; r < w->ww_i.b; r++) {
11114829Sedward if (r + 1 >= wwnrow) {
11214829Sedward a3 = 1;
11314829Sedward b3 = 1;
11414829Sedward } else {
11514829Sedward a3 = w->ww_index == wwsmap[r + 1][c + 1];
11614829Sedward b3 = frameok(w, r + 1, c);
11714829Sedward }
11814591Sedward if (b2) {
11914591Sedward code = 0;
12014591Sedward if ((a1 || a2) && b1)
12114591Sedward code |= WWF_U;
12214591Sedward if ((a2 || a3) && b3)
12314591Sedward code |= WWF_D;
12414591Sedward if (code)
12514772Sedward wwframec(wframe, r, c, code);
12614591Sedward }
12714591Sedward a1 = a2;
12814591Sedward a2 = a3;
12914591Sedward b1 = b2;
13014591Sedward b2 = b3;
13114591Sedward }
13214591Sedward if ((a1 || a2) && b1 && b2)
13314772Sedward wwframec(wframe, r, c, WWF_U);
13413983Sedward }
13513983Sedward
13614591Sedward if (w->ww_w.r < wwncol) {
13714972Sedward r = w->ww_i.t - 1;
13814591Sedward c = w->ww_w.r;
13914591Sedward a1 = 0;
14014591Sedward a2 = 0;
14114591Sedward b1 = 0;
14214756Sedward b2 = r < 0 || frameok(w, r, c);
14314415Sedward
14414972Sedward for (; r < w->ww_i.b; r++) {
14514829Sedward if (r + 1 >= wwnrow) {
14614829Sedward a3 = 1;
14714829Sedward b3 = 1;
14814829Sedward } else {
14914829Sedward a3 = w->ww_index == wwsmap[r + 1][c - 1];
15014829Sedward b3 = frameok(w, r + 1, c);
15114829Sedward }
15214591Sedward if (b2) {
15314591Sedward code = 0;
15414591Sedward if ((a1 || a2) && b1)
15514591Sedward code |= WWF_U;
15614591Sedward if ((a2 || a3) && b3)
15714591Sedward code |= WWF_D;
15814591Sedward if (code)
15914772Sedward wwframec(wframe, r, c, code);
16014591Sedward }
16114591Sedward a1 = a2;
16214591Sedward a2 = a3;
16314591Sedward b1 = b2;
16414591Sedward b2 = b3;
16514591Sedward }
16614591Sedward if ((a1 || a2) && b1 && b2)
16714772Sedward wwframec(wframe, r, c, WWF_U);
16814415Sedward }
16913983Sedward }
17013983Sedward
wwframec(f,r,c,code)17114987Sedward wwframec(f, r, c, code)
17214415Sedward register struct ww *f;
17314987Sedward register r, c;
17414756Sedward char code;
17513983Sedward {
17614756Sedward char oldcode;
17715587Sedward register char *smap;
17813983Sedward
17914987Sedward if (r < f->ww_i.t || r >= f->ww_i.b || c < f->ww_i.l || c >= f->ww_i.r)
18014415Sedward return;
18115587Sedward
18215587Sedward smap = &wwsmap[r][c];
18315587Sedward
18414591Sedward {
18514591Sedward register struct ww *w;
18614756Sedward
18715587Sedward w = wwindex[*smap];
18814591Sedward if (w->ww_order > f->ww_order) {
18915587Sedward if (w != &wwnobody && w->ww_win[r][c] == 0)
19015587Sedward w->ww_nvis[r]--;
19115587Sedward *smap = f->ww_index;
19214415Sedward }
19313983Sedward }
19414772Sedward
19514772Sedward if (f->ww_fmap != 0) {
19614591Sedward register char *fmap;
19714756Sedward
19814772Sedward fmap = &f->ww_fmap[r][c];
19914756Sedward oldcode = *fmap;
20014591Sedward *fmap |= code;
20114591Sedward if (code & WWF_TOP)
20214591Sedward *fmap &= ~WWF_LABEL;
20314756Sedward code = *fmap;
20414756Sedward } else
20514756Sedward oldcode = 0;
20614756Sedward {
20714987Sedward register char *win = &f->ww_win[r][c];
20814756Sedward
20915587Sedward if (*win == WWM_GLS && *smap == f->ww_index)
21014987Sedward f->ww_nvis[r]++;
21114987Sedward *win &= ~WWM_GLS;
21214987Sedward }
21314987Sedward if (oldcode != code && (code & WWF_LABEL) == 0) {
21414987Sedward register short frame;
21514756Sedward
21615733Sedward frame = tt.tt_frame[code & WWF_MASK];
21714987Sedward f->ww_buf[r][c].c_w = frame;
21814987Sedward if (wwsmap[r][c] == f->ww_index) {
21915654Sedward wwtouched[r] |= WWU_TOUCHED;
22014987Sedward wwns[r][c].c_w = frame;
22114756Sedward }
22214591Sedward }
22313983Sedward }
224