Author: dumbbell
Date: Mon Aug 25 19:06:31 2014
New Revision: 270613
URL: http://svnweb.freebsd.org/changeset/base/270613

Log:
  vt(4): Store a rectangle for the drawable area, not just the top-left corner
  
  This allows backends to verify they do not draw outside of this area.
  This fixes a bug in vt_vga where the text was happily drawn over the
  right and bottom margins, when using the Gallant font.
  
  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
  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/fb/creator_vt.c
==============================================================================
--- head/sys/dev/fb/creator_vt.c        Mon Aug 25 18:52:51 2014        
(r270612)
+++ head/sys/dev/fb/creator_vt.c        Mon Aug 25 19:06:31 2014        
(r270613)
@@ -236,8 +236,10 @@ creatorfb_bitblt_text(struct vt_device *
        for (row = area->tr_begin.tp_row; row < area->tr_end.tp_row; ++row) {
                for (col = area->tr_begin.tp_col; col < area->tr_end.tp_col;
                    ++col) {
-                       x = col * vf->vf_width + vw->vw_offset.tp_col;
-                       y = row * vf->vf_height + vw->vw_offset.tp_row;
+                       x = col * vf->vf_width +
+                           vw->vw_draw_area.tr_begin.tp_col;
+                       y = row * vf->vf_height +
+                           vw->vw_draw_area.tr_begin.tp_row;
 
                        c = VTBUF_GET_FIELD(&vw->vw_buf, row, col);
                        pattern = vtfont_lookup(vf, c);
@@ -257,13 +259,13 @@ 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_offset.tp_col;
+           vw->vw_draw_area.tr_begin.tp_col;
        drawn_area.tr_begin.tp_row = area->tr_begin.tp_row * vf->vf_height +
-           vw->vw_offset.tp_row;
+           vw->vw_draw_area.tr_begin.tp_row;
        drawn_area.tr_end.tp_col = area->tr_end.tp_col * vf->vf_width +
-           vw->vw_offset.tp_col;
+           vw->vw_draw_area.tr_begin.tp_col;
        drawn_area.tr_end.tp_row = area->tr_end.tp_row * vf->vf_height +
-           vw->vw_offset.tp_row;
+           vw->vw_draw_area.tr_begin.tp_row;
 
        if (vt_is_cursor_in_area(vd, &drawn_area)) {
                creatorfb_bitblt_bitmap(vd, vw,

Modified: head/sys/dev/vt/hw/fb/vt_fb.c
==============================================================================
--- head/sys/dev/vt/hw/fb/vt_fb.c       Mon Aug 25 18:52:51 2014        
(r270612)
+++ head/sys/dev/vt/hw/fb/vt_fb.c       Mon Aug 25 19:06:31 2014        
(r270613)
@@ -331,8 +331,10 @@ vt_fb_bitblt_text(struct vt_device *vd, 
        for (row = area->tr_begin.tp_row; row < area->tr_end.tp_row; ++row) {
                for (col = area->tr_begin.tp_col; col < area->tr_end.tp_col;
                    ++col) {
-                       x = col * vf->vf_width + vw->vw_offset.tp_col;
-                       y = row * vf->vf_height + vw->vw_offset.tp_row;
+                       x = col * vf->vf_width +
+                           vw->vw_draw_area.tr_begin.tp_col;
+                       y = row * vf->vf_height +
+                           vw->vw_draw_area.tr_begin.tp_row;
 
                        c = VTBUF_GET_FIELD(&vw->vw_buf, row, col);
                        pattern = vtfont_lookup(vf, c);
@@ -352,13 +354,13 @@ 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_offset.tp_col;
+           vw->vw_draw_area.tr_begin.tp_col;
        drawn_area.tr_begin.tp_row = area->tr_begin.tp_row * vf->vf_height +
-           vw->vw_offset.tp_row;
+           vw->vw_draw_area.tr_begin.tp_row;
        drawn_area.tr_end.tp_col = area->tr_end.tp_col * vf->vf_width +
-           vw->vw_offset.tp_col;
+           vw->vw_draw_area.tr_begin.tp_col;
        drawn_area.tr_end.tp_row = area->tr_end.tp_row * vf->vf_height +
-           vw->vw_offset.tp_row;
+           vw->vw_draw_area.tr_begin.tp_row;
 
        if (vt_is_cursor_in_area(vd, &drawn_area)) {
                vt_fb_bitblt_bitmap(vd, vw,

Modified: head/sys/dev/vt/hw/ofwfb/ofwfb.c
==============================================================================
--- head/sys/dev/vt/hw/ofwfb/ofwfb.c    Mon Aug 25 18:52:51 2014        
(r270612)
+++ head/sys/dev/vt/hw/ofwfb/ofwfb.c    Mon Aug 25 19:06:31 2014        
(r270613)
@@ -209,8 +209,10 @@ ofwfb_bitblt_text(struct vt_device *vd, 
        for (row = area->tr_begin.tp_row; row < area->tr_end.tp_row; ++row) {
                for (col = area->tr_begin.tp_col; col < area->tr_end.tp_col;
                    ++col) {
-                       x = col * vf->vf_width + vw->vw_offset.tp_col;
-                       y = row * vf->vf_height + vw->vw_offset.tp_row;
+                       x = col * vf->vf_width +
+                           vw->vw_draw_area.tr_begin.tp_col;
+                       y = row * vf->vf_height +
+                           vw->vw_draw_area.tr_begin.tp_row;
 
                        c = VTBUF_GET_FIELD(&vw->vw_buf, row, col);
                        pattern = vtfont_lookup(vf, c);
@@ -230,13 +232,13 @@ 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_offset.tp_col;
+           vw->vw_draw_area.tr_begin.tp_col;
        drawn_area.tr_begin.tp_row = area->tr_begin.tp_row * vf->vf_height +
-           vw->vw_offset.tp_row;
+           vw->vw_draw_area.tr_begin.tp_row;
        drawn_area.tr_end.tp_col = area->tr_end.tp_col * vf->vf_width +
-           vw->vw_offset.tp_col;
+           vw->vw_draw_area.tr_begin.tp_col;
        drawn_area.tr_end.tp_row = area->tr_end.tp_row * vf->vf_height +
-           vw->vw_offset.tp_row;
+           vw->vw_draw_area.tr_begin.tp_row;
 
        if (vt_is_cursor_in_area(vd, &drawn_area)) {
                ofwfb_bitblt_bitmap(vd, vw,

Modified: head/sys/dev/vt/hw/vga/vt_vga.c
==============================================================================
--- head/sys/dev/vt/hw/vga/vt_vga.c     Mon Aug 25 18:52:51 2014        
(r270612)
+++ head/sys/dev/vt/hw/vga/vt_vga.c     Mon Aug 25 19:06:31 2014        
(r270613)
@@ -556,16 +556,17 @@ vga_bitblt_one_text_pixels_block(struct 
        memset(pattern_2colors, 0, sizeof(pattern_2colors));
        memset(pattern_ncolors, 0, sizeof(pattern_ncolors));
 
-       if (i < vw->vw_offset.tp_col) {
+       if (i < vw->vw_draw_area.tr_begin.tp_col) {
                /*
                 * i is in the margin used to center the text area on
                 * the screen.
                 */
 
-               i = vw->vw_offset.tp_col;
+               i = vw->vw_draw_area.tr_begin.tp_col;
        }
 
-       while (i < x + VT_VGA_PIXELS_BLOCK) {
+       while (i < x + VT_VGA_PIXELS_BLOCK &&
+           i < vw->vw_draw_area.tr_end.tp_col) {
                /*
                 * Find which character is drawn on this pixel in the
                 * pixels block.
@@ -573,8 +574,8 @@ vga_bitblt_one_text_pixels_block(struct 
                 * While here, record what colors it uses.
                 */
 
-               col = (i - vw->vw_offset.tp_col) / vf->vf_width;
-               row = (y - vw->vw_offset.tp_row) / vf->vf_height;
+               col = (i - vw->vw_draw_area.tr_begin.tp_col) / vf->vf_width;
+               row = (y - vw->vw_draw_area.tr_begin.tp_row) / vf->vf_height;
 
                c = VTBUF_GET_FIELD(vb, row, col);
                src = vtfont_lookup(vf, c);
@@ -605,11 +606,15 @@ vga_bitblt_one_text_pixels_block(struct 
                 * character.
                 */
 
-               src_x = i - (col * vf->vf_width + vw->vw_offset.tp_col);
-               x_count = min(
-                   (col + 1) * vf->vf_width + vw->vw_offset.tp_col,
-                   x + VT_VGA_PIXELS_BLOCK);
-               x_count -= col * vf->vf_width + vw->vw_offset.tp_col;
+               src_x = i -
+                   (col * vf->vf_width + vw->vw_draw_area.tr_begin.tp_col);
+               x_count = min(min(
+                   (col + 1) * vf->vf_width +
+                   vw->vw_draw_area.tr_begin.tp_col,
+                   x + VT_VGA_PIXELS_BLOCK),
+                   vw->vw_draw_area.tr_end.tp_col);
+               x_count -= col * vf->vf_width +
+                   vw->vw_draw_area.tr_begin.tp_col;
                x_count -= src_x;
 
                /* Copy a portion of the character. */
@@ -643,14 +648,16 @@ vga_bitblt_one_text_pixels_block(struct 
                unsigned int dst_x, src_y, dst_y, y_count;
 
                cursor = vd->vd_mcursor;
-               mx = vd->vd_mx_drawn + vw->vw_offset.tp_col;
-               my = vd->vd_my_drawn + vw->vw_offset.tp_row;
+               mx = vd->vd_mx_drawn + vw->vw_draw_area.tr_begin.tp_col;
+               my = vd->vd_my_drawn + vw->vw_draw_area.tr_begin.tp_row;
 
                /* Compute the portion of the cursor we want to copy. */
                src_x = x > mx ? x - mx : 0;
                dst_x = mx > x ? mx - x : 0;
-               x_count = min(
-                   min(cursor->width - src_x, x + VT_VGA_PIXELS_BLOCK - mx),
+               x_count = min(min(min(
+                   cursor->width - src_x,
+                   x + VT_VGA_PIXELS_BLOCK - mx),
+                   vw->vw_draw_area.tr_end.tp_col - mx),
                    VT_VGA_PIXELS_BLOCK);
 
                /*
@@ -725,10 +732,10 @@ vga_bitblt_text_gfxmode(struct vt_device
 
        col = area->tr_begin.tp_col;
        row = area->tr_begin.tp_row;
-       x1 = (int)((col * vf->vf_width + vw->vw_offset.tp_col)
+       x1 = (int)((col * vf->vf_width + vw->vw_draw_area.tr_begin.tp_col)
             / VT_VGA_PIXELS_BLOCK)
            * VT_VGA_PIXELS_BLOCK;
-       y1 = row * vf->vf_height + vw->vw_offset.tp_row;
+       y1 = row * vf->vf_height + vw->vw_draw_area.tr_begin.tp_row;
 
        /*
         * Compute the bottom right pixel position, again, aligned with
@@ -740,19 +747,15 @@ vga_bitblt_text_gfxmode(struct vt_device
 
        col = area->tr_end.tp_col;
        row = area->tr_end.tp_row;
-       x2 = (int)((col * vf->vf_width + vw->vw_offset.tp_col
+       x2 = (int)((col * vf->vf_width + vw->vw_draw_area.tr_begin.tp_col
              + VT_VGA_PIXELS_BLOCK - 1)
             / VT_VGA_PIXELS_BLOCK)
            * VT_VGA_PIXELS_BLOCK;
-       y2 = row * vf->vf_height + vw->vw_offset.tp_row;
+       y2 = row * vf->vf_height + vw->vw_draw_area.tr_begin.tp_row;
 
-       /*
-        * Clip the area to the screen size.
-        *
-        * FIXME: Take vw_offset into account.
-        */
-       x2 = min(x2, vd->vd_width - 1);
-       y2 = min(y2, vd->vd_height - 1);
+       /* Clip the area to the screen size. */
+       x2 = min(x2, vw->vw_draw_area.tr_end.tp_col);
+       y2 = min(y2, vw->vw_draw_area.tr_end.tp_row);
 
        /*
         * Now, we take care of N pixels line at a time (the first for

Modified: head/sys/dev/vt/vt.h
==============================================================================
--- head/sys/dev/vt/vt.h        Mon Aug 25 18:52:51 2014        (r270612)
+++ head/sys/dev/vt/vt.h        Mon Aug 25 19:06:31 2014        (r270613)
@@ -258,7 +258,7 @@ struct vt_window {
        struct terminal         *vw_terminal;   /* (c) Terminal. */
        struct vt_buf            vw_buf;        /* (u) Screen buffer. */
        struct vt_font          *vw_font;       /* (d) Graphical font. */
-       term_pos_t               vw_offset;     /* (?) Pixel offset. */
+       term_rect_t              vw_draw_area;  /* (?) Drawable area. */
        unsigned int             vw_number;     /* (c) Window number. */
        int                      vw_kbdmode;    /* (?) Keyboard mode. */
        char                    *vw_kbdsq;      /* Escape sequence queue*/

Modified: head/sys/dev/vt/vt_core.c
==============================================================================
--- head/sys/dev/vt/vt_core.c   Mon Aug 25 18:52:51 2014        (r270612)
+++ head/sys/dev/vt/vt_core.c   Mon Aug 25 19:06:31 2014        (r270613)
@@ -828,8 +828,8 @@ vt_is_cursor_in_area(const struct vt_dev
         * We use the cursor position saved during the current refresh,
         * in case the cursor moved since.
         */
-       mx = vd->vd_mx_drawn + vd->vd_curwindow->vw_offset.tp_col;
-       my = vd->vd_my_drawn + vd->vd_curwindow->vw_offset.tp_row;
+       mx = vd->vd_mx_drawn + vd->vd_curwindow->vw_draw_area.tr_begin.tp_col;
+       my = vd->vd_my_drawn + vd->vd_curwindow->vw_draw_area.tr_begin.tp_row;
 
        x1 = area->tr_begin.tp_col;
        y1 = area->tr_begin.tp_row;
@@ -1202,8 +1202,8 @@ vt_set_border(struct vt_window *vw, stru
 
        x = vd->vd_width - 1;
        y = vd->vd_height - 1;
-       off_x = vw->vw_offset.tp_col;
-       off_y = vw->vw_offset.tp_row;
+       off_x = vw->vw_draw_area.tr_begin.tp_col;
+       off_y = vw->vw_draw_area.tr_begin.tp_row;
 
        /* Top bar. */
        if (off_y > 0)
@@ -1257,9 +1257,17 @@ vt_change_font(struct vt_window *vw, str
 
        vt_termsize(vd, vf, &size);
        vt_winsize(vd, vf, &wsz);
-       /* Save offset to font aligned area. */
-       vw->vw_offset.tp_col = (vd->vd_width % vf->vf_width) / 2;
-       vw->vw_offset.tp_row = (vd->vd_height % vf->vf_height) / 2;
+
+       /*
+        * Compute the drawable area, so that the text is centered on
+        * the screen.
+        */
+       vw->vw_draw_area.tr_begin.tp_col = (vd->vd_width % vf->vf_width) / 2;
+       vw->vw_draw_area.tr_begin.tp_row = (vd->vd_height % vf->vf_height) / 2;
+       vw->vw_draw_area.tr_end.tp_col = vw->vw_draw_area.tr_begin.tp_col +
+           vd->vd_width / vf->vf_width * vf->vf_width;
+       vw->vw_draw_area.tr_end.tp_row = vw->vw_draw_area.tr_begin.tp_row +
+           vd->vd_height / vf->vf_height * vf->vf_height;
 
        /* Grow the screen buffer and terminal. */
        terminal_mute(tm, 1);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to