1 /* 2 * Copyright (c) 1983 Regents of the University of California. 3 * 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 3.20 (Berkeley) 06/06/90"; 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 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 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