亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
日本不卡一二三| 欧美日韩一区不卡| 欧美人与z0zoxxxx视频| 久久精品人人做人人综合 | 欧美色图天堂网| 日韩精品一区二区在线观看| 亚洲日本va午夜在线影院| 麻豆一区二区三区| 欧美人动与zoxxxx乱| 亚洲色图丝袜美腿| 丰满少妇在线播放bd日韩电影| 欧美一级免费大片| 亚洲综合偷拍欧美一区色| aaa亚洲精品| 中文字幕av一区二区三区| 激情文学综合丁香| 日韩一级完整毛片| 男男gaygay亚洲| 欧美伦理电影网| 亚洲国产欧美日韩另类综合 | 3d动漫精品啪啪一区二区竹菊 | 欧洲av一区二区嗯嗯嗯啊| 国产精品色一区二区三区| 国产精品99久久久| 国产女人aaa级久久久级| 黑人巨大精品欧美一区| 精品国产99国产精品| 激情深爱一区二区| 精品国产凹凸成av人网站| 精品在线视频一区| 国产亚洲欧美日韩日本| 韩国欧美国产1区| 亚洲成人精品在线观看| 一本到三区不卡视频| 亚洲欧美日韩国产手机在线 | 亚洲第一狼人社区| 欧美精品精品一区| 蜜桃视频第一区免费观看| 日韩欧美亚洲国产另类| 国产精品一级二级三级| 国产欧美精品一区二区三区四区| 成人一区在线观看| 亚洲乱码中文字幕综合| 精品视频在线免费| 久久精品国产久精国产| 久久色成人在线| 不卡av免费在线观看| 亚洲视频你懂的| 欧美日本不卡视频| 国产乱子伦视频一区二区三区| 欧美国产成人在线| 欧美又粗又大又爽| 蜜臀av性久久久久蜜臀aⅴ | 精品久久久久久久人人人人传媒| 精品亚洲成a人| 国产清纯白嫩初高生在线观看91| 色噜噜狠狠成人网p站| 日韩国产一二三区| 中文字幕不卡一区| 欧美老肥妇做.爰bbww视频| 激情久久五月天| 综合久久一区二区三区| 欧美一区二区三区喷汁尤物| 国产福利一区二区三区视频在线 | 亚洲人成7777| 欧美一区二区在线播放| 成人精品亚洲人成在线| 首页综合国产亚洲丝袜| 国产农村妇女精品| 欧美挠脚心视频网站| 高清日韩电视剧大全免费| 天堂蜜桃91精品| 中文字幕不卡在线| 日韩一区二区免费在线电影| 99r国产精品| 国产中文字幕精品| 亚洲一区二区三区在线| 国产精品视频看| 精品剧情v国产在线观看在线| 日本精品一区二区三区四区的功能| 玖玖九九国产精品| 亚洲国产中文字幕在线视频综合| 国产午夜亚洲精品羞羞网站| 欧美在线观看视频一区二区三区 | 久久精品国产亚洲5555| 夜夜嗨av一区二区三区中文字幕 | 91香蕉国产在线观看软件| 久久99最新地址| 视频一区欧美精品| 一区二区三区.www| 国产精品成人免费在线| 日韩国产精品91| 亚洲在线视频网站| 国产精品卡一卡二卡三| 久久久亚洲精华液精华液精华液| 欧美久久婷婷综合色| 欧美中文字幕一区二区三区| 成人av在线一区二区| 国产91清纯白嫩初高中在线观看 | 亚洲国产高清不卡| 精品国产第一区二区三区观看体验| 欧美久久高跟鞋激| 欧美在线小视频| 欧美性色欧美a在线播放| 91视频免费播放| 99国产精品久久久| 99麻豆久久久国产精品免费| 成人网男人的天堂| 不卡一二三区首页| 成人精品免费网站| 不卡电影免费在线播放一区| 成人av免费在线观看| 99久久久无码国产精品| av成人免费在线观看| 色综合天天综合网天天看片| 91蜜桃免费观看视频| 一本大道综合伊人精品热热| 色婷婷久久久亚洲一区二区三区| 91免费版在线| 欧美亚男人的天堂| 欧美日高清视频| 欧美成人女星排行榜| 久久一二三国产| 中国av一区二区三区| 亚洲人一二三区| 亚洲综合视频在线观看| 日本麻豆一区二区三区视频| 久久99国内精品| 国产成人免费视频一区| 97国产精品videossex| 欧美三级韩国三级日本三斤| 欧美高清视频一二三区| 欧美xxxxx牲另类人与| 国产日韩精品一区二区三区 | 美脚の诱脚舐め脚责91 | 欧美精品在线观看一区二区| 51午夜精品国产| 国产区在线观看成人精品| 国产精品女人毛片| 亚洲国产一区二区a毛片| 国产最新精品精品你懂的| av午夜精品一区二区三区| 欧美天堂一区二区三区| 精品盗摄一区二区三区| 自拍偷自拍亚洲精品播放| 日一区二区三区| 成人不卡免费av| 7777精品伊人久久久大香线蕉的 | 91精品国产乱码| 国产午夜精品福利| 亚洲成人高清在线| 国产精品自拍三区| 欧美日韩精品综合在线| 久久精品视频在线看| 亚洲v中文字幕| 成人免费视频一区| 欧美一区二区三区在线电影| 国产精品婷婷午夜在线观看| 日日噜噜夜夜狠狠视频欧美人| 国产成人免费视频网站| 777亚洲妇女| 亚洲女性喷水在线观看一区| 国产一区二区剧情av在线| 欧美网站一区二区| 久久精品在线观看| 蜜臀久久久99精品久久久久久| 972aa.com艺术欧美| 精品国产欧美一区二区| 亚洲成人tv网| 色综合久久久网| 国产精品系列在线| 韩国理伦片一区二区三区在线播放| 欧美性xxxxxxxx| 国产精品电影一区二区| 国内精品不卡在线| 欧美老女人在线| 一区二区三区日韩| 色综合久久久久综合99| 国产精品欧美经典| 国产成人综合在线观看| 精品国产免费一区二区三区四区| 午夜精品久久久| 精品视频在线免费| 亚洲国产视频在线| 欧美丝袜丝nylons| 亚洲午夜成aⅴ人片| 91色porny在线视频| 最新成人av在线| 成+人+亚洲+综合天堂| 国产精品嫩草影院com| 国产夫妻精品视频| 久久久久久久久久久久电影| 国产麻豆91精品| 久久精品亚洲精品国产欧美kt∨ | 欧美综合一区二区三区| 亚洲欧美aⅴ...| 日本乱人伦一区| 亚洲综合色视频| 欧美日韩精品一区二区三区蜜桃| 亚洲午夜久久久久久久久电影网 |