diff options
| author | Bruce Evans <bde@FreeBSD.org> | 2017-04-15 19:27:39 +0000 |
|---|---|---|
| committer | Bruce Evans <bde@FreeBSD.org> | 2017-04-15 19:27:39 +0000 |
| commit | e560b71d3bad0faa587906b0df584bbd4b5944d5 (patch) | |
| tree | b61df70ae598367589b017630a5fec07c93147b7 /sys | |
| parent | 023653459a4a36a26d7b7de3de8ea30c031d2eb3 (diff) | |
Notes
Diffstat (limited to 'sys')
| -rw-r--r-- | sys/dev/syscons/scvgarndr.c | 63 |
1 files changed, 39 insertions, 24 deletions
diff --git a/sys/dev/syscons/scvgarndr.c b/sys/dev/syscons/scvgarndr.c index dac642c60ec04..535fb110283fc 100644 --- a/sys/dev/syscons/scvgarndr.c +++ b/sys/dev/syscons/scvgarndr.c @@ -159,15 +159,19 @@ RENDERER_MODULE(vga, vga_set); #ifndef SC_NO_CUTPASTE #if !defined(SC_ALT_MOUSE_IMAGE) || defined(SC_PIXEL_MODE) -#define MOUSE_IMAGE_HEIGHT 13 -#define MOUSE_IMAGE_WIDTH 9 -static u_short mouse_and_mask[16] = { - 0xc000, 0xe000, 0xf000, 0xf800, 0xfc00, 0xfe00, 0xff00, 0xff80, - 0xfe00, 0x1e00, 0x1f00, 0x0f00, 0x0f00, 0x0000, 0x0000, 0x0000 +struct mousedata { + u_short md_border[16]; + u_short md_interior[16]; + u_short md_width; + u_short md_height; }; -static u_short mouse_or_mask[16] = { + +static const struct mousedata mouse9x13 = { { + 0xc000, 0xa000, 0x9000, 0x8800, 0x8400, 0x8200, 0x8100, 0x9780, + 0xf200, 0x1200, 0x1900, 0x0900, 0x0f00, 0x0000, 0x0000, 0x0000, }, { 0x0000, 0x4000, 0x6000, 0x7000, 0x7800, 0x7c00, 0x7e00, 0x6800, - 0x0c00, 0x0c00, 0x0600, 0x0600, 0x0000, 0x0000, 0x0000, 0x0000 + 0x0c00, 0x0c00, 0x0600, 0x0600, 0x0000, 0x0000, 0x0000, 0x0000, }, + 9, 13, }; #endif #endif @@ -404,6 +408,7 @@ draw_txtmouse(scr_stat *scp, int x, int y) { #ifndef SC_ALT_MOUSE_IMAGE if (ISMOUSEAVAIL(scp->sc->adp->va_flags)) { + const struct mousedata *mdp; u_char font_buf[128]; u_short cursor[32]; u_char c; @@ -412,6 +417,8 @@ draw_txtmouse(scr_stat *scp, int x, int y) int crtc_addr; int i; + mdp = &mouse9x13; + /* prepare mousepointer char's bitmaps */ pos = (y/scp->font_size - scp->yoff)*scp->xsize + x/8 - scp->xoff; bcopy(scp->font + sc_vtb_getc(&scp->scr, pos)*scp->font_size, @@ -434,8 +441,8 @@ draw_txtmouse(scr_stat *scp, int x, int y) yoffset = y%scp->font_size; for (i = 0; i < 16; ++i) { cursor[i + yoffset] = - (cursor[i + yoffset] & ~(mouse_and_mask[i] >> xoffset)) - | (mouse_or_mask[i] >> xoffset); + (cursor[i + yoffset] & ~(mdp->md_border[i] >> xoffset)) + | (mdp->md_interior[i] >> xoffset); } for (i = 0; i < scp->font_size; ++i) { font_buf[i] = (cursor[i] & 0xff00) >> 8; @@ -1026,6 +1033,7 @@ vga_pxlblink_planar(scr_stat *scp, int at, int flip) static void draw_pxlmouse_planar(scr_stat *scp, int x, int y) { + const struct mousedata *mdp; vm_offset_t p; int line_width; int xoff, yoff; @@ -1034,10 +1042,11 @@ draw_pxlmouse_planar(scr_stat *scp, int x, int y) int i, j, k; uint8_t m1; + mdp = &mouse9x13; line_width = scp->sc->adp->va_line_width; xoff = (x - scp->xoff*8)%8; yoff = y - rounddown(y, line_width); - ymax = imin(y + 16, scp->ypixel); + ymax = imin(y + mdp->md_height, scp->ypixel); outw(GDCIDX, 0x0005); /* read mode 0, write mode 0 */ outw(GDCIDX, 0x0001); /* set/reset enable */ @@ -1045,7 +1054,7 @@ draw_pxlmouse_planar(scr_stat *scp, int x, int y) outw(GDCIDX, 0x0803); /* data rotate/function select (and) */ p = scp->sc->adp->va_window + line_width*y + x/8; for (i = y, j = 0; i < ymax; ++i, ++j) { - m = ~((mouse_and_mask[j] & ~mouse_or_mask[j]) << 8 >> xoff); + m = ~(mdp->md_border[j] << 8 >> xoff); for (k = 0; k < 3; ++k) { m1 = m >> (8 * (2 - k)); if (m1 != 0xff && x + 8 * k < scp->xpixel) { @@ -1058,7 +1067,7 @@ draw_pxlmouse_planar(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; for (i = y, j = 0; i < ymax; ++i, ++j) { - m = mouse_or_mask[j] << 8 >> xoff; + m = mdp->md_interior[j] << 8 >> xoff; for (k = 0; k < 3; ++k) { m1 = m >> (8 * (2 - k)); if (m1 != 0 && x + 8 * k < scp->xpixel) { @@ -1074,17 +1083,20 @@ draw_pxlmouse_planar(scr_stat *scp, int x, int y) static void remove_pxlmouse_planar(scr_stat *scp, int x, int y) { + const struct mousedata *mdp; vm_offset_t p; int bx, by, i, line_width, xend, xoff, yend, yoff; + mdp = &mouse9x13; + /* * It is only necessary to remove the mouse image where it overlaps * the border. Determine the overlap, and do nothing if it is empty. */ bx = (scp->xoff + scp->xsize) * 8; by = (scp->yoff + scp->ysize) * scp->font_size; - xend = imin(x + MOUSE_IMAGE_WIDTH, scp->xpixel); - yend = imin(y + MOUSE_IMAGE_HEIGHT, scp->ypixel); + xend = imin(x + mdp->md_width, scp->xpixel); + yend = imin(y + mdp->md_height, scp->ypixel); if (xend <= bx && yend <= by) return; @@ -1108,6 +1120,7 @@ remove_pxlmouse_planar(scr_stat *scp, int x, int y) static void vga_pxlmouse_direct(scr_stat *scp, int x, int y, int on) { + const struct mousedata *mdp; vm_offset_t p; int line_width, pixel_size; int xend, yend; @@ -1119,12 +1132,14 @@ vga_pxlmouse_direct(scr_stat *scp, int x, int y, int on) uint8_t *u8; int bpp; + mdp = &mouse9x13; + /* * Determine overlap with the border and then if removing, do nothing * if the overlap is empty. */ - xend = imin(x + 16, scp->xpixel); - yend = imin(y + 16, scp->ypixel); + xend = imin(x + mdp->md_width, scp->xpixel); + yend = imin(y + mdp->md_height, scp->ypixel); if (!on && xend <= (scp->xoff + scp->xsize) * 8 && yend <= (scp->yoff + scp->ysize) * scp->font_size) return; @@ -1184,33 +1199,33 @@ do_on: case 32: u32 = (uint32_t*)(p + j * pixel_size); mouse_buf32[i * 16 + j] = *u32; - if (mouse_or_mask[i] & (1 << (15 - j))) + if (mdp->md_interior[i] & (1 << (15 - j))) writel(u32, vga_palette32[15]); - else if (mouse_and_mask[i] & (1 << (15 - j))) + else if (mdp->md_border[i] & (1 << (15 - j))) writel(u32, 0); break; case 16: u16 = (uint16_t*)(p + j * pixel_size); mouse_buf16[i * 16 + j] = *u16; - if (mouse_or_mask[i] & (1 << (15 - j))) + if (mdp->md_interior[i] & (1 << (15 - j))) writew(u16, vga_palette16[15]); - else if (mouse_and_mask[i] & (1 << (15 - j))) + else if (mdp->md_border[i] & (1 << (15 - j))) writew(u16, 0); break; case 15: u16 = (uint16_t*)(p + j * pixel_size); mouse_buf16[i * 16 + j] = *u16; - if (mouse_or_mask[i] & (1 << (15 - j))) + if (mdp->md_interior[i] & (1 << (15 - j))) writew(u16, vga_palette15[15]); - else if (mouse_and_mask[i] & (1 << (15 - j))) + else if (mdp->md_border[i] & (1 << (15 - j))) writew(u16, 0); break; case 8: u8 = (uint8_t*)(p + j * pixel_size); mouse_buf8[i * 16 + j] = *u8; - if (mouse_or_mask[i] & (1 << (15 - j))) + if (mdp->md_interior[i] & (1 << (15 - j))) writeb(u8, 15); - else if (mouse_and_mask[i] & (1 << (15 - j))) + else if (mdp->md_border[i] & (1 << (15 - j))) writeb(u8, 0); break; } |
