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
This commit is contained in:
parent
c1eee9efe3
commit
cd597e6481
@ -521,12 +521,8 @@ vga_bitblt_pixels_block_ncolors(struct vt_device *vd, const uint8_t *masks,
|
||||
|
||||
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 vt_device *vd, const struct vt_buf *vb,
|
||||
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 vt_device *vd, const struct vt_buf *vb,
|
||||
* 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 vt_device *vd, const struct vt_buf *vb,
|
||||
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 vt_device *vd, const struct vt_buf *vb,
|
||||
|
||||
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 *vd, const struct vt_buf *vb,
|
||||
|
||||
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 *vd, const struct vt_buf *vb,
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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_device *vd, const uint8_t *src,
|
||||
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);
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user