diff options
Diffstat (limited to 'lib/libcurses/lib_box.c')
-rw-r--r-- | lib/libcurses/lib_box.c | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/lib/libcurses/lib_box.c b/lib/libcurses/lib_box.c new file mode 100644 index 00000000000..bf45be33336 --- /dev/null +++ b/lib/libcurses/lib_box.c @@ -0,0 +1,146 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + + +/* +** 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) +{ +short i; +short 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 ? win->_attrs : (win->_bkgd & A_ATTRIBUTES)); + rs |= (win->_attrs ? win->_attrs : (win->_bkgd & A_ATTRIBUTES)); + ts |= (win->_attrs ? win->_attrs : (win->_bkgd & A_ATTRIBUTES)); + bs |= (win->_attrs ? win->_attrs : (win->_bkgd & A_ATTRIBUTES)); + tl |= (win->_attrs ? win->_attrs : (win->_bkgd & A_ATTRIBUTES)); + tr |= (win->_attrs ? win->_attrs : (win->_bkgd & A_ATTRIBUTES)); + bl |= (win->_attrs ? win->_attrs : (win->_bkgd & A_ATTRIBUTES)); + br |= (win->_attrs ? win->_attrs : (win->_bkgd & A_ATTRIBUTES)); + + T(("using %lx, %lx, %lx, %lx, %lx, %lx, %lx, %lx", ls, rs, ts, bs, tl, tr, bl, br)); + + endx = win->_maxx; + endy = win->_maxy; + + for (i = 0; i <= endx; i++) { + win->_line[0].text[i] = ts; + win->_line[endy].text[i] = bs; + } + win->_line[endy].firstchar = win->_line[0].firstchar = 0; + win->_line[endy].lastchar = win->_line[0].lastchar = endx; + + for (i = 0; i <= endy; i++) { + win->_line[i].text[0] = ls; + win->_line[i].text[endx] = rs; + win->_line[i].firstchar = 0; + win->_line[i].lastchar = endx; + } + win->_line[0].text[0] = tl; + win->_line[0].text[endx] = tr; + win->_line[endy].text[0] = bl; + win->_line[endy].text[endx] = br; + + _nc_synchook(win); + return OK; +} + +int whline(WINDOW *win, chtype ch, int n) +{ +short line; +short start; +short end; + + T(("whline(%p,%lx,%d) called", win, ch, n)); + + line = win->_cury; + start = win->_curx; + end = start + n - 1; + if (end > win->_maxx) + end = win->_maxx; + + if (win->_line[line].firstchar == _NOCHANGE || win->_line[line].firstchar > start) + win->_line[line].firstchar = start; + if (win->_line[line].lastchar == _NOCHANGE || win->_line[line].lastchar < start) + win->_line[line].lastchar = end; + + if (ch == 0) + ch = ACS_HLINE; + while ( end >= start) { + win->_line[line].text[end] = ch | win->_attrs; + end--; + } + + return OK; +} + +int wvline(WINDOW *win, chtype ch, int n) +{ +short row, col; +short end; + + T(("wvline(%p,%lx,%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].text[col] = ch | win->_attrs; + if (win->_line[end].firstchar == _NOCHANGE || win->_line[end].firstchar > col) + win->_line[end].firstchar = col; + if (win->_line[end].lastchar == _NOCHANGE || win->_line[end].lastchar < col) + win->_line[end].lastchar = col; + end--; + } + + _nc_synchook(win); + return OK; +} + |