diff options
author | Mark Kettenis <kettenis@cvs.openbsd.org> | 2018-08-25 12:23:46 +0000 |
---|---|---|
committer | Mark Kettenis <kettenis@cvs.openbsd.org> | 2018-08-25 12:23:46 +0000 |
commit | 077c9a5effc8adba4aca3183ce37eeec11a4cb51 (patch) | |
tree | eff778e26f96bc2c3b77253823f68b4ef3ab4b33 /sys | |
parent | cb1a9826d71d9da57c82143861720a7f0f920072 (diff) |
The current rasops cursor implementation simply inverts the appropriate
framebuffer pixels by doing an XOR with an all-ones bit pattern. This
means the code has to read from the framebuffer which can be very slow.
Add an implementation that simply redraws the character covered by the
cursor with the foreground and background color swapped. While this
doesn't necessarily have the same visual result, most people probably
won't notice the difference (let's see). Use this implementation when
the RI_WRONLY or the RI_VCONS flags are set.
ok fcambus@
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/rasops/rasops.c | 61 |
1 files changed, 44 insertions, 17 deletions
diff --git a/sys/dev/rasops/rasops.c b/sys/dev/rasops/rasops.c index 1dc08ad9f2a..e483ff074ad 100644 --- a/sys/dev/rasops/rasops.c +++ b/sys/dev/rasops/rasops.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rasops.c,v 1.54 2018/05/03 10:05:47 jsg Exp $ */ +/* $OpenBSD: rasops.c,v 1.55 2018/08/25 12:23:45 kettenis Exp $ */ /* $NetBSD: rasops.c,v 1.35 2001/02/02 06:01:01 marcus Exp $ */ /*- @@ -130,6 +130,22 @@ const u_char rasops_isgray[16] = { 0, 0, 0, 1 }; +struct rasops_screen { + LIST_ENTRY(rasops_screen) rs_next; + struct rasops_info *rs_ri; + + struct wsdisplay_charcell *rs_bs; + int rs_visible; + int rs_crow; + int rs_ccol; + long rs_defattr; + + int rs_sbscreens; +#define RS_SCROLLBACK_SCREENS 5 + int rs_dispoffset; /* rs_bs index, start of our actual screen */ + int rs_visibleoffset; /* rs_bs index, current scrollback screen */ +}; + /* Generic functions */ int rasops_copycols(void *, int, int, int, int); int rasops_copyrows(void *, int, int, int); @@ -179,6 +195,7 @@ int rasops_wronly_copycols(void *, int, int, int, int); int rasops_wronly_erasecols(void *, int, int, int, long); int rasops_wronly_copyrows(void *, int, int, int); int rasops_wronly_eraserows(void *, int, int, long); +int rasops_wronly_do_cursor(struct rasops_info *); int rasops_add_font(struct rasops_info *, struct wsdisplay_font *); int rasops_use_font(struct rasops_info *, struct wsdisplay_font *); @@ -268,6 +285,8 @@ rasops_init(struct rasops_info *ri, int wantrows, int wantcols) return (-1); ri->ri_active = cookie; + ri->ri_bs = + &ri->ri_active->rs_bs[ri->ri_active->rs_dispoffset]; ri->ri_ops.cursor = rasops_vcons_cursor; ri->ri_ops.mapchar = rasops_vcons_mapchar; @@ -278,6 +297,7 @@ rasops_init(struct rasops_info *ri, int wantrows, int wantcols) ri->ri_ops.eraserows = rasops_vcons_eraserows; ri->ri_ops.alloc_attr = rasops_vcons_alloc_attr; ri->ri_ops.unpack_attr = rasops_vcons_unpack_attr; + ri->ri_do_cursor = rasops_wronly_do_cursor; } else if ((ri->ri_flg & RI_WRONLY) && ri->ri_bs != NULL) { long attr; int i; @@ -287,6 +307,7 @@ rasops_init(struct rasops_info *ri, int wantrows, int wantcols) ri->ri_ops.erasecols = rasops_wronly_erasecols; ri->ri_ops.copyrows = rasops_wronly_copyrows; ri->ri_ops.eraserows = rasops_wronly_eraserows; + ri->ri_do_cursor = rasops_wronly_do_cursor; ri->ri_alloc_attr(ri, 0, 0, 0, &attr); for (i = 0; i < ri->ri_rows * ri->ri_cols; i++) { @@ -1365,22 +1386,6 @@ slow_bcopy(void *s, void *d, size_t len) } #endif /* NRASOPS_BSWAP */ -struct rasops_screen { - LIST_ENTRY(rasops_screen) rs_next; - struct rasops_info *rs_ri; - - struct wsdisplay_charcell *rs_bs; - int rs_visible; - int rs_crow; - int rs_ccol; - long rs_defattr; - - int rs_sbscreens; -#define RS_SCROLLBACK_SCREENS 5 - int rs_dispoffset; /* rs_bs index, start of our actual screen */ - int rs_visibleoffset; /* rs_bs index, current scrollback screen */ -}; - int rasops_alloc_screen(void *v, void **cookiep, int *curxp, int *curyp, long *attrp) @@ -1482,6 +1487,7 @@ rasops_doswitch(void *v) ri->ri_active->rs_visible = 0; ri->ri_eraserows(ri, 0, ri->ri_rows, scr->rs_defattr); ri->ri_active = scr; + ri->ri_bs = &ri->ri_active->rs_bs[ri->ri_active->rs_dispoffset]; ri->ri_active->rs_visible = 1; ri->ri_active->rs_visibleoffset = ri->ri_active->rs_dispoffset; for (row = 0; row < ri->ri_rows; row++) { @@ -1769,6 +1775,27 @@ rasops_wronly_eraserows(void *cookie, int row, int num, long attr) return ri->ri_eraserows(ri, row, num, attr); } +int +rasops_wronly_do_cursor(struct rasops_info *ri) +{ + int off = ri->ri_crow * ri->ri_cols + ri->ri_ccol; + u_int uc; + long attr; + int fg, bg; + + uc = ri->ri_bs[off].uc; + attr = ri->ri_bs[off].attr; + + if ((ri->ri_flg & RI_CURSOR) == 0) { + fg = ((u_int)attr >> 24) & 0xf; + bg = ((u_int)attr >> 16) & 0xf; + attr &= ~0x0ffff0000; + attr |= (fg << 16) | (bg << 24); + } + + return ri->ri_putchar(ri, ri->ri_crow, ri->ri_ccol, uc, attr); +} + /* * Font management. * |