Special rendering methods for removing mouse cursors cannot be removed
like I hoped, since they are needed for removing parts over the border. Continue fixing bugs in them. In the vga planar mode renderer, remove removal of the part of the image over the text window. This was hard-coded for nearly 8x16 fonts and in practice didn't remove enough for 8x8 fonts. This used the wrong attribute over cutmarked regions. The caller refreshes with the correct attribute later, so the attribute bug only caused flicker. The caller uses the same hard-coding, so the refreshes fix up all the spots with the wrong attribute, but keep missing the missed spots. This still gives trails of bits of cursors for cursor motions in the affected configurations (mainly depth 4 modes with 8x8) fonts. 8x14 fonts barely escape the problem since although the cursor is drawn as 16x16, its active part is only 9x13 and the active part fits in the hard-coded 2x2 character cell window for 8x14 fonts. 8x8 fonts need a 2x3 window. In the fb non-sparc64 renderer, the buggy image removal was buggier and was already avoided by returning before it. Remove it completely and fix nearby style bugs. It was essentially the same as for the vga planar mode renderer (obfuscated by swapping x and y). This was buggier since fb should handle more types of hardware so the hard-coding is wronger. The remaining fb image removal is also buggier. It never supported software cursors drawn into the border, and the hardware cursor is probably broken by other bugs to be fixed soon.
This commit is contained in:
parent
0c076be2c2
commit
f3ac3a6e6f
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=316675
@ -335,28 +335,14 @@ static void
|
||||
gfb_mouse(scr_stat *scp, int x, int y, int on)
|
||||
{
|
||||
#ifdef __sparc64__
|
||||
vidd_putm(scp->sc->adp, x, y, mouse_pointer,
|
||||
on ? 0xffffffff : 0x0, 22, 12);
|
||||
vidd_putm(scp->sc->adp, x, y, mouse_pointer,
|
||||
on ? 0xffffffff : 0x0, 22, 12);
|
||||
#else
|
||||
int i, pos;
|
||||
|
||||
if (on) {
|
||||
|
||||
/* Display the mouse pointer image... */
|
||||
vidd_putm(scp->sc->adp, x, y, mouse_pointer,
|
||||
0xffffffff, 16, 8);
|
||||
} else {
|
||||
|
||||
/*
|
||||
Erase the mouse cursor image by redrawing the text
|
||||
underneath it...
|
||||
*/
|
||||
return;
|
||||
pos = x*scp->xsize + y;
|
||||
i = (y < scp->xsize - 1) ? 2 : 1;
|
||||
(*scp->rndr->draw)(scp, pos, i, FALSE);
|
||||
if (x < scp->ysize - 1)
|
||||
(*scp->rndr->draw)(scp, pos + scp->xsize, i, FALSE);
|
||||
/* XXX: removal is incomplete for h/w cursors and borders. */
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
@ -1101,21 +1101,16 @@ remove_pxlmouse_planar(scr_stat *scp, int x, int y)
|
||||
{
|
||||
vm_offset_t p;
|
||||
int col, row;
|
||||
int pos;
|
||||
int line_width;
|
||||
int ymax;
|
||||
int i;
|
||||
|
||||
/* erase the mouse cursor image */
|
||||
/*
|
||||
* The caller will remove parts of the mouse image over the text
|
||||
* window better than we can do. Remove only parts over the border.
|
||||
*/
|
||||
col = x/8 - scp->xoff;
|
||||
row = y/scp->font_size - scp->yoff;
|
||||
pos = row*scp->xsize + col;
|
||||
i = (col < scp->xsize - 1) ? 2 : 1;
|
||||
(*scp->rndr->draw)(scp, pos, i, FALSE);
|
||||
if (row < scp->ysize - 1)
|
||||
(*scp->rndr->draw)(scp, pos + scp->xsize, i, FALSE);
|
||||
|
||||
/* paint border if necessary */
|
||||
line_width = scp->sc->adp->va_line_width;
|
||||
outw(GDCIDX, 0x0005); /* read mode 0, write mode 0 */
|
||||
outw(GDCIDX, 0x0003); /* data rotate/function select */
|
||||
|
Loading…
Reference in New Issue
Block a user