svn commit: r270331 - in head/sys/dev/vt: . hw/vga

Jean-Sebastien Pedron dumbbell at FreeBSD.org
Fri Aug 22 14:31:54 UTC 2014


Author: dumbbell
Date: Fri Aug 22 14:31:53 2014
New Revision: 270331
URL: http://svnweb.freebsd.org/changeset/base/270331

Log:
  vt(4): Store cursor bitmap & colors in struct vt_device
  
  This removes the need to specify them to each call to vd_bitblt_text_t
  and, therefore, simplifies the API.
  
  MFC after:	1 week

Modified:
  head/sys/dev/vt/hw/vga/vt_vga.c
  head/sys/dev/vt/vt.h
  head/sys/dev/vt/vt_core.c

Modified: head/sys/dev/vt/hw/vga/vt_vga.c
==============================================================================
--- head/sys/dev/vt/hw/vga/vt_vga.c	Fri Aug 22 14:27:41 2014	(r270330)
+++ head/sys/dev/vt/hw/vga/vt_vga.c	Fri Aug 22 14:31:53 2014	(r270331)
@@ -521,12 +521,8 @@ vga_bitblt_pixels_block_ncolors(struct v
 
 static void
 vga_bitblt_one_text_pixels_block(struct vt_device *vd, const struct vt_buf *vb,
-    const struct vt_font *vf, unsigned int x, unsigned int y
-#ifndef SC_NO_CUTPASTE
-    , const struct vt_mouse_cursor *cursor,
-    term_color_t cursor_fg, term_color_t cursor_bg
-#endif
-    )
+    const struct vt_font *vf, unsigned int x, unsigned int y,
+    int cursor_displayed)
 {
 	unsigned int i, col, row, src_x, x_count;
 	unsigned int used_colors_list[16], used_colors;
@@ -536,6 +532,7 @@ vga_bitblt_one_text_pixels_block(struct 
 	term_color_t fg, bg;
 	const uint8_t *src;
 #ifndef SC_NO_CUTPASTE
+	struct vt_mouse_cursor *cursor;
 	unsigned int mx, my;
 #endif
 
@@ -629,9 +626,10 @@ vga_bitblt_one_text_pixels_block(struct 
 	 * the current position could be different than the one used
 	 * to mark the area dirty.
 	 */
+	cursor = vd->vd_mcursor;
 	mx = vd->vd_moldx + vd->vd_offset.tp_col;
 	my = vd->vd_moldy + vd->vd_offset.tp_row;
-	if (cursor != NULL &&
+	if (cursor_displayed &&
 	    ((mx >= x && x + VT_VGA_PIXELS_BLOCK - 1 >= mx) ||
 	     (mx < x && mx + cursor->width >= x)) &&
 	    ((my >= y && y + vf->vf_height - 1 >= my) ||
@@ -660,11 +658,11 @@ vga_bitblt_one_text_pixels_block(struct 
 		vga_copy_bitmap_portion(pattern_2colors, pattern_ncolors,
 		    cursor->map, cursor->mask, cursor->width,
 		    src_x, dst_x, x_count, src_y, dst_y, y_count,
-		    cursor_fg, cursor_bg, 1);
+		    vd->vd_mcursor_fg, vd->vd_mcursor_bg, 1);
 
-		if ((used_colors_list[cursor_fg] & 0x1) != 0x1)
+		if ((used_colors_list[vd->vd_mcursor_fg] & 0x1) != 0x1)
 			used_colors++;
-		if ((used_colors_list[cursor_bg] & 0x2) != 0x2)
+		if ((used_colors_list[vd->vd_mcursor_bg] & 0x2) != 0x2)
 			used_colors++;
 	}
 #endif
@@ -683,12 +681,7 @@ vga_bitblt_one_text_pixels_block(struct 
 
 static void
 vga_bitblt_text_gfxmode(struct vt_device *vd, const struct vt_buf *vb,
-    const struct vt_font *vf, const term_rect_t *area
-#ifndef SC_NO_CUTPASTE
-    , const struct vt_mouse_cursor *cursor,
-    term_color_t cursor_fg, term_color_t cursor_bg
-#endif
-    )
+    const struct vt_font *vf, const term_rect_t *area, int cursor_displayed)
 {
 	unsigned int col, row;
 	unsigned int x1, y1, x2, y2, x, y;
@@ -770,23 +763,15 @@ vga_bitblt_text_gfxmode(struct vt_device
 
 	for (y = y1; y < y2; y += vf->vf_height) {
 		for (x = x1; x < x2; x += VT_VGA_PIXELS_BLOCK) {
-			vga_bitblt_one_text_pixels_block(vd, vb, vf, x, y
-#ifndef SC_NO_CUTPASTE
-			    , cursor, cursor_fg, cursor_bg
-#endif
-			    );
+			vga_bitblt_one_text_pixels_block(vd, vb, vf, x, y,
+			    cursor_displayed);
 		}
 	}
 }
 
 static void
 vga_bitblt_text_txtmode(struct vt_device *vd, const struct vt_buf *vb,
-    const term_rect_t *area
-#ifndef SC_NO_CUTPASTE
-    , const struct vt_mouse_cursor *cursor,
-    term_color_t cursor_fg, term_color_t cursor_bg
-#endif
-    )
+    const term_rect_t *area, int cursor_displayed)
 {
 	struct vga_softc *sc;
 	unsigned int col, row;
@@ -828,26 +813,13 @@ vga_bitblt_text_txtmode(struct vt_device
 
 static void
 vga_bitblt_text(struct vt_device *vd, const struct vt_buf *vb,
-    const struct vt_font *vf, const term_rect_t *area
-#ifndef SC_NO_CUTPASTE
-    , const struct vt_mouse_cursor *cursor,
-    term_color_t cursor_fg, term_color_t cursor_bg
-#endif
-    )
+    const struct vt_font *vf, const term_rect_t *area, int cursor_displayed)
 {
 
 	if (!(vd->vd_flags & VDF_TEXTMODE)) {
-		vga_bitblt_text_gfxmode(vd, vb, vf, area
-#ifndef SC_NO_CUTPASTE
-		    , cursor, cursor_fg, cursor_bg
-#endif
-		    );
+		vga_bitblt_text_gfxmode(vd, vb, vf, area, cursor_displayed);
 	} else {
-		vga_bitblt_text_txtmode(vd, vb, area
-#ifndef SC_NO_CUTPASTE
-		    , cursor, cursor_fg, cursor_bg
-#endif
-		    );
+		vga_bitblt_text_txtmode(vd, vb, area, cursor_displayed);
 	}
 }
 

Modified: head/sys/dev/vt/vt.h
==============================================================================
--- head/sys/dev/vt/vt.h	Fri Aug 22 14:27:41 2014	(r270330)
+++ head/sys/dev/vt/vt.h	Fri Aug 22 14:31:53 2014	(r270331)
@@ -115,6 +115,10 @@ typedef unsigned int 	vt_axis_t;
  * Per-device datastructure.
  */
 
+#ifndef SC_NO_CUTPASTE
+struct vt_mouse_cursor;
+#endif
+
 struct vt_device {
 	struct vt_window	*vd_windows[VT_MAXWINDOWS]; /* (c) Windows. */
 	struct vt_window	*vd_curwindow;	/* (d) Current window. */
@@ -122,6 +126,11 @@ struct vt_device {
 	struct vt_window	*vd_markedwin;	/* (?) Copy/paste buf owner. */
 	const struct vt_driver	*vd_driver;	/* (c) Graphics driver. */
 	void			*vd_softc;	/* (u) Driver data. */
+#ifndef SC_NO_CUTPASTE
+	struct vt_mouse_cursor	*vd_mcursor;	/* (?) Cursor bitmap. */
+	term_color_t		 vd_mcursor_fg;	/* (?) Cursor fg color. */
+	term_color_t		 vd_mcursor_bg;	/* (?) Cursor bg color. */
+#endif
 	uint16_t		 vd_mx;		/* (?) Current mouse X. */
 	uint16_t		 vd_my;		/* (?) current mouse Y. */
 	vt_axis_t		 vd_moldx;	/* (?) Mouse X as of last redraw. */
@@ -280,15 +289,6 @@ struct vt_window {
  * Per-device driver routines.
  */
 
-#ifndef SC_NO_CUTPASTE
-struct vt_mouse_cursor {
-	uint8_t map[64 * 64 / 8];
-	uint8_t mask[64 * 64 / 8];
-	uint8_t width;
-	uint8_t height;
-};
-#endif
-
 typedef int vd_init_t(struct vt_device *vd);
 typedef int vd_probe_t(struct vt_device *vd);
 typedef void vd_postswitch_t(struct vt_device *vd);
@@ -303,12 +303,7 @@ typedef void vd_bitbltchr_t(struct vt_de
 typedef void vd_putchar_t(struct vt_device *vd, term_char_t,
     vt_axis_t top, vt_axis_t left, term_color_t fg, term_color_t bg);
 typedef void vd_bitblt_text_t(struct vt_device *vd, const struct vt_buf *vb,
-    const struct vt_font *vf, const term_rect_t *area
-#ifndef SC_NO_CUTPASTE
-    , const struct vt_mouse_cursor *cursor,
-    term_color_t cursor_fg, term_color_t cursor_bg
-#endif
-    );
+    const struct vt_font *vf, const term_rect_t *area, int cursor_displayed);
 typedef int vd_fb_ioctl_t(struct vt_device *, u_long, caddr_t, struct thread *);
 typedef int vd_fb_mmap_t(struct vt_device *, vm_ooffset_t, vm_paddr_t *, int,
     vm_memattr_t *);
@@ -394,6 +389,15 @@ struct vt_font {
 	unsigned int		 vf_refcount;
 };
 
+#ifndef SC_NO_CUTPASTE
+struct vt_mouse_cursor {
+	uint8_t map[64 * 64 / 8];
+	uint8_t mask[64 * 64 / 8];
+	uint8_t width;
+	uint8_t height;
+};
+#endif
+
 const uint8_t	*vtfont_lookup(const struct vt_font *vf, term_char_t c);
 struct vt_font	*vtfont_ref(struct vt_font *vf);
 void		 vtfont_unref(struct vt_font *vf);

Modified: head/sys/dev/vt/vt_core.c
==============================================================================
--- head/sys/dev/vt/vt_core.c	Fri Aug 22 14:27:41 2014	(r270330)
+++ head/sys/dev/vt/vt_core.c	Fri Aug 22 14:31:53 2014	(r270331)
@@ -162,6 +162,12 @@ static struct vt_device	vt_consdev = {
 	.vd_curwindow = &vt_conswindow,
 	.vd_markedwin = NULL,
 	.vd_kbstate = 0,
+
+#ifndef SC_NO_CUTPASTE
+	.vd_mcursor = &vt_default_mouse_pointer,
+	.vd_mcursor_fg = TC_WHITE,
+	.vd_mcursor_bg = TC_BLACK,
+#endif
 };
 static term_char_t vt_constextbuf[(_VTDEFW) * (VBF_DEFAULT_HISTORY_SIZE)];
 static term_char_t *vt_constextbufrows[VBF_DEFAULT_HISTORY_SIZE];
@@ -852,8 +858,8 @@ vt_flush(struct vt_device *vd)
 	term_rect_t tarea;
 	term_pos_t size;
 	term_char_t *r;
+	int cursor_displayed;
 #ifndef SC_NO_CUTPASTE
-	struct vt_mouse_cursor *cursor;
 	int bpl, h, w;
 #endif
 
@@ -867,8 +873,9 @@ vt_flush(struct vt_device *vd)
 	if (vd->vd_flags & VDF_SPLASH || vw->vw_flags & VWF_BUSY)
 		return;
 
+	cursor_displayed = 0;
+
 #ifndef SC_NO_CUTPASTE
-	cursor = NULL;
 	if ((vd->vd_flags & VDF_MOUSECURSOR) && /* Mouse support enabled. */
 	    !(vw->vw_flags & VWF_MOUSE_HIDE)) { /* Cursor displayed.      */
 		if (vd->vd_moldx != vd->vd_mx ||
@@ -904,7 +911,7 @@ vt_flush(struct vt_device *vd)
 
 		if (!kdb_active && panicstr == NULL) {
 			/* Mouse enabled, and DDB isn't active. */
-			cursor = &vt_default_mouse_pointer;
+			cursor_displayed = 1;
 
 			/* Mark new mouse position as dirty. */
 			vtbuf_mouse_cursor_position(&vw->vw_buf,
@@ -928,11 +935,8 @@ vt_flush(struct vt_device *vd)
 
 	if (vd->vd_driver->vd_bitblt_text != NULL) {
 		if (tarea.tr_begin.tp_col < tarea.tr_end.tp_col) {
-			vd->vd_driver->vd_bitblt_text(vd, &vw->vw_buf, vf, &tarea
-#ifndef SC_NO_CUTPASTE
-			    , cursor, TC_WHITE, TC_BLACK
-#endif
-			    );
+			vd->vd_driver->vd_bitblt_text(vd, &vw->vw_buf, vf,
+			    &tarea, cursor_displayed);
 		}
 	} else {
 		/*
@@ -954,22 +958,24 @@ vt_flush(struct vt_device *vd)
 		}
 
 #ifndef SC_NO_CUTPASTE
-		if (cursor != NULL) {
-			bpl = (cursor->width + 7) >> 3; /* Bytes per source line. */
-			w = cursor->width;
-			h = cursor->height;
+		if (cursor_displayed) {
+			/* Bytes per source line. */
+			bpl = (vd->vd_mcursor->width + 7) >> 3;
+			w = vd->vd_mcursor->width;
+			h = vd->vd_mcursor->height;
 
-			if ((vd->vd_mx + cursor->width) >
+			if ((vd->vd_mx + vd->vd_mcursor->width) >
 			    (size.tp_col * vf->vf_width))
 				w = (size.tp_col * vf->vf_width) - vd->vd_mx - 1;
-			if ((vd->vd_my + cursor->height) >
+			if ((vd->vd_my + vd->vd_mcursor->height) >
 			    (size.tp_row * vf->vf_height))
 				h = (size.tp_row * vf->vf_height) - vd->vd_my - 1;
 
-			vd->vd_driver->vd_bitbltchr(vd, cursor->map, cursor->mask, bpl,
+			vd->vd_driver->vd_bitbltchr(vd,
+			    vd->vd_mcursor->map, vd->vd_mcursor->mask, bpl,
 			    vd->vd_offset.tp_row + vd->vd_my,
 			    vd->vd_offset.tp_col + vd->vd_mx,
-			    w, h, TC_WHITE, TC_BLACK);
+			    w, h, vd->vd_mcursor_fg, vd->vd_mcursor_bg);
 		}
 #endif
 	}


More information about the svn-src-head mailing list