📄 sis_accel.c
字号:
u32 col = 0; u32 vxres = info->var.xres_virtual; u32 vyres = info->var.yres_virtual; int width, height; CRITFLAGS if(info->state != FBINFO_STATE_RUNNING) { return; } if(!ivideo->accel) { cfb_fillrect(info, rect); return; } if(!rect->width || !rect->height || rect->dx >= vxres || rect->dy >= vyres) { return; } /* Clipping */ width = ((rect->dx + rect->width) > vxres) ? (vxres - rect->dx) : rect->width; height = ((rect->dy + rect->height) > vyres) ? (vyres - rect->dy) : rect->height; switch(info->var.bits_per_pixel) { case 8: col = rect->color; break; case 16: case 32: col = ((u32 *)(info->pseudo_palette))[rect->color]; break; } if(ivideo->sisvga_engine == SIS_300_VGA) {#ifdef CONFIG_FB_SIS_300 CRITBEGIN SiS300SetupForSolidFill(ivideo, col, myrops[rect->rop]); SiS300SubsequentSolidFillRect(ivideo, rect->dx, rect->dy, width, height); CRITEND SiS300Sync(ivideo);#endif } else {#ifdef CONFIG_FB_SIS_315 CRITBEGIN SiS310SetupForSolidFill(ivideo, col, myrops[rect->rop]); SiS310SubsequentSolidFillRect(ivideo, rect->dx, rect->dy, width, height); CRITEND SiS310Sync(ivideo);#endif }}void fbcon_sis_copyarea(struct fb_info *info, const struct fb_copyarea *area){ struct sis_video_info *ivideo = (struct sis_video_info *)info->par; u32 vxres = info->var.xres_virtual; u32 vyres = info->var.yres_virtual; int width = area->width; int height = area->height; CRITFLAGS if(info->state != FBINFO_STATE_RUNNING) { return; } if(!ivideo->accel) { cfb_copyarea(info, area); return; } if(!width || !height || area->sx >= vxres || area->sy >= vyres || area->dx >= vxres || area->dy >= vyres) { return; } /* Clipping */ if((area->sx + width) > vxres) width = vxres - area->sx; if((area->dx + width) > vxres) width = vxres - area->dx; if((area->sy + height) > vyres) height = vyres - area->sy; if((area->dy + height) > vyres) height = vyres - area->dy; if(ivideo->sisvga_engine == SIS_300_VGA) {#ifdef CONFIG_FB_SIS_300 int xdir, ydir; if(area->sx < area->dx) xdir = 0; else xdir = 1; if(area->sy < area->dy) ydir = 0; else ydir = 1; CRITBEGIN SiS300SetupForScreenToScreenCopy(ivideo, xdir, ydir, 3, -1); SiS300SubsequentScreenToScreenCopy(ivideo, area->sx, area->sy, area->dx, area->dy, width, height); CRITEND SiS300Sync(ivideo);#endif } else {#ifdef CONFIG_FB_SIS_315 CRITBEGIN SiS310SetupForScreenToScreenCopy(ivideo, 3, -1); SiS310SubsequentScreenToScreenCopy(ivideo, area->sx, area->sy, area->dx, area->dy, width, height); CRITEND SiS310Sync(ivideo);#endif }}#endif#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) /* -------------- 2.4 --------------- */void fbcon_sis_bmove(struct display *p, int srcy, int srcx, int dsty, int dstx, int height, int width){ struct sis_video_info *ivideo = (struct sis_video_info *)p->fb_info->par; CRITFLAGS if(!ivideo->accel) { switch(ivideo->video_bpp) { case 8:#ifdef FBCON_HAS_CFB8 fbcon_cfb8_bmove(p, srcy, srcx, dsty, dstx, height, width);#endif break; case 16:#ifdef FBCON_HAS_CFB16 fbcon_cfb16_bmove(p, srcy, srcx, dsty, dstx, height, width);#endif break; case 32:#ifdef FBCON_HAS_CFB32 fbcon_cfb32_bmove(p, srcy, srcx, dsty, dstx, height, width);#endif break; } return; } srcx *= fontwidth(p); srcy *= fontheight(p); dstx *= fontwidth(p); dsty *= fontheight(p); width *= fontwidth(p); height *= fontheight(p); if(ivideo->sisvga_engine == SIS_300_VGA) {#ifdef CONFIG_FB_SIS_300 int xdir, ydir; if(srcx < dstx) xdir = 0; else xdir = 1; if(srcy < dsty) ydir = 0; else ydir = 1; CRITBEGIN SiS300SetupForScreenToScreenCopy(ivideo, xdir, ydir, 3, -1); SiS300SubsequentScreenToScreenCopy(ivideo, srcx, srcy, dstx, dsty, width, height); CRITEND SiS300Sync(ivideo);#endif } else {#ifdef CONFIG_FB_SIS_315 CRITBEGIN SiS310SetupForScreenToScreenCopy(ivideo, 3, -1); SiS310SubsequentScreenToScreenCopy(ivideo, srcx, srcy, dstx, dsty, width, height); CRITEND SiS310Sync(ivideo);#endif }}static void fbcon_sis_clear(struct vc_data *conp, struct display *p, int srcy, int srcx, int height, int width, int color){ struct sis_video_info *ivideo = (struct sis_video_info *)p->fb_info->par; CRITFLAGS srcx *= fontwidth(p); srcy *= fontheight(p); width *= fontwidth(p); height *= fontheight(p); if(ivideo->sisvga_engine == SIS_300_VGA) {#ifdef CONFIG_FB_SIS_300 CRITBEGIN SiS300SetupForSolidFill(ivideo, color, 3); SiS300SubsequentSolidFillRect(ivideo, srcx, srcy, width, height); CRITEND SiS300Sync(ivideo);#endif } else {#ifdef CONFIG_FB_SIS_315 CRITBEGIN SiS310SetupForSolidFill(ivideo, color, 3); SiS310SubsequentSolidFillRect(ivideo, srcx, srcy, width, height); CRITEND SiS310Sync(ivideo);#endif }}void fbcon_sis_clear8(struct vc_data *conp, struct display *p, int srcy, int srcx, int height, int width){ struct sis_video_info *ivideo = (struct sis_video_info *)p->fb_info->par; u32 bgx; if(!ivideo->accel) {#ifdef FBCON_HAS_CFB8 fbcon_cfb8_clear(conp, p, srcy, srcx, height, width);#endif return; } bgx = attr_bgcol_ec(p, conp); fbcon_sis_clear(conp, p, srcy, srcx, height, width, bgx);}void fbcon_sis_clear16(struct vc_data *conp, struct display *p, int srcy, int srcx, int height, int width){ struct sis_video_info *ivideo = (struct sis_video_info *)p->fb_info->par; u32 bgx; if(!ivideo->accel) {#ifdef FBCON_HAS_CFB16 fbcon_cfb16_clear(conp, p, srcy, srcx, height, width);#endif return; } bgx = ((u_int16_t*)p->dispsw_data)[attr_bgcol_ec(p, conp)]; fbcon_sis_clear(conp, p, srcy, srcx, height, width, bgx);}void fbcon_sis_clear32(struct vc_data *conp, struct display *p, int srcy, int srcx, int height, int width){ struct sis_video_info *ivideo = (struct sis_video_info *)p->fb_info->par; u32 bgx; if(!ivideo->accel) {#ifdef FBCON_HAS_CFB32 fbcon_cfb32_clear(conp, p, srcy, srcx, height, width);#endif return; } bgx = ((u_int32_t*)p->dispsw_data)[attr_bgcol_ec(p, conp)]; fbcon_sis_clear(conp, p, srcy, srcx, height, width, bgx);}void fbcon_sis_revc(struct display *p, int srcx, int srcy){ struct sis_video_info *ivideo = (struct sis_video_info *)p->fb_info->par; CRITFLAGS if(!ivideo->accel) { switch(ivideo->video_bpp) { case 16:#ifdef FBCON_HAS_CFB16 fbcon_cfb16_revc(p, srcx, srcy);#endif break; case 32:#ifdef FBCON_HAS_CFB32 fbcon_cfb32_revc(p, srcx, srcy);#endif break; } return; } srcx *= fontwidth(p); srcy *= fontheight(p); if(ivideo->sisvga_engine == SIS_300_VGA) {#ifdef CONFIG_FB_SIS_300 CRITBEGIN SiS300SetupForSolidFill(ivideo, 0, 0x0a); SiS300SubsequentSolidFillRect(ivideo, srcx, srcy, fontwidth(p), fontheight(p)); CRITEND SiS300Sync(ivideo);#endif } else {#ifdef CONFIG_FB_SIS_315 CRITBEGIN SiS310SetupForSolidFill(ivideo, 0, 0x0a); SiS310SubsequentSolidFillRect(ivideo, srcx, srcy, fontwidth(p), fontheight(p)); CRITEND SiS310Sync(ivideo);#endif }}#ifdef FBCON_HAS_CFB8struct display_switch fbcon_sis8 = { .setup = fbcon_cfb8_setup, .bmove = fbcon_sis_bmove, .clear = fbcon_sis_clear8, .putc = fbcon_cfb8_putc, .putcs = fbcon_cfb8_putcs, .revc = fbcon_cfb8_revc, .clear_margins = fbcon_cfb8_clear_margins, .fontwidthmask = FONTWIDTH(4)|FONTWIDTH(8)|FONTWIDTH(12)|FONTWIDTH(16)};#endif#ifdef FBCON_HAS_CFB16struct display_switch fbcon_sis16 = { .setup = fbcon_cfb16_setup, .bmove = fbcon_sis_bmove, .clear = fbcon_sis_clear16, .putc = fbcon_cfb16_putc, .putcs = fbcon_cfb16_putcs, .revc = fbcon_sis_revc, .clear_margins = fbcon_cfb16_clear_margins, .fontwidthmask = FONTWIDTH(4)|FONTWIDTH(8)|FONTWIDTH(12)|FONTWIDTH(16)};#endif#ifdef FBCON_HAS_CFB32struct display_switch fbcon_sis32 = { .setup = fbcon_cfb32_setup, .bmove = fbcon_sis_bmove, .clear = fbcon_sis_clear32, .putc = fbcon_cfb32_putc, .putcs = fbcon_cfb32_putcs, .revc = fbcon_sis_revc, .clear_margins = fbcon_cfb32_clear_margins, .fontwidthmask = FONTWIDTH(4)|FONTWIDTH(8)|FONTWIDTH(12)|FONTWIDTH(16)};#endif#endif /* KERNEL VERSION */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -