Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/vt/hw/fb/vt_fb.c
Show First 20 Lines • Show All 168 Lines • ▼ Show 20 Lines | |||||
vt_fb_setpixel(struct vt_device *vd, int x, int y, term_color_t color) | vt_fb_setpixel(struct vt_device *vd, int x, int y, term_color_t color) | ||||
{ | { | ||||
struct fb_info *info; | struct fb_info *info; | ||||
uint32_t c; | uint32_t c; | ||||
u_int o; | u_int o; | ||||
info = vd->vd_softc; | info = vd->vd_softc; | ||||
c = info->fb_cmap[color]; | c = info->fb_cmap[color]; | ||||
switch (info->fb_flags & (FB_FLAG_ROTATE_90 | FB_FLAG_ROTATE_180)) { | |||||
case 0: | |||||
o = info->fb_stride * y + x * FBTYPE_GET_BYTESPP(info); | o = info->fb_stride * y + x * FBTYPE_GET_BYTESPP(info); | ||||
break; | |||||
case (FB_FLAG_ROTATE_90 | FB_FLAG_ROTATE_180): | |||||
o = info->fb_stride * x + | |||||
(info->fb_width - y - 1) * FBTYPE_GET_BYTESPP(info); | |||||
break; | |||||
case FB_FLAG_ROTATE_90: | |||||
o = info->fb_stride * (info->fb_height -x - 1) + | |||||
y * FBTYPE_GET_BYTESPP(info); | |||||
break; | |||||
case FB_FLAG_ROTATE_180: | |||||
o = info->fb_stride * (info->fb_height - y - 1) + | |||||
(info->fb_width - x - 1) * FBTYPE_GET_BYTESPP(info); | |||||
break; | |||||
} | |||||
if (info->fb_flags & FB_FLAG_NOWRITE) | if (info->fb_flags & FB_FLAG_NOWRITE) | ||||
return; | return; | ||||
KASSERT((info->fb_vbase != 0), ("Unmapped framebuffer")); | KASSERT((info->fb_vbase != 0), ("Unmapped framebuffer")); | ||||
switch (FBTYPE_GET_BYTESPP(info)) { | switch (FBTYPE_GET_BYTESPP(info)) { | ||||
case 1: | case 1: | ||||
▲ Show 20 Lines • Show All 116 Lines • ▼ Show 20 Lines | vt_fb_bitblt_bitmap(struct vt_device *vd, const struct vt_window *vw, | ||||
} | } | ||||
for (yi = 0; yi < height; yi++) { | for (yi = 0; yi < height; yi++) { | ||||
for (xi = 0; xi < width; xi++) { | for (xi = 0; xi < width; xi++) { | ||||
byte = yi * bpl + xi / 8; | byte = yi * bpl + xi / 8; | ||||
bit = 0x80 >> (xi % 8); | bit = 0x80 >> (xi % 8); | ||||
/* Skip pixel write, if mask bit not set. */ | /* Skip pixel write, if mask bit not set. */ | ||||
if (mask != NULL && (mask[byte] & bit) == 0) | if (mask != NULL && (mask[byte] & bit) == 0) | ||||
continue; | continue; | ||||
switch (info->fb_flags & (FB_FLAG_ROTATE_90 | | |||||
FB_FLAG_ROTATE_180)) { | |||||
case 0: | |||||
o = (y + yi) * info->fb_stride + (x + xi) * bpp; | o = (y + yi) * info->fb_stride + (x + xi) * bpp; | ||||
break; | |||||
case (FB_FLAG_ROTATE_90 | FB_FLAG_ROTATE_180): | |||||
o = (x + xi) * info->fb_stride + | |||||
(info->fb_width - (y + yi + 1)) * bpp; | |||||
break; | |||||
case FB_FLAG_ROTATE_90: | |||||
o = (info->fb_height - (x + xi +1)) * | |||||
info->fb_stride + (y + yi) * bpp; | |||||
break; | |||||
case FB_FLAG_ROTATE_180: | |||||
o = (info->fb_height - (y + yi + 1)) * | |||||
info->fb_stride + | |||||
(info->fb_width - (x + xi + 1)) * bpp; | |||||
break; | |||||
} | |||||
o += vd->vd_transpose; | o += vd->vd_transpose; | ||||
cc = pattern[byte] & bit ? fgc : bgc; | cc = pattern[byte] & bit ? fgc : bgc; | ||||
switch(bpp) { | switch(bpp) { | ||||
case 1: | case 1: | ||||
vt_fb_mem_wr1(info, o, cc); | vt_fb_mem_wr1(info, o, cc); | ||||
break; | break; | ||||
case 2: | case 2: | ||||
▲ Show 20 Lines • Show All 143 Lines • ▼ Show 20 Lines | vt_fb_init_colors(struct fb_info *info) | ||||
} | } | ||||
} | } | ||||
int | int | ||||
vt_fb_init(struct vt_device *vd) | vt_fb_init(struct vt_device *vd) | ||||
{ | { | ||||
struct fb_info *info; | struct fb_info *info; | ||||
u_int margin; | u_int margin; | ||||
int bg, err; | int bg, rotate, err; | ||||
term_color_t c; | term_color_t c; | ||||
info = vd->vd_softc; | info = vd->vd_softc; | ||||
if (TUNABLE_INT_FETCH("kern.vt.rotate", &rotate) != 0) { | |||||
switch (rotate) { | |||||
case 1: | |||||
if (info->fb_height > info->fb_width) { | |||||
info->fb_flags |= FB_FLAG_ROTATE_90; | |||||
info->fb_flags |= FB_FLAG_ROTATE_180; | |||||
} | |||||
break; | |||||
case 90: | |||||
info->fb_flags |= FB_FLAG_ROTATE_90; | |||||
break; | |||||
case 180: | |||||
info->fb_flags |= FB_FLAG_ROTATE_180; | |||||
break; | |||||
case 270: | |||||
info->fb_flags |= FB_FLAG_ROTATE_90; | |||||
info->fb_flags |= FB_FLAG_ROTATE_180; | |||||
break; | |||||
default: | |||||
break; | |||||
} | |||||
} | |||||
if (info->fb_flags & FB_FLAG_ROTATE_90) { | |||||
vd->vd_height = MIN(VT_FB_MAX_HEIGHT, info->fb_width); | |||||
vd->vd_width = MIN(VT_FB_MAX_WIDTH, info->fb_height); | |||||
margin = (info->fb_height - vd->vd_width) >> 1; | |||||
vd->vd_transpose = margin * info->fb_stride; | |||||
margin = (info->fb_width - vd->vd_height) >> 1; | |||||
vd->vd_transpose += margin * (info->fb_bpp / NBBY); | |||||
} else { | |||||
vd->vd_height = MIN(VT_FB_MAX_HEIGHT, info->fb_height); | vd->vd_height = MIN(VT_FB_MAX_HEIGHT, info->fb_height); | ||||
margin = (info->fb_height - vd->vd_height) >> 1; | margin = (info->fb_height - vd->vd_height) >> 1; | ||||
vd->vd_transpose = margin * info->fb_stride; | vd->vd_transpose = margin * info->fb_stride; | ||||
vd->vd_width = MIN(VT_FB_MAX_WIDTH, info->fb_width); | vd->vd_width = MIN(VT_FB_MAX_WIDTH, info->fb_width); | ||||
margin = (info->fb_width - vd->vd_width) >> 1; | margin = (info->fb_width - vd->vd_width) >> 1; | ||||
vd->vd_transpose += margin * (info->fb_bpp / NBBY); | vd->vd_transpose += margin * (info->fb_bpp / NBBY); | ||||
} | |||||
vd->vd_video_dev = info->fb_video_dev; | vd->vd_video_dev = info->fb_video_dev; | ||||
if (info->fb_size == 0) | if (info->fb_size == 0) | ||||
return (CN_DEAD); | return (CN_DEAD); | ||||
if (info->fb_pbase == 0 && info->fb_vbase == 0) | if (info->fb_pbase == 0 && info->fb_vbase == 0) | ||||
info->fb_flags |= FB_FLAG_NOMMAP; | info->fb_flags |= FB_FLAG_NOMMAP; | ||||
▲ Show 20 Lines • Show All 60 Lines • Show Last 20 Lines |