svn commit: r270411 - in head/sys: dev/vt/hw/efifb dev/vt/hw/fb powerpc/ps3
Jean-Sebastien Pedron
dumbbell at FreeBSD.org
Sat Aug 23 15:00:48 UTC 2014
Author: dumbbell
Date: Sat Aug 23 15:00:47 2014
New Revision: 270411
URL: http://svnweb.freebsd.org/changeset/base/270411
Log:
vt_fb: Implement vd_bitblt_text_t for vt_fb and derivatives
MFC after: 1 week
Modified:
head/sys/dev/vt/hw/efifb/efifb.c
head/sys/dev/vt/hw/fb/vt_early_fb.c
head/sys/dev/vt/hw/fb/vt_fb.c
head/sys/dev/vt/hw/fb/vt_fb.h
head/sys/powerpc/ps3/ps3_syscons.c
Modified: head/sys/dev/vt/hw/efifb/efifb.c
==============================================================================
--- head/sys/dev/vt/hw/efifb/efifb.c Sat Aug 23 14:58:31 2014 (r270410)
+++ head/sys/dev/vt/hw/efifb/efifb.c Sat Aug 23 15:00:47 2014 (r270411)
@@ -60,7 +60,7 @@ static struct vt_driver vt_efifb_driver
.vd_probe = vt_efifb_probe,
.vd_init = vt_efifb_init,
.vd_blank = vt_fb_blank,
- .vd_bitbltchr = vt_fb_bitbltchr,
+ .vd_bitblt_text = vt_fb_bitblt_text,
.vd_fb_ioctl = vt_fb_ioctl,
.vd_fb_mmap = vt_fb_mmap,
/* Better than VGA, but still generic driver. */
Modified: head/sys/dev/vt/hw/fb/vt_early_fb.c
==============================================================================
--- head/sys/dev/vt/hw/fb/vt_early_fb.c Sat Aug 23 14:58:31 2014 (r270410)
+++ head/sys/dev/vt/hw/fb/vt_early_fb.c Sat Aug 23 15:00:47 2014 (r270411)
@@ -59,7 +59,7 @@ static struct vt_driver vt_fb_early_driv
.vd_probe = vt_efb_probe,
.vd_init = vt_efb_init,
.vd_blank = vt_fb_blank,
- .vd_bitbltchr = vt_fb_bitbltchr,
+ .vd_bitblt_text = vt_fb_bitblt_text,
.vd_priority = VD_PRIORITY_GENERIC,
};
Modified: head/sys/dev/vt/hw/fb/vt_fb.c
==============================================================================
--- head/sys/dev/vt/hw/fb/vt_fb.c Sat Aug 23 14:58:31 2014 (r270410)
+++ head/sys/dev/vt/hw/fb/vt_fb.c Sat Aug 23 15:00:47 2014 (r270411)
@@ -41,15 +41,14 @@ __FBSDID("$FreeBSD$");
#include <dev/vt/hw/fb/vt_fb.h>
#include <dev/vt/colors/vt_termcolors.h>
-void vt_fb_drawrect(struct vt_device *vd, int x1, int y1, int x2, int y2,
- int fill, term_color_t color);
-void vt_fb_setpixel(struct vt_device *vd, int x, int y, term_color_t color);
+static vd_drawrect_t vt_fb_drawrect;
+static vd_setpixel_t vt_fb_setpixel;
static struct vt_driver vt_fb_driver = {
.vd_name = "fb",
.vd_init = vt_fb_init,
.vd_blank = vt_fb_blank,
- .vd_bitbltchr = vt_fb_bitbltchr,
+ .vd_bitblt_text = vt_fb_bitblt_text,
.vd_drawrect = vt_fb_drawrect,
.vd_setpixel = vt_fb_setpixel,
.vd_postswitch = vt_fb_postswitch,
@@ -146,7 +145,7 @@ vt_fb_mmap(struct vt_device *vd, vm_ooff
return (EINVAL);
}
-void
+static void
vt_fb_setpixel(struct vt_device *vd, int x, int y, term_color_t color)
{
struct fb_info *info;
@@ -181,7 +180,7 @@ vt_fb_setpixel(struct vt_device *vd, int
}
-void
+static void
vt_fb_drawrect(struct vt_device *vd, int x1, int y1, int x2, int y2, int fill,
term_color_t color)
{
@@ -243,14 +242,15 @@ vt_fb_blank(struct vt_device *vd, term_c
}
}
-void
-vt_fb_bitbltchr(struct vt_device *vd, const uint8_t *src, const uint8_t *mask,
- int bpl, vt_axis_t top, vt_axis_t left, unsigned int width,
- unsigned int height, term_color_t fg, term_color_t bg)
+static void
+vt_fb_bitblt_bitmap(struct vt_device *vd, const struct vt_window *vw,
+ const uint8_t *pattern, const uint8_t *mask,
+ unsigned int width, unsigned int height,
+ unsigned int x, unsigned int y, term_color_t fg, term_color_t bg)
{
struct fb_info *info;
uint32_t fgc, bgc, cc, o;
- int c, l, bpp;
+ int c, l, bpp, bpl;
u_long line;
uint8_t b, m;
const uint8_t *ch;
@@ -260,19 +260,18 @@ vt_fb_bitbltchr(struct vt_device *vd, co
fgc = info->fb_cmap[fg];
bgc = info->fb_cmap[bg];
b = m = 0;
- if (bpl == 0)
- bpl = (width + 7) >> 3; /* Bytes per sorce line. */
+ bpl = (width + 7) >> 3; /* Bytes per source line. */
/* Don't try to put off screen pixels */
- if (((left + width) > info->fb_width) || ((top + height) >
+ if (((x + width) > info->fb_width) || ((y + height) >
info->fb_height))
return;
KASSERT((info->fb_vbase != 0), ("Unmapped framebuffer"));
- line = (info->fb_stride * top) + (left * bpp);
+ line = (info->fb_stride * y) + (x * bpp);
for (l = 0; l < height; l++) {
- ch = src;
+ ch = pattern;
for (c = 0; c < width; c++) {
if (c % 8 == 0)
b = *ch++;
@@ -312,8 +311,62 @@ vt_fb_bitbltchr(struct vt_device *vd, co
}
}
line += info->fb_stride;
- src += bpl;
+ pattern += bpl;
+ }
+}
+
+void
+vt_fb_bitblt_text(struct vt_device *vd, const struct vt_window *vw,
+ const term_rect_t *area)
+{
+ unsigned int col, row, x, y;
+ struct vt_font *vf;
+ term_char_t c;
+ term_color_t fg, bg;
+ const uint8_t *pattern;
+
+ vf = vw->vw_font;
+
+ 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;
+
+ c = VTBUF_GET_FIELD(&vw->vw_buf, row, col);
+ pattern = vtfont_lookup(vf, c);
+ vt_determine_colors(c,
+ VTBUF_ISCURSOR(&vw->vw_buf, row, col), &fg, &bg);
+
+ vt_fb_bitblt_bitmap(vd, vw,
+ pattern, NULL, vf->vf_width, vf->vf_height,
+ x, y, fg, bg);
+ }
+ }
+
+#ifndef SC_NO_CUTPASTE
+ if (!vd->vd_mshown)
+ return;
+
+ term_rect_t drawn_area;
+
+ drawn_area.tr_begin.tp_col = area->tr_begin.tp_col * vf->vf_width +
+ vw->vw_offset.tp_col;
+ drawn_area.tr_begin.tp_row = area->tr_begin.tp_row * vf->vf_height +
+ vw->vw_offset.tp_row;
+ drawn_area.tr_end.tp_col = area->tr_end.tp_col * vf->vf_width +
+ vw->vw_offset.tp_col;
+ drawn_area.tr_end.tp_row = area->tr_end.tp_row * vf->vf_height +
+ vw->vw_offset.tp_row;
+
+ 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_mcursor_fg, vd->vd_mcursor_bg);
}
+#endif
}
void
Modified: head/sys/dev/vt/hw/fb/vt_fb.h
==============================================================================
--- head/sys/dev/vt/hw/fb/vt_fb.h Sat Aug 23 14:58:31 2014 (r270410)
+++ head/sys/dev/vt/hw/fb/vt_fb.h Sat Aug 23 15:00:47 2014 (r270411)
@@ -36,11 +36,11 @@ int vt_fb_attach(struct fb_info *info);
void vt_fb_resume(void);
void vt_fb_suspend(void);
-vd_init_t vt_fb_init;
-vd_blank_t vt_fb_blank;
-vd_bitbltchr_t vt_fb_bitbltchr;
-vd_postswitch_t vt_fb_postswitch;
-vd_fb_ioctl_t vt_fb_ioctl;
-vd_fb_mmap_t vt_fb_mmap;
+vd_init_t vt_fb_init;
+vd_blank_t vt_fb_blank;
+vd_bitblt_text_t vt_fb_bitblt_text;
+vd_postswitch_t vt_fb_postswitch;
+vd_fb_ioctl_t vt_fb_ioctl;
+vd_fb_mmap_t vt_fb_mmap;
#endif /* _DEV_VT_HW_FB_VT_FB_H_ */
Modified: head/sys/powerpc/ps3/ps3_syscons.c
==============================================================================
--- head/sys/powerpc/ps3/ps3_syscons.c Sat Aug 23 14:58:31 2014 (r270410)
+++ head/sys/powerpc/ps3/ps3_syscons.c Sat Aug 23 15:00:47 2014 (r270411)
@@ -76,7 +76,7 @@ static struct vt_driver vt_ps3fb_driver
.vd_probe = ps3fb_probe,
.vd_init = ps3fb_init,
.vd_blank = vt_fb_blank,
- .vd_bitbltchr = vt_fb_bitbltchr,
+ .vd_bitblt_text = vt_fb_bitblt_text,
.vd_fb_ioctl = vt_fb_ioctl,
.vd_fb_mmap = vt_fb_mmap,
/* Better than VGA, but still generic driver. */
More information about the svn-src-all
mailing list