亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? fbmem.c

?? linux lcd 的標準接口
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* *  linux/drivers/video/fbmem.c * *  Copyright (C) 1994 Martin Schaller * *	2001 - Documented with DocBook *	- Brad Douglas <brad@neruo.com> * * This file is subject to the terms and conditions of the GNU General Public * License.  See the file COPYING in the main directory of this archive * for more details. */#include <linux/module.h>#include <linux/compat.h>#include <linux/types.h>#include <linux/errno.h>#include <linux/smp_lock.h>#include <linux/kernel.h>#include <linux/major.h>#include <linux/slab.h>#include <linux/mm.h>#include <linux/mman.h>#include <linux/vt.h>#include <linux/init.h>#include <linux/linux_logo.h>#include <linux/proc_fs.h>#include <linux/console.h>#ifdef CONFIG_KMOD#include <linux/kmod.h>#endif#include <linux/err.h>#include <linux/device.h>#include <linux/efi.h>#if defined(__mc68000__) || defined(CONFIG_APUS)#include <asm/setup.h>#endif#include <asm/io.h>#include <asm/uaccess.h>#include <asm/page.h>#include <asm/pgtable.h>#include <linux/fb.h>    /*     *  Frame buffer device initialization and setup routines     */#define FBPIXMAPSIZE	(1024 * 8)struct fb_info *registered_fb[FB_MAX] __read_mostly;int num_registered_fb __read_mostly;/* * Helpers */int fb_get_color_depth(struct fb_var_screeninfo *var,		       struct fb_fix_screeninfo *fix){	int depth = 0;	if (fix->visual == FB_VISUAL_MONO01 ||	    fix->visual == FB_VISUAL_MONO10)		depth = 1;	else {		if (var->green.length == var->blue.length &&		    var->green.length == var->red.length &&		    var->green.offset == var->blue.offset &&		    var->green.offset == var->red.offset)			depth = var->green.length;		else			depth = var->green.length + var->red.length +				var->blue.length;	}	return depth;}EXPORT_SYMBOL(fb_get_color_depth);/* * Data padding functions. */void fb_pad_aligned_buffer(u8 *dst, u32 d_pitch, u8 *src, u32 s_pitch, u32 height){	__fb_pad_aligned_buffer(dst, d_pitch, src, s_pitch, height);}EXPORT_SYMBOL(fb_pad_aligned_buffer);void fb_pad_unaligned_buffer(u8 *dst, u32 d_pitch, u8 *src, u32 idx, u32 height,				u32 shift_high, u32 shift_low, u32 mod){	u8 mask = (u8) (0xfff << shift_high), tmp;	int i, j;	for (i = height; i--; ) {		for (j = 0; j < idx; j++) {			tmp = dst[j];			tmp &= mask;			tmp |= *src >> shift_low;			dst[j] = tmp;			tmp = *src << shift_high;			dst[j+1] = tmp;			src++;		}		tmp = dst[idx];		tmp &= mask;		tmp |= *src >> shift_low;		dst[idx] = tmp;		if (shift_high < mod) {			tmp = *src << shift_high;			dst[idx+1] = tmp;		}		src++;		dst += d_pitch;	}}EXPORT_SYMBOL(fb_pad_unaligned_buffer);/* * we need to lock this section since fb_cursor * may use fb_imageblit() */char* fb_get_buffer_offset(struct fb_info *info, struct fb_pixmap *buf, u32 size){	u32 align = buf->buf_align - 1, offset;	char *addr = buf->addr;	/* If IO mapped, we need to sync before access, no sharing of	 * the pixmap is done	 */	if (buf->flags & FB_PIXMAP_IO) {		if (info->fbops->fb_sync && (buf->flags & FB_PIXMAP_SYNC))			info->fbops->fb_sync(info);		return addr;	}	/* See if we fit in the remaining pixmap space */	offset = buf->offset + align;	offset &= ~align;	if (offset + size > buf->size) {		/* We do not fit. In order to be able to re-use the buffer,		 * we must ensure no asynchronous DMA'ing or whatever operation		 * is in progress, we sync for that.		 */		if (info->fbops->fb_sync && (buf->flags & FB_PIXMAP_SYNC))			info->fbops->fb_sync(info);		offset = 0;	}	buf->offset = offset + size;	addr += offset;	return addr;}#ifdef CONFIG_LOGOstatic inline unsigned safe_shift(unsigned d, int n){	return n < 0 ? d >> -n : d << n;}static void fb_set_logocmap(struct fb_info *info,				   const struct linux_logo *logo){	struct fb_cmap palette_cmap;	u16 palette_green[16];	u16 palette_blue[16];	u16 palette_red[16];	int i, j, n;	const unsigned char *clut = logo->clut;	palette_cmap.start = 0;	palette_cmap.len = 16;	palette_cmap.red = palette_red;	palette_cmap.green = palette_green;	palette_cmap.blue = palette_blue;	palette_cmap.transp = NULL;	for (i = 0; i < logo->clutsize; i += n) {		n = logo->clutsize - i;		/* palette_cmap provides space for only 16 colors at once */		if (n > 16)			n = 16;		palette_cmap.start = 32 + i;		palette_cmap.len = n;		for (j = 0; j < n; ++j) {			palette_cmap.red[j] = clut[0] << 8 | clut[0];			palette_cmap.green[j] = clut[1] << 8 | clut[1];			palette_cmap.blue[j] = clut[2] << 8 | clut[2];			clut += 3;		}		fb_set_cmap(&palette_cmap, info);	}}static void  fb_set_logo_truepalette(struct fb_info *info,					    const struct linux_logo *logo,					    u32 *palette){	static const unsigned char mask[] = { 0,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff };	unsigned char redmask, greenmask, bluemask;	int redshift, greenshift, blueshift;	int i;	const unsigned char *clut = logo->clut;	/*	 * We have to create a temporary palette since console palette is only	 * 16 colors long.	 */	/* Bug: Doesn't obey msb_right ... (who needs that?) */	redmask   = mask[info->var.red.length   < 8 ? info->var.red.length   : 8];	greenmask = mask[info->var.green.length < 8 ? info->var.green.length : 8];	bluemask  = mask[info->var.blue.length  < 8 ? info->var.blue.length  : 8];	redshift   = info->var.red.offset   - (8 - info->var.red.length);	greenshift = info->var.green.offset - (8 - info->var.green.length);	blueshift  = info->var.blue.offset  - (8 - info->var.blue.length);	for ( i = 0; i < logo->clutsize; i++) {		palette[i+32] = (safe_shift((clut[0] & redmask), redshift) |				 safe_shift((clut[1] & greenmask), greenshift) |				 safe_shift((clut[2] & bluemask), blueshift));		clut += 3;	}}static void fb_set_logo_directpalette(struct fb_info *info,					     const struct linux_logo *logo,					     u32 *palette){	int redshift, greenshift, blueshift;	int i;	redshift = info->var.red.offset;	greenshift = info->var.green.offset;	blueshift = info->var.blue.offset;	for (i = 32; i < logo->clutsize; i++)		palette[i] = i << redshift | i << greenshift | i << blueshift;}static void fb_set_logo(struct fb_info *info,			       const struct linux_logo *logo, u8 *dst,			       int depth){	int i, j, k;	const u8 *src = logo->data;	u8 xor = (info->fix.visual == FB_VISUAL_MONO01) ? 0xff : 0;	u8 fg = 1, d;	if (fb_get_color_depth(&info->var, &info->fix) == 3)		fg = 7;	if (info->fix.visual == FB_VISUAL_MONO01 ||	    info->fix.visual == FB_VISUAL_MONO10)		fg = ~((u8) (0xfff << info->var.green.length));	switch (depth) {	case 4:		for (i = 0; i < logo->height; i++)			for (j = 0; j < logo->width; src++) {				*dst++ = *src >> 4;				j++;				if (j < logo->width) {					*dst++ = *src & 0x0f;					j++;				}			}		break;	case 1:		for (i = 0; i < logo->height; i++) {			for (j = 0; j < logo->width; src++) {				d = *src ^ xor;				for (k = 7; k >= 0; k--) {					*dst++ = ((d >> k) & 1) ? fg : 0;					j++;				}			}		}		break;	}}/* * Three (3) kinds of logo maps exist.  linux_logo_clut224 (>16 colors), * linux_logo_vga16 (16 colors) and linux_logo_mono (2 colors).  Depending on * the visual format and color depth of the framebuffer, the DAC, the * pseudo_palette, and the logo data will be adjusted accordingly. * * Case 1 - linux_logo_clut224: * Color exceeds the number of console colors (16), thus we set the hardware DAC * using fb_set_cmap() appropriately.  The "needs_cmapreset"  flag will be set. * * For visuals that require color info from the pseudo_palette, we also construct * one for temporary use. The "needs_directpalette" or "needs_truepalette" flags * will be set. * * Case 2 - linux_logo_vga16: * The number of colors just matches the console colors, thus there is no need * to set the DAC or the pseudo_palette.  However, the bitmap is packed, ie, * each byte contains color information for two pixels (upper and lower nibble). * To be consistent with fb_imageblit() usage, we therefore separate the two * nibbles into separate bytes. The "depth" flag will be set to 4. * * Case 3 - linux_logo_mono: * This is similar with Case 2.  Each byte contains information for 8 pixels. * We isolate each bit and expand each into a byte. The "depth" flag will * be set to 1. */static struct logo_data {	int depth;	int needs_directpalette;	int needs_truepalette;	int needs_cmapreset;	const struct linux_logo *logo;} fb_logo __read_mostly;static void fb_rotate_logo_ud(const u8 *in, u8 *out, u32 width, u32 height){	u32 size = width * height, i;	out += size - 1;	for (i = size; i--; )		*out-- = *in++;}static void fb_rotate_logo_cw(const u8 *in, u8 *out, u32 width, u32 height){	int i, j, h = height - 1;	for (i = 0; i < height; i++)		for (j = 0; j < width; j++)				out[height * j + h - i] = *in++;}static void fb_rotate_logo_ccw(const u8 *in, u8 *out, u32 width, u32 height){	int i, j, w = width - 1;	for (i = 0; i < height; i++)		for (j = 0; j < width; j++)			out[height * (w - j) + i] = *in++;}static void fb_rotate_logo(struct fb_info *info, u8 *dst,			   struct fb_image *image, int rotate){	u32 tmp;	if (rotate == FB_ROTATE_UD) {		fb_rotate_logo_ud(image->data, dst, image->width,				  image->height);		image->dx = info->var.xres - image->width - image->dx;		image->dy = info->var.yres - image->height - image->dy;	} else if (rotate == FB_ROTATE_CW) {		fb_rotate_logo_cw(image->data, dst, image->width,				  image->height);		tmp = image->width;		image->width = image->height;		image->height = tmp;		tmp = image->dy;		image->dy = image->dx;		image->dx = info->var.xres - image->width - tmp;	} else if (rotate == FB_ROTATE_CCW) {		fb_rotate_logo_ccw(image->data, dst, image->width,				   image->height);		tmp = image->width;		image->width = image->height;		image->height = tmp;		tmp = image->dx;		image->dx = image->dy;		image->dy = info->var.yres - image->height - tmp;	}	image->data = dst;}static void fb_do_show_logo(struct fb_info *info, struct fb_image *image,			    int rotate, unsigned int num){	unsigned int x;	if (rotate == FB_ROTATE_UR) {		for (x = 0;		     x < num && image->dx + image->width <= info->var.xres;		     x++) {			info->fbops->fb_imageblit(info, image);			image->dx += image->width + 8;		}	} else if (rotate == FB_ROTATE_UD) {		for (x = 0; x < num && image->dx >= 0; x++) {			info->fbops->fb_imageblit(info, image);			image->dx -= image->width + 8;		}	} else if (rotate == FB_ROTATE_CW) {		for (x = 0;		     x < num && image->dy + image->height <= info->var.yres;		     x++) {			info->fbops->fb_imageblit(info, image);			image->dy += image->height + 8;		}	} else if (rotate == FB_ROTATE_CCW) {		for (x = 0; x < num && image->dy >= 0; x++) {			info->fbops->fb_imageblit(info, image);			image->dy -= image->height + 8;		}	}}int fb_prepare_logo(struct fb_info *info, int rotate){	int depth = fb_get_color_depth(&info->var, &info->fix);	int yres;	memset(&fb_logo, 0, sizeof(struct logo_data));	if (info->flags & FBINFO_MISC_TILEBLITTING ||	    info->flags & FBINFO_MODULE)		return 0;	if (info->fix.visual == FB_VISUAL_DIRECTCOLOR) {		depth = info->var.blue.length;		if (info->var.red.length < depth)			depth = info->var.red.length;		if (info->var.green.length < depth)			depth = info->var.green.length;	}	if (info->fix.visual == FB_VISUAL_STATIC_PSEUDOCOLOR && depth > 4) {		/* assume console colormap */		depth = 4;	}	if (depth >= 8) {		switch (info->fix.visual) {		case FB_VISUAL_TRUECOLOR:			fb_logo.needs_truepalette = 1;			break;		case FB_VISUAL_DIRECTCOLOR:			fb_logo.needs_directpalette = 1;			fb_logo.needs_cmapreset = 1;			break;		case FB_VISUAL_PSEUDOCOLOR:			fb_logo.needs_cmapreset = 1;			break;		}	}	/* Return if no suitable logo was found */	fb_logo.logo = fb_find_logo(depth);	if (!fb_logo.logo) {		return 0;	}		if (rotate == FB_ROTATE_UR || rotate == FB_ROTATE_UD)		yres = info->var.yres;	else		yres = info->var.xres;	if (fb_logo.logo->height > yres) {		fb_logo.logo = NULL;		return 0;	}	/* What depth we asked for might be different from what we get */	if (fb_logo.logo->type == LINUX_LOGO_CLUT224)		fb_logo.depth = 8;	else if (fb_logo.logo->type == LINUX_LOGO_VGA16)		fb_logo.depth = 4;	else		fb_logo.depth = 1;			return fb_logo.logo->height;}int fb_show_logo(struct fb_info *info, int rotate){	u32 *palette = NULL, *saved_pseudo_palette = NULL;	unsigned char *logo_new = NULL, *logo_rotate = NULL;	struct fb_image image;	/* Return if the frame buffer is not mapped or suspended */	if (fb_logo.logo == NULL || info->state != FBINFO_STATE_RUNNING ||	    info->flags & FBINFO_MODULE)		return 0;	image.depth = 8;	image.data = fb_logo.logo->data;	if (fb_logo.needs_cmapreset)		fb_set_logocmap(info, fb_logo.logo);	if (fb_logo.needs_truepalette || 	    fb_logo.needs_directpalette) {		palette = kmalloc(256 * 4, GFP_KERNEL);		if (palette == NULL)			return 0;		if (fb_logo.needs_truepalette)			fb_set_logo_truepalette(info, fb_logo.logo, palette);		else			fb_set_logo_directpalette(info, fb_logo.logo, palette);		saved_pseudo_palette = info->pseudo_palette;		info->pseudo_palette = palette;	}	if (fb_logo.depth <= 4) {		logo_new = kmalloc(fb_logo.logo->width * fb_logo.logo->height, 				   GFP_KERNEL);		if (logo_new == NULL) {			kfree(palette);			if (saved_pseudo_palette)				info->pseudo_palette = saved_pseudo_palette;			return 0;		}		image.data = logo_new;		fb_set_logo(info, fb_logo.logo, logo_new, fb_logo.depth);	}	image.dx = 0;	image.dy = 0;	image.width = fb_logo.logo->width;	image.height = fb_logo.logo->height;	if (rotate) {		logo_rotate = kmalloc(fb_logo.logo->width *				      fb_logo.logo->height, GFP_KERNEL);		if (logo_rotate)			fb_rotate_logo(info, logo_rotate, &image, rotate);	}	fb_do_show_logo(info, &image, rotate, num_online_cpus());	kfree(palette);	if (saved_pseudo_palette != NULL)		info->pseudo_palette = saved_pseudo_palette;	kfree(logo_new);	kfree(logo_rotate);	return fb_logo.logo->height;}#elseint fb_prepare_logo(struct fb_info *info, int rotate) { return 0; }int fb_show_logo(struct fb_info *info, int rotate) { return 0; }#endif /* CONFIG_LOGO */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
高清在线观看日韩| 蜜桃视频第一区免费观看| 亚洲一区二区美女| 国内久久精品视频| 欧美色大人视频| 亚洲欧美综合色| 久久99久久精品欧美| 欧美影视一区在线| 一色屋精品亚洲香蕉网站| 美女精品自拍一二三四| 欧美视频一区二区三区| 国产精品动漫网站| 国产真实乱子伦精品视频| 在线免费观看视频一区| 中文天堂在线一区| 国产一区二区三区久久久| 欧美疯狂做受xxxx富婆| 亚洲男女一区二区三区| 不卡欧美aaaaa| 2022国产精品视频| 久久99精品国产麻豆婷婷 | 国产99久久久国产精品潘金 | 老汉av免费一区二区三区 | 国产精品麻豆久久久| 国产精品免费免费| 亚洲国产精华液网站w| 久久激情五月婷婷| 日韩午夜中文字幕| 天天综合网天天综合色| 欧美三电影在线| 亚洲最大成人综合| 欧美吻胸吃奶大尺度电影| 亚洲主播在线观看| 欧美日韩一区二区三区不卡| 亚洲国产精品影院| 欧美在线观看一区| 天天亚洲美女在线视频| 91精品国产综合久久精品| 日韩国产高清在线| 精品区一区二区| 国产精品一线二线三线精华| 久久一夜天堂av一区二区三区| 国模少妇一区二区三区| 国产精品乱码一区二三区小蝌蚪| 国产黄色精品视频| 国产精品女主播av| 色婷婷精品大视频在线蜜桃视频| 亚洲欧美一区二区三区极速播放 | 国产在线视频一区二区三区| 久久免费看少妇高潮| 成人a区在线观看| 亚洲欧洲成人精品av97| 欧美性受极品xxxx喷水| 日本欧美一区二区在线观看| 26uuuu精品一区二区| 国产成人av电影| 亚洲欧美一区二区不卡| 欧美日韩一区二区三区在线| 久久激五月天综合精品| 国产精品毛片高清在线完整版| 色综合久久天天| 奇米四色…亚洲| 91免费版pro下载短视频| 日韩精品一区二区三区视频在线观看| 九九在线精品视频| 亚洲欧美综合另类在线卡通| 欧美肥妇free| www.日韩av| 美女www一区二区| 亚洲欧美日韩电影| 精品1区2区在线观看| 91香蕉视频污| 国内精品免费在线观看| 日韩美女久久久| 精品99一区二区| 欧美体内she精视频| 国产一区高清在线| 亚洲综合色自拍一区| 久久青草欧美一区二区三区| 欧美性猛交xxxxxx富婆| 国产99久久久国产精品潘金网站| 偷拍自拍另类欧美| 日韩一区欧美小说| 欧美精品一区男女天堂| 欧美午夜一区二区三区免费大片| 国产精品亚洲第一| 日韩av成人高清| 亚洲欧美一区二区三区极速播放| 久久丝袜美腿综合| 欧美一区午夜精品| 欧美羞羞免费网站| 91同城在线观看| 国产麻豆成人精品| 热久久久久久久| 亚洲一区二区在线观看视频| 国产精品卡一卡二卡三| 久久久久久综合| 精品国精品自拍自在线| 欧美一区二区三区婷婷月色| 色8久久精品久久久久久蜜| 国产成人精品亚洲日本在线桃色| 麻豆久久久久久| 日韩电影在线看| 丝袜诱惑亚洲看片| 亚洲高清一区二区三区| 亚洲自拍另类综合| 亚洲永久精品大片| 亚洲欧美国产高清| 一区二区三区中文在线| 亚洲特黄一级片| 国产精品久久三| 国产精品婷婷午夜在线观看| 久久久噜噜噜久噜久久综合| 26uuu亚洲综合色| 久久一区二区三区国产精品| 久久午夜电影网| 久久久噜噜噜久久人人看| 国产亲近乱来精品视频| 国产三级三级三级精品8ⅰ区| 精品国产伦一区二区三区免费 | 欧美性xxxxxxxx| 欧美系列一区二区| 884aa四虎影成人精品一区| 91精品综合久久久久久| 日本欧美久久久久免费播放网| 国产日韩影视精品| 中文字幕不卡在线观看| 国产精品你懂的在线欣赏| 中文字幕成人在线观看| 亚洲免费观看高清完整版在线| 亚洲综合另类小说| 美女尤物国产一区| 国产乱子伦视频一区二区三区 | 欧美国产欧美综合| 亚洲视频免费看| 天天操天天色综合| 国内精品不卡在线| 99热99精品| 在线播放中文字幕一区| 2021中文字幕一区亚洲| 国产精品久久久久久久久久免费看 | 日韩av中文字幕一区二区 | 五月天婷婷综合| 极品美女销魂一区二区三区免费 | 色噜噜狠狠成人中文综合| 91精品国产免费| 国产精品视频观看| 五月天中文字幕一区二区| 国产精品一区二区黑丝| 一本大道久久a久久综合| 91精品婷婷国产综合久久性色| 久久久久久久网| 夜夜亚洲天天久久| 国产精品一级二级三级| 在线观看日韩av先锋影音电影院| 欧美大胆人体bbbb| 亚洲精品伦理在线| 国产一区二区三区四区五区入口 | 国内精品久久久久影院薰衣草| 成人免费视频视频| 欧美一区二区三区四区五区 | 国产精品欧美极品| 久久9热精品视频| 色视频成人在线观看免| 久久久久成人黄色影片| 午夜精品aaa| 色综合欧美在线| 国产日韩在线不卡| 久久精品国内一区二区三区| 欧美亚洲动漫制服丝袜| 一区在线观看免费| 国产专区欧美精品| 欧美卡1卡2卡| 一级中文字幕一区二区| 99视频精品免费视频| 久久婷婷综合激情| 日本大胆欧美人术艺术动态| 色视频一区二区| 亚洲少妇最新在线视频| 国产成人精品网址| 久久综合九色综合欧美亚洲| 视频在线观看国产精品| 欧美亚洲国产bt| 一区二区三区四区五区视频在线观看| 国产成人自拍网| 久久精品欧美一区二区三区麻豆| 日本不卡视频一二三区| 欧美精品久久久久久久多人混战| 亚洲人成伊人成综合网小说| 成人免费看视频| 国产精品素人视频| 成人免费不卡视频| av毛片久久久久**hd| 欧美亚洲动漫制服丝袜| 亚洲综合免费观看高清完整版 | 国产精品久久久久9999吃药| 国产成人精品亚洲777人妖| 国产午夜亚洲精品午夜鲁丝片| 寂寞少妇一区二区三区| 2020国产精品|