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