brintos

brintos / linux-shallow public Read only

0
0
Text · 3.6 KiB · eff7ec4 Raw
152 lines · c
1/*2 *  linux/drivers/video/console/tileblit.c -- Tile Blitting Operation3 *4 *      Copyright (C) 2004 Antonino Daplas <adaplas @pol.net>5 *6 *  This file is subject to the terms and conditions of the GNU General Public7 *  License.  See the file COPYING in the main directory of this archive for8 *  more details.9 */10 11#include <linux/module.h>12#include <linux/string.h>13#include <linux/fb.h>14#include <linux/vt_kern.h>15#include <linux/console.h>16#include <asm/types.h>17#include "fbcon.h"18 19static void tile_bmove(struct vc_data *vc, struct fb_info *info, int sy,20		       int sx, int dy, int dx, int height, int width)21{22	struct fb_tilearea area;23 24	area.sx = sx;25	area.sy = sy;26	area.dx = dx;27	area.dy = dy;28	area.height = height;29	area.width = width;30 31	info->tileops->fb_tilecopy(info, &area);32}33 34static void tile_clear(struct vc_data *vc, struct fb_info *info, int sy,35		       int sx, int height, int width)36{37	struct fb_tilerect rect;38	int bgshift = (vc->vc_hi_font_mask) ? 13 : 12;39	int fgshift = (vc->vc_hi_font_mask) ? 9 : 8;40 41	rect.index = vc->vc_video_erase_char &42		((vc->vc_hi_font_mask) ? 0x1ff : 0xff);43	rect.fg = attr_fgcol_ec(fgshift, vc, info);44	rect.bg = attr_bgcol_ec(bgshift, vc, info);45	rect.sx = sx;46	rect.sy = sy;47	rect.width = width;48	rect.height = height;49	rect.rop = ROP_COPY;50 51	info->tileops->fb_tilefill(info, &rect);52}53 54static void tile_putcs(struct vc_data *vc, struct fb_info *info,55		       const unsigned short *s, int count, int yy, int xx,56		       int fg, int bg)57{58	struct fb_tileblit blit;59	unsigned short charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;60	int size = sizeof(u32) * count, i;61 62	blit.sx = xx;63	blit.sy = yy;64	blit.width = count;65	blit.height = 1;66	blit.fg = fg;67	blit.bg = bg;68	blit.length = count;69	blit.indices = (u32 *) fb_get_buffer_offset(info, &info->pixmap, size);70	for (i = 0; i < count; i++)71		blit.indices[i] = (u32)(scr_readw(s++) & charmask);72 73	info->tileops->fb_tileblit(info, &blit);74}75 76static void tile_clear_margins(struct vc_data *vc, struct fb_info *info,77			       int color, int bottom_only)78{79	return;80}81 82static void tile_cursor(struct vc_data *vc, struct fb_info *info, bool enable,83			int fg, int bg)84{85	struct fb_tilecursor cursor;86	int use_sw = vc->vc_cursor_type & CUR_SW;87 88	cursor.sx = vc->state.x;89	cursor.sy = vc->state.y;90	cursor.mode = enable && !use_sw;91	cursor.fg = fg;92	cursor.bg = bg;93 94	switch (vc->vc_cursor_type & 0x0f) {95	case CUR_NONE:96		cursor.shape = FB_TILE_CURSOR_NONE;97		break;98	case CUR_UNDERLINE:99		cursor.shape = FB_TILE_CURSOR_UNDERLINE;100		break;101	case CUR_LOWER_THIRD:102		cursor.shape = FB_TILE_CURSOR_LOWER_THIRD;103		break;104	case CUR_LOWER_HALF:105		cursor.shape = FB_TILE_CURSOR_LOWER_HALF;106		break;107	case CUR_TWO_THIRDS:108		cursor.shape = FB_TILE_CURSOR_TWO_THIRDS;109		break;110	case CUR_BLOCK:111	default:112		cursor.shape = FB_TILE_CURSOR_BLOCK;113		break;114	}115 116	info->tileops->fb_tilecursor(info, &cursor);117}118 119static int tile_update_start(struct fb_info *info)120{121	struct fbcon_ops *ops = info->fbcon_par;122	int err;123 124	err = fb_pan_display(info, &ops->var);125	ops->var.xoffset = info->var.xoffset;126	ops->var.yoffset = info->var.yoffset;127	ops->var.vmode = info->var.vmode;128	return err;129}130 131void fbcon_set_tileops(struct vc_data *vc, struct fb_info *info)132{133	struct fb_tilemap map;134	struct fbcon_ops *ops = info->fbcon_par;135 136	ops->bmove = tile_bmove;137	ops->clear = tile_clear;138	ops->putcs = tile_putcs;139	ops->clear_margins = tile_clear_margins;140	ops->cursor = tile_cursor;141	ops->update_start = tile_update_start;142 143	if (ops->p) {144		map.width = vc->vc_font.width;145		map.height = vc->vc_font.height;146		map.depth = 1;147		map.length = vc->vc_font.charcount;148		map.data = ops->p->fontdata;149		info->tileops->fb_settile(info, &map);150	}151}152