freebsd-skq/lib/libncurses/lib_box.c
Andrey A. Chernov c8a57a4fe5 Fix logical background handling by merging it from ncurses 4.1
No new user-visible functions added
1997-07-30 17:21:39 +00:00

132 lines
2.7 KiB
C

/* 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 = _nc_render(win, ls);
rs = _nc_render(win, rs);
ts = _nc_render(win, ts);
bs = _nc_render(win, bs);
tl = _nc_render(win, tl);
tr = _nc_render(win, tr);
bl = _nc_render(win, bl);
br = _nc_render(win, br);
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;
}