1 /* @(#)wwframe.c 8.1 (Berkeley) 6/6/93 */ 2 /* $NetBSD: wwframe.c,v 1.7 2003/08/07 11:17:39 agc Exp $ */ 3 4 /* 5 * Copyright (c) 1983, 1993 6 * The Regents of the University of California. All rights reserved. 7 * 8 * This code is derived from software contributed to Berkeley by 9 * Edward Wang at The University of California, Berkeley. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 3. Neither the name of the University nor the names of its contributors 20 * may be used to endorse or promote products derived from this software 21 * without specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 */ 35 36 #include "ww.h" 37 #include "tt.h" 38 39 #define frameok(w, r, c) (w1 = wwindex[wwsmap[r][c]], \ 40 w1->ww_fmap || w1->ww_order > (w)->ww_order) 41 42 void 43 wwframe(struct ww *w, struct ww *wframe) 44 { 45 int r, c; 46 char a1, a2, a3; 47 char b1, b2, b3; 48 int code; 49 struct ww *w1; 50 51 if (w->ww_w.t > 0) { 52 r = w->ww_w.t - 1; 53 c = w->ww_i.l - 1; 54 a1 = 0; 55 a2 = 0; 56 b1 = 0; 57 b2 = c < 0 || frameok(w, r, c); 58 59 for (; c < w->ww_i.r; c++) { 60 if (c + 1 >= wwncol) { 61 a3 = 1; 62 b3 = 1; 63 } else { 64 a3 = w->ww_index == wwsmap[r + 1][c + 1]; 65 b3 = frameok(w, r, c + 1); 66 } 67 if (b2) { 68 code = 0; 69 if ((a1 || a2) && b1) 70 code |= WWF_L; 71 if ((a2 || a3) && b3) 72 code |= WWF_R; 73 if (code) 74 wwframec(wframe, r, c, code|WWF_TOP); 75 } 76 a1 = a2; 77 a2 = a3; 78 b1 = b2; 79 b2 = b3; 80 } 81 if ((a1 || a2) && b1 && b2) 82 wwframec(wframe, r, c, WWF_L|WWF_TOP); 83 } 84 85 if (w->ww_w.b < wwnrow) { 86 r = w->ww_w.b; 87 c = w->ww_i.l - 1; 88 a1 = 0; 89 a2 = 0; 90 b1 = 0; 91 b2 = c < 0 || frameok(w, r, c); 92 93 for (; c < w->ww_i.r; c++) { 94 if (c + 1 >= wwncol) { 95 a3 = 1; 96 b3 = 1; 97 } else { 98 a3 = w->ww_index == wwsmap[r - 1][c + 1]; 99 b3 = frameok(w, r, c + 1); 100 } 101 if (b2) { 102 code = 0; 103 if ((a1 || a2) && b1) 104 code |= WWF_L; 105 if ((a2 || a3) && b3) 106 code |= WWF_R; 107 if (code) 108 wwframec(wframe, r, c, code); 109 } 110 a1 = a2; 111 a2 = a3; 112 b1 = b2; 113 b2 = b3; 114 } 115 if ((a1 || a2) && b1 && b2) 116 wwframec(wframe, r, c, WWF_L); 117 } 118 119 if (w->ww_w.l > 0) { 120 r = w->ww_i.t - 1; 121 c = w->ww_w.l - 1; 122 a1 = 0; 123 a2 = 0; 124 b1 = 0; 125 b2 = r < 0 || frameok(w, r, c); 126 127 for (; r < w->ww_i.b; r++) { 128 if (r + 1 >= wwnrow) { 129 a3 = 1; 130 b3 = 1; 131 } else { 132 a3 = w->ww_index == wwsmap[r + 1][c + 1]; 133 b3 = frameok(w, r + 1, c); 134 } 135 if (b2) { 136 code = 0; 137 if ((a1 || a2) && b1) 138 code |= WWF_U; 139 if ((a2 || a3) && b3) 140 code |= WWF_D; 141 if (code) 142 wwframec(wframe, r, c, code); 143 } 144 a1 = a2; 145 a2 = a3; 146 b1 = b2; 147 b2 = b3; 148 } 149 if ((a1 || a2) && b1 && b2) 150 wwframec(wframe, r, c, WWF_U); 151 } 152 153 if (w->ww_w.r < wwncol) { 154 r = w->ww_i.t - 1; 155 c = w->ww_w.r; 156 a1 = 0; 157 a2 = 0; 158 b1 = 0; 159 b2 = r < 0 || frameok(w, r, c); 160 161 for (; r < w->ww_i.b; r++) { 162 if (r + 1 >= wwnrow) { 163 a3 = 1; 164 b3 = 1; 165 } else { 166 a3 = w->ww_index == wwsmap[r + 1][c - 1]; 167 b3 = frameok(w, r + 1, c); 168 } 169 if (b2) { 170 code = 0; 171 if ((a1 || a2) && b1) 172 code |= WWF_U; 173 if ((a2 || a3) && b3) 174 code |= WWF_D; 175 if (code) 176 wwframec(wframe, r, c, code); 177 } 178 a1 = a2; 179 a2 = a3; 180 b1 = b2; 181 b2 = b3; 182 } 183 if ((a1 || a2) && b1 && b2) 184 wwframec(wframe, r, c, WWF_U); 185 } 186 } 187 188 void 189 wwframec(struct ww *f, int r, int c, char code) 190 { 191 char oldcode; 192 unsigned char *smap; 193 194 if (r < f->ww_i.t || r >= f->ww_i.b || c < f->ww_i.l || c >= f->ww_i.r) 195 return; 196 197 smap = &wwsmap[r][c]; 198 199 { 200 struct ww *w; 201 202 w = wwindex[*smap]; 203 if (w->ww_order > f->ww_order) { 204 if (w != &wwnobody && w->ww_win[r][c] == 0) 205 w->ww_nvis[r]--; 206 *smap = f->ww_index; 207 } 208 } 209 210 if (f->ww_fmap != 0) { 211 char *fmap; 212 213 fmap = &f->ww_fmap[r][c]; 214 oldcode = *fmap; 215 *fmap |= code; 216 if (code & WWF_TOP) 217 *fmap &= ~WWF_LABEL; 218 code = *fmap; 219 } else 220 oldcode = 0; 221 { 222 char *win = &f->ww_win[r][c]; 223 224 if (*win == WWM_GLS && *smap == f->ww_index) 225 f->ww_nvis[r]++; 226 *win &= ~WWM_GLS; 227 } 228 if (oldcode != code && (code & WWF_LABEL) == 0) { 229 short frame; 230 231 frame = tt.tt_frame[code & WWF_MASK]; 232 f->ww_buf[r][c].c_w = frame; 233 if (wwsmap[r][c] == f->ww_index) { 234 wwtouched[r] |= WWU_TOUCHED; 235 wwns[r][c].c_w = frame; 236 } 237 } 238 } 239