Module Name: src
Committed By: macallan
Date: Tue May 28 11:04:04 UTC 2013
Modified Files:
src/sys/dev/wscons: wsdisplay_vcons.c
Log Message:
in vcons_redraw_screen():
- if RI_FULLCLEAR is set and we use it to clear the screen, don't draw any
whitespaces with the default background colour
- draw stretches of whitespaces with the same background colour using erasecols
To generate a diff of this commit:
cvs rdiff -u -r1.27 -r1.28 src/sys/dev/wscons/wsdisplay_vcons.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/wscons/wsdisplay_vcons.c
diff -u src/sys/dev/wscons/wsdisplay_vcons.c:1.27 src/sys/dev/wscons/wsdisplay_vcons.c:1.28
--- src/sys/dev/wscons/wsdisplay_vcons.c:1.27 Wed Jan 4 08:25:03 2012
+++ src/sys/dev/wscons/wsdisplay_vcons.c Tue May 28 11:04:04 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: wsdisplay_vcons.c,v 1.27 2012/01/04 08:25:03 macallan Exp $ */
+/* $NetBSD: wsdisplay_vcons.c,v 1.28 2013/05/28 11:04:04 macallan Exp $ */
/*-
* Copyright (c) 2005, 2006 Michael Lorenz
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: wsdisplay_vcons.c,v 1.27 2012/01/04 08:25:03 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: wsdisplay_vcons.c,v 1.28 2013/05/28 11:04:04 macallan Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -402,12 +402,14 @@ vcons_do_switch(void *arg)
void
vcons_redraw_screen(struct vcons_screen *scr)
{
- uint32_t *charptr = scr->scr_chars;
- long *attrptr = scr->scr_attrs;
+ uint32_t *charptr = scr->scr_chars, c;
+ long *attrptr = scr->scr_attrs, a, last_a = 0, mask, cmp, acmp;
struct rasops_info *ri = &scr->scr_ri;
struct vcons_data *vd = scr->scr_vd;
- int i, j, offset, boffset = 0;
+ int i, j, offset, boffset = 0, start = -1;
+ mask = 0x00ff00ff; /* background and flags */
+ cmp = -1; /* never match anything */
vcons_lock(scr);
if (SCREEN_IS_VISIBLE(scr) && SCREEN_CAN_DRAW(scr)) {
@@ -418,6 +420,7 @@ vcons_redraw_screen(struct vcons_screen
if (ri->ri_flg & RI_FULLCLEAR) {
vd->eraserows(ri, 0, ri->ri_rows,
scr->scr_defattr);
+ cmp = scr->scr_defattr & mask;
}
/* redraw the screen */
@@ -427,6 +430,7 @@ vcons_redraw_screen(struct vcons_screen
offset = 0;
#endif
for (i = 0; i < ri->ri_rows; i++) {
+ start = -1;
for (j = 0; j < ri->ri_cols; j++) {
/*
* no need to use the wrapper function - we
@@ -434,8 +438,46 @@ vcons_redraw_screen(struct vcons_screen
* and we already made sure the screen we're
* working on is visible
*/
- vd->putchar(ri, i, j,
- charptr[offset], attrptr[offset]);
+ c = charptr[offset];
+ a = attrptr[offset];
+ acmp = a & mask;
+ if (c == ' ') {
+ /*
+ * if we already erased the background
+ * and this blank uses the same colour
+ * and flags we don't need to do
+ * anything here
+ */
+ if (acmp == cmp)
+ goto next;
+ /*
+ * see if we can optimize things a
+ * little bit by drawing stretches of
+ * blanks using erasecols
+ */
+
+ if (start == -1) {
+ start = j;
+ last_a = acmp;
+ } else if (acmp != last_a) {
+ /*
+ * different attr, need to
+ * flush
+ */
+ vd->erasecols(ri, i, start,
+ j - start, last_a);
+ start = -1;
+ }
+ } else {
+ if (start != -1) {
+ vd->erasecols(ri, i, start,
+ j - start, last_a);
+ start = -1;
+ }
+
+ vd->putchar(ri, i, j, c, a);
+ }
+next:
#ifdef VCONS_DRAW_INTR
vd->chars[boffset] = charptr[offset];
vd->attrs[boffset] = attrptr[offset];
@@ -443,6 +485,10 @@ vcons_redraw_screen(struct vcons_screen
offset++;
boffset++;
}
+ /* end of the line - draw all defered blanks, if any */
+ if (start != -1) {
+ vd->erasecols(ri, i, start, j - start, last_a);
+ }
}
ri->ri_flg &= ~RI_CURSOR;
scr->scr_vd->cursor(ri, 1, ri->ri_crow, ri->ri_ccol);