summaryrefslogtreecommitdiffstats
path: root/sys/dev/syscons/scgfbrndr.c
diff options
context:
space:
mode:
authoryokota <yokota@FreeBSD.org>2000-03-18 15:28:48 +0000
committeryokota <yokota@FreeBSD.org>2000-03-18 15:28:48 +0000
commitdfc1e106ba97f3ead25c84754c6dd64493f519ef (patch)
treed7ce096debe9b2f742ea6ff4c3b607ed7fd65a86 /sys/dev/syscons/scgfbrndr.c
parent7a3e2aba1eedfcea6a8cd9d62fe3388f13f8e357 (diff)
downloadFreeBSD-src-dfc1e106ba97f3ead25c84754c6dd64493f519ef.zip
FreeBSD-src-dfc1e106ba97f3ead25c84754c6dd64493f519ef.tar.gz
- Fix bugs when painting border and the mouse cursor in the raster
text mode.
Diffstat (limited to 'sys/dev/syscons/scgfbrndr.c')
-rw-r--r--sys/dev/syscons/scgfbrndr.c54
1 files changed, 30 insertions, 24 deletions
diff --git a/sys/dev/syscons/scgfbrndr.c b/sys/dev/syscons/scgfbrndr.c
index 402a094..f18ae09 100644
--- a/sys/dev/syscons/scgfbrndr.c
+++ b/sys/dev/syscons/scgfbrndr.c
@@ -409,6 +409,8 @@ vga_pxlborder(scr_stat *scp, int color)
{
vm_offset_t p;
int line_width;
+ int x;
+ int y;
int i;
(*vidsw[scp->sc->adapter]->set_border)(scp->sc->adp, color);
@@ -420,23 +422,19 @@ vga_pxlborder(scr_stat *scp, int color)
outw(GDCIDX, (color << 8) | 0x00); /* set/reset */
line_width = scp->sc->adp->va_line_width;
p = scp->sc->adp->va_window;
- if (scp->yoff > 0) {
+ if (scp->yoff > 0)
bzero_io((void *)p, line_width*scp->yoff*scp->font_size);
- bzero_io((void *)(p + line_width*(scp->yoff + scp->ysize)
- *scp->font_size),
- line_width*(scp->ypixel
- - (scp->yoff + scp->ysize)*scp->font_size));
- }
- if (scp->xoff > 0) {
- for (i = 0; i < scp->ysize*scp->font_size; ++i) {
- bzero_io((void *)(p + line_width
- *(scp->yoff*scp->font_size + i)),
- scp->xoff);
- bzero_io((void *)(p + line_width
- *(scp->yoff*scp->font_size + i)
- + scp->xoff + scp->xsize),
- scp->xpixel/8 - scp->xoff - scp->xsize);
- }
+ y = (scp->yoff + scp->ysize)*scp->font_size;
+ if (scp->ypixel > y)
+ bzero_io((void *)(p + line_width*y), line_width*(scp->ypixel - y));
+ y = scp->yoff*scp->font_size;
+ x = scp->xpixel/8 - scp->xoff - scp->xsize;
+ for (i = 0; i < scp->ysize*scp->font_size; ++i) {
+ if (scp->xoff > 0)
+ bzero_io((void *)(p + line_width*(y + i)), scp->xoff);
+ if (x > 0)
+ bzero_io((void *)(p + line_width*(y + i)
+ + scp->xoff + scp->xsize), x);
}
outw(GDCIDX, 0x0000); /* set/reset */
outw(GDCIDX, 0x0001); /* set/reset enable */
@@ -631,6 +629,8 @@ draw_pxlcursor(scr_stat *scp, int at, int on, int flip)
outw(GDCIDX, 0xff08); /* bit mask */
}
+static int pxlblinkrate = 0;
+
static void
vga_pxlcursor(scr_stat *scp, int at, int blink, int on, int flip)
{
@@ -638,8 +638,16 @@ vga_pxlcursor(scr_stat *scp, int at, int blink, int on, int flip)
return;
if (on) {
- scp->status |= VR_CURSOR_ON;
- draw_pxlcursor(scp, at, on, flip);
+ if (!blink) {
+ scp->status |= VR_CURSOR_ON;
+ draw_pxlcursor(scp, at, on, flip);
+ } else if (++pxlblinkrate & 4) {
+ pxlblinkrate = 0;
+ scp->status ^= VR_CURSOR_ON;
+ draw_pxlcursor(scp, at,
+ scp->status & VR_CURSOR_ON,
+ flip);
+ }
} else {
if (scp->status & VR_CURSOR_ON)
draw_pxlcursor(scp, at, on, flip);
@@ -654,13 +662,11 @@ vga_pxlcursor(scr_stat *scp, int at, int blink, int on, int flip)
static void
vga_pxlblink(scr_stat *scp, int at, int flip)
{
- static int blinkrate = 0;
-
if (!(scp->status & VR_CURSOR_BLINK))
return;
- if (!(++blinkrate & 4))
+ if (!(++pxlblinkrate & 4))
return;
- blinkrate = 0;
+ pxlblinkrate = 0;
scp->status ^= VR_CURSOR_ON;
draw_pxlcursor(scp, at, scp->status & VR_CURSOR_ON, flip);
}
@@ -689,7 +695,7 @@ draw_pxlmouse(scr_stat *scp, int x, int y)
outw(GDCIDX, 0xff08); /* bit mask */
outw(GDCIDX, 0x0803); /* data rotate/function select (and) */
p = scp->sc->adp->va_window + line_width*y + x/8;
- if (x < scp->xpixel - 16) {
+ if (x < scp->xpixel - 8) {
for (i = y, j = 0; i < ymax; ++i, ++j) {
m = ~(mouse_and_mask[j] >> xoff);
#ifdef __i386__
@@ -715,7 +721,7 @@ draw_pxlmouse(scr_stat *scp, int x, int y)
}
outw(GDCIDX, 0x1003); /* data rotate/function select (or) */
p = scp->sc->adp->va_window + line_width*y + x/8;
- if (x < scp->xpixel - 16) {
+ if (x < scp->xpixel - 8) {
for (i = y, j = 0; i < ymax; ++i, ++j) {
m = mouse_or_mask[j] >> xoff;
#ifdef __i386__
OpenPOWER on IntegriCloud