svn commit: r270720 - in head/sys/dev: fb vt/hw/fb vt/hw/ofwfb
Jean-Sebastien Pedron
dumbbell at FreeBSD.org
Wed Aug 27 15:10:29 UTC 2014
Author: dumbbell
Date: Wed Aug 27 15:10:28 2014
New Revision: 270720
URL: http://svnweb.freebsd.org/changeset/base/270720
Log:
vt(4): Fix mouse cursor handling in vt_fb/creator_vt/ofwfb
There were two issues:
1. The area given to vt_is_cursor_in_area() was adding the drawable
area offset, something already handled by this function.
2. The cursor was shifted on the screen by the offset of this area
and thus was misplaced or not erased. Furthermore, when reaching
the bottom or right borders, the cursor was either totally
removed or not erased correctly.
MFC after: 1 week
Modified:
head/sys/dev/fb/creator_vt.c
head/sys/dev/vt/hw/fb/vt_fb.c
head/sys/dev/vt/hw/ofwfb/ofwfb.c
Modified: head/sys/dev/fb/creator_vt.c
==============================================================================
--- head/sys/dev/fb/creator_vt.c Wed Aug 27 14:25:18 2014 (r270719)
+++ head/sys/dev/fb/creator_vt.c Wed Aug 27 15:10:28 2014 (r270720)
@@ -186,21 +186,20 @@ creatorfb_bitblt_bitmap(struct vt_device
struct creatorfb_softc *sc = vd->vd_softc;
u_long line;
uint32_t fgc, bgc;
- int c;
+ int c, l;
uint8_t b, m;
fgc = sc->fb.fb_cmap[fg];
bgc = sc->fb.fb_cmap[bg];
b = m = 0;
- /* Don't try to put off screen pixels */
- if (((x + width) > vd->vd_width) || ((y + height) >
- vd->vd_height))
- return;
-
line = (sc->fb.fb_stride * y) + 4*x;
- for (; height > 0; height--) {
- for (c = 0; c < width; c++) {
+ for (l = 0;
+ l < height && y + l < vw->vw_draw_area.tr_end.tp_row;
+ l++) {
+ for (c = 0;
+ c < width && x + c < vw->vw_draw_area.tr_end.tp_col;
+ c++) {
if (c % 8 == 0)
b = *pattern++;
else
@@ -258,20 +257,17 @@ creatorfb_bitblt_text(struct vt_device *
term_rect_t drawn_area;
- drawn_area.tr_begin.tp_col = area->tr_begin.tp_col * vf->vf_width +
- vw->vw_draw_area.tr_begin.tp_col;
- drawn_area.tr_begin.tp_row = area->tr_begin.tp_row * vf->vf_height +
- vw->vw_draw_area.tr_begin.tp_row;
- drawn_area.tr_end.tp_col = area->tr_end.tp_col * vf->vf_width +
- vw->vw_draw_area.tr_begin.tp_col;
- drawn_area.tr_end.tp_row = area->tr_end.tp_row * vf->vf_height +
- vw->vw_draw_area.tr_begin.tp_row;
+ drawn_area.tr_begin.tp_col = area->tr_begin.tp_col * vf->vf_width;
+ drawn_area.tr_begin.tp_row = area->tr_begin.tp_row * vf->vf_height;
+ drawn_area.tr_end.tp_col = area->tr_end.tp_col * vf->vf_width;
+ drawn_area.tr_end.tp_row = area->tr_end.tp_row * vf->vf_height;
if (vt_is_cursor_in_area(vd, &drawn_area)) {
creatorfb_bitblt_bitmap(vd, vw,
vd->vd_mcursor->map, vd->vd_mcursor->mask,
vd->vd_mcursor->width, vd->vd_mcursor->height,
- vd->vd_mx_drawn, vd->vd_my_drawn,
+ vd->vd_mx_drawn + vw->vw_draw_area.tr_begin.tp_col,
+ vd->vd_my_drawn + vw->vw_draw_area.tr_begin.tp_row,
vd->vd_mcursor_fg, vd->vd_mcursor_bg);
}
#endif
Modified: head/sys/dev/vt/hw/fb/vt_fb.c
==============================================================================
--- head/sys/dev/vt/hw/fb/vt_fb.c Wed Aug 27 14:25:18 2014 (r270719)
+++ head/sys/dev/vt/hw/fb/vt_fb.c Wed Aug 27 15:10:28 2014 (r270720)
@@ -263,17 +263,16 @@ vt_fb_bitblt_bitmap(struct vt_device *vd
b = m = 0;
bpl = (width + 7) >> 3; /* Bytes per source line. */
- /* Don't try to put off screen pixels */
- if (((x + width) > info->fb_width) || ((y + height) >
- info->fb_height))
- return;
-
KASSERT((info->fb_vbase != 0), ("Unmapped framebuffer"));
line = (info->fb_stride * y) + (x * bpp);
- for (l = 0; l < height; l++) {
+ for (l = 0;
+ l < height && y + l < vw->vw_draw_area.tr_end.tp_row;
+ l++) {
ch = pattern;
- for (c = 0; c < width; c++) {
+ for (c = 0;
+ c < width && x + c < vw->vw_draw_area.tr_end.tp_col;
+ c++) {
if (c % 8 == 0)
b = *ch++;
else
@@ -353,20 +352,17 @@ vt_fb_bitblt_text(struct vt_device *vd,
term_rect_t drawn_area;
- drawn_area.tr_begin.tp_col = area->tr_begin.tp_col * vf->vf_width +
- vw->vw_draw_area.tr_begin.tp_col;
- drawn_area.tr_begin.tp_row = area->tr_begin.tp_row * vf->vf_height +
- vw->vw_draw_area.tr_begin.tp_row;
- drawn_area.tr_end.tp_col = area->tr_end.tp_col * vf->vf_width +
- vw->vw_draw_area.tr_begin.tp_col;
- drawn_area.tr_end.tp_row = area->tr_end.tp_row * vf->vf_height +
- vw->vw_draw_area.tr_begin.tp_row;
+ drawn_area.tr_begin.tp_col = area->tr_begin.tp_col * vf->vf_width;
+ drawn_area.tr_begin.tp_row = area->tr_begin.tp_row * vf->vf_height;
+ drawn_area.tr_end.tp_col = area->tr_end.tp_col * vf->vf_width;
+ drawn_area.tr_end.tp_row = area->tr_end.tp_row * vf->vf_height;
if (vt_is_cursor_in_area(vd, &drawn_area)) {
vt_fb_bitblt_bitmap(vd, vw,
vd->vd_mcursor->map, vd->vd_mcursor->mask,
vd->vd_mcursor->width, vd->vd_mcursor->height,
- vd->vd_mx_drawn, vd->vd_my_drawn,
+ vd->vd_mx_drawn + vw->vw_draw_area.tr_begin.tp_col,
+ vd->vd_my_drawn + vw->vw_draw_area.tr_begin.tp_row,
vd->vd_mcursor_fg, vd->vd_mcursor_bg);
}
#endif
Modified: head/sys/dev/vt/hw/ofwfb/ofwfb.c
==============================================================================
--- head/sys/dev/vt/hw/ofwfb/ofwfb.c Wed Aug 27 14:25:18 2014 (r270719)
+++ head/sys/dev/vt/hw/ofwfb/ofwfb.c Wed Aug 27 15:10:28 2014 (r270720)
@@ -110,7 +110,7 @@ ofwfb_bitblt_bitmap(struct vt_device *vd
struct fb_info *sc = vd->vd_softc;
u_long line;
uint32_t fgc, bgc;
- int c;
+ int c, l;
uint8_t b, m;
union {
uint32_t l;
@@ -121,13 +121,13 @@ ofwfb_bitblt_bitmap(struct vt_device *vd
bgc = sc->fb_cmap[bg];
b = m = 0;
- /* Don't try to put off screen pixels */
- if (((x + width) > vd->vd_width) || ((y + height) >
- vd->vd_height))
- return;
-
line = (sc->fb_stride * y) + x * sc->fb_bpp/8;
if (mask == NULL && sc->fb_bpp == 8 && (width % 8 == 0)) {
+ /* Don't try to put off screen pixels */
+ if (((x + width) > vd->vd_width) || ((y + height) >
+ vd->vd_height))
+ return;
+
for (; height > 0; height--) {
for (c = 0; c < width; c += 8) {
b = *pattern++;
@@ -160,8 +160,12 @@ ofwfb_bitblt_bitmap(struct vt_device *vd
line += sc->fb_stride;
}
} else {
- for (; height > 0; height--) {
- for (c = 0; c < width; c++) {
+ for (l = 0;
+ l < height && y + l < vw->vw_draw_area.tr_end.tp_row;
+ l++) {
+ for (c = 0;
+ c < width && x + c < vw->vw_draw_area.tr_end.tp_col;
+ c++) {
if (c % 8 == 0)
b = *pattern++;
else
@@ -231,20 +235,17 @@ ofwfb_bitblt_text(struct vt_device *vd,
term_rect_t drawn_area;
- drawn_area.tr_begin.tp_col = area->tr_begin.tp_col * vf->vf_width +
- vw->vw_draw_area.tr_begin.tp_col;
- drawn_area.tr_begin.tp_row = area->tr_begin.tp_row * vf->vf_height +
- vw->vw_draw_area.tr_begin.tp_row;
- drawn_area.tr_end.tp_col = area->tr_end.tp_col * vf->vf_width +
- vw->vw_draw_area.tr_begin.tp_col;
- drawn_area.tr_end.tp_row = area->tr_end.tp_row * vf->vf_height +
- vw->vw_draw_area.tr_begin.tp_row;
+ drawn_area.tr_begin.tp_col = area->tr_begin.tp_col * vf->vf_width;
+ drawn_area.tr_begin.tp_row = area->tr_begin.tp_row * vf->vf_height;
+ drawn_area.tr_end.tp_col = area->tr_end.tp_col * vf->vf_width;
+ drawn_area.tr_end.tp_row = area->tr_end.tp_row * vf->vf_height;
if (vt_is_cursor_in_area(vd, &drawn_area)) {
ofwfb_bitblt_bitmap(vd, vw,
vd->vd_mcursor->map, vd->vd_mcursor->mask,
vd->vd_mcursor->width, vd->vd_mcursor->height,
- vd->vd_mx_drawn, vd->vd_my_drawn,
+ vd->vd_mx_drawn + vw->vw_draw_area.tr_begin.tp_col,
+ vd->vd_my_drawn + vw->vw_draw_area.tr_begin.tp_row,
vd->vd_mcursor_fg, vd->vd_mcursor_bg);
}
#endif
More information about the svn-src-all
mailing list