diff options
author | ache <ache@FreeBSD.org> | 1994-10-07 08:58:58 +0000 |
---|---|---|
committer | ache <ache@FreeBSD.org> | 1994-10-07 08:58:58 +0000 |
commit | a80c0624fbd8bd1c784b0b5b7a0fd20b09d317b9 (patch) | |
tree | 4a94ca97fb2fc2fdc1fcdd522a66e39c6e763138 /lib/libncurses/lib_box.c | |
download | FreeBSD-src-a80c0624fbd8bd1c784b0b5b7a0fd20b09d317b9.zip FreeBSD-src-a80c0624fbd8bd1c784b0b5b7a0fd20b09d317b9.tar.gz |
Moved from ports with several enhancements
Diffstat (limited to 'lib/libncurses/lib_box.c')
-rw-r--r-- | lib/libncurses/lib_box.c | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/lib/libncurses/lib_box.c b/lib/libncurses/lib_box.c new file mode 100644 index 0000000..ca4e032 --- /dev/null +++ b/lib/libncurses/lib_box.c @@ -0,0 +1,131 @@ + +/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for * +* details. If they are missing then this copy is in violation of * +* the copyright conditions. */ + +/* +** lib_box.c +** +** line drawing routines: +** wborder() +** whline() +** wvline() +** +*/ + +#include "curses.priv.h" + +int wborder(WINDOW *win, chtype ls, chtype rs, chtype ts, + chtype bs, chtype tl, chtype tr, chtype bl, chtype br) +{ +int i; +int endx, endy; + + T(("wborder() called")); + + if (ls == 0) ls = ACS_VLINE; + if (rs == 0) rs = ACS_VLINE; + if (ts == 0) ts = ACS_HLINE; + if (bs == 0) bs = ACS_HLINE; + if (tl == 0) tl = ACS_ULCORNER; + if (tr == 0) tr = ACS_URCORNER; + if (bl == 0) bl = ACS_LLCORNER; + if (br == 0) br = ACS_LRCORNER; + + ls |= win->_attrs; + rs |= win->_attrs; + ts |= win->_attrs; + bs |= win->_attrs; + tl |= win->_attrs; + tr |= win->_attrs; + bl |= win->_attrs; + br |= win->_attrs; + + T(("using %x, %x, %x, %x, %x, %x, %x, %x", ls, rs, ts, bs, tl, tr, bl, br)); + + endx = win->_maxx; + endy = win->_maxy; + + for (i = 0; i <= endx; i++) { + win->_line[0][i] = ts; + win->_line[endy][i] = bs; + } + win->_firstchar[endy] = win->_firstchar[0] = 0; + win->_lastchar[endy] = win->_lastchar[0] = endx; + + for (i = 0; i <= endy; i++) { + win->_line[i][0] = ls; + win->_line[i][endx] = rs; + win->_firstchar[i] = 0; + win->_lastchar[i] = endx; + } + win->_line[0][0] = tl; + win->_line[0][endx] = tr; + win->_line[endy][0] = bl; + win->_line[endy][endx] = br; + +#if 0 + if (! win->_scroll && (win->_flags & _SCROLLWIN)) + fp[0] = fp[endx] = lp[0] = lp[endx] = ' '; +#endif + + return OK; +} + +int whline(WINDOW *win, chtype ch, int n) +{ +int line; +int start; +int end; + + T(("whline(%x,%x,%d) called", win, ch, n)); + + line = win->_cury; + start = win->_curx; + end = start + n - 1; + if (end > win->_maxx) + end = win->_maxx; + + if (win->_firstchar[line] == _NOCHANGE || win->_firstchar[line] > start) + win->_firstchar[line] = start; + if (win->_lastchar[line] == _NOCHANGE || win->_lastchar[line] < start) + win->_lastchar[line] = end; + + if (ch == 0) + ch = ACS_HLINE; + while ( end >= start) { + win->_line[line][end] = ch | win->_attrs; + end--; + } + + return OK; +} + +int wvline(WINDOW *win, chtype ch, int n) +{ +int row, col; +int end; + + T(("wvline(%x,%x,%d) called", win, ch, n)); + + row = win->_cury; + col = win->_curx; + end = row + n - 1; + if (end > win->_maxy) + end = win->_maxy; + + if (ch == 0) + ch = ACS_VLINE; + + while(end >= row) { + win->_line[end][col] = ch | win->_attrs; + if (win->_firstchar[end] == _NOCHANGE || win->_firstchar[end] > col) + win->_firstchar[end] = col; + if (win->_lastchar[end] == _NOCHANGE || win->_lastchar[end] < col) + win->_lastchar[end] = col; + end--; + } + + return OK; +} + |