⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fb.c

📁 在linux framebuffer上显示模拟的动态水波效果
💻 C
字号:
#include "fb.h"int fb_init(){	static int fb_inited = 0;	char *dev, *env;	if (fb_inited)		return 0;	fb = malloc(sizeof(FRAMEBUFFER));	if (!fb) {		fprintf(stderr, "malloc: %s\n", strerror(errno));		exit(1);	}	env = getenv("FRAMEBUFFER");	if (env)		dev = env;	else		dev = DEFAULT_FRAMEBUFFER;	if ((fb->fbh = open(dev, O_RDWR)) == -1) {		fprintf(stderr, "open %s: %s\n", dev, strerror(errno));		exit(1);	}	if (ioctl(fb->fbh, FBIOGET_VSCREENINFO, &fb->fbinfo)) {		fprintf(stderr, "ioctl FBIOGET_VSCREENINFO: %s\n",				strerror(errno));		exit(1);	}	fb->fbsize =		fb->fbinfo.xres * fb->fbinfo.yres * fb->fbinfo.bits_per_pixel / 8;	fb->fbmem =		mmap(NULL, fb->fbsize, PROT_WRITE | PROT_READ, MAP_SHARED, fb->fbh,			 0);	if (fb->fbmem == MAP_FAILED) {		fprintf(stderr, "mmap: %s\n", strerror(errno));		exit(1);	}	fb->fbclone = malloc(fb->fbsize);	if (!fb->fbclone) {		fprintf(stderr, "malloc: %s\n", strerror(errno));		exit(1);	}	fb_inited = 1;	fb->init=fb_init;	fb->release=fb_release;	fb->snap=fb_snap;	fb->refresh=fb_refresh;	fb->blit=fb_blit;	fb->convert=fb_convert;	fb_clear();	return 0;}void fb_release(){	if (fb) {		munmap(fb->fbmem, fb->fbsize);		free(fb->fbclone);		close(fb->fbh);		free(fb);	}}void fb_snap(){	memcpy(fb->fbclone, fb->fbmem, fb->fbsize);}void fb_refresh(){	memcpy(fb->fbmem, fb->fbclone, fb->fbsize);}void fb_clear(){	memset(fb->fbclone, 0x0, fb->fbsize);	memcpy(fb->fbmem, fb->fbclone, fb->fbsize);}inline unsigned char make8color(unsigned char r, unsigned char g,								unsigned char b){	return ((((r >> 5) & 7) << 5) |			(((g >> 5) & 7) << 2) | ((b >> 6) & 3));}inline unsigned short make15color(unsigned char r, unsigned char g,								  unsigned char b){	return ((((r >> 3) & 31) << 10) |			(((g >> 3) & 31) << 5) | ((b >> 3) & 31));}inline unsigned short make16color(unsigned char r, unsigned char g,								  unsigned char b){	return ((((r >> 3) & 31) << 11) |			(((g >> 2) & 63) << 5) | ((b >> 3) & 31));}void *fb_convert(unsigned char *rgbbuff, unsigned long count, int bpp){	unsigned long i;	void *fbbuff = NULL;	unsigned char *c_fbbuff;	unsigned short *s_fbbuff;	unsigned int *i_fbbuff;	switch (bpp) {	case 8:		c_fbbuff = (unsigned char *) malloc(count * sizeof(unsigned char));		for (i = 0; i < count; i++)			c_fbbuff[i] =				make8color(rgbbuff[i * 3], rgbbuff[i * 3 + 1],						   rgbbuff[i * 3 + 2]);		fbbuff = (void *) c_fbbuff;		break;	case 15:		s_fbbuff =			(unsigned short *) malloc(count * sizeof(unsigned short));		for (i = 0; i < count; i++)			s_fbbuff[i] =				make15color(rgbbuff[i * 3], rgbbuff[i * 3 + 1],							rgbbuff[i * 3 + 2]);		fbbuff = (void *) s_fbbuff;		break;	case 16:		s_fbbuff =			(unsigned short *) malloc(count * sizeof(unsigned short));		for (i = 0; i < count; i++)			s_fbbuff[i] =				make16color(rgbbuff[i * 3], rgbbuff[i * 3 + 1],							rgbbuff[i * 3 + 2]);		fbbuff = (void *) s_fbbuff;		break;	case 24:	case 32:		i_fbbuff = (unsigned int *) malloc(count * sizeof(unsigned int));		for (i = 0; i < count; i++)			i_fbbuff[i] = ((rgbbuff[i * 3] << 16) & 0xFF0000) |				((rgbbuff[i * 3 + 1] << 8) & 0xFF00) |				(rgbbuff[i * 3 + 2] & 0xFF);		fbbuff = (void *) i_fbbuff;		break;	default:		fprintf(stderr, "Unsupported video mode! You've got: %dbpp\n",				bpp);		exit(1);	}	return fbbuff;}void fb_blit(unsigned char *image, int x, int y, int width, int height){	int i, xc, yc;	unsigned char *fbptr;#if 10	if (!fb)		return;	if (fb->fbinfo.xres == width && fb->fbinfo.yres == height) {		memcpy(fb->fbmem, image, fb->fbsize);	} else {		fb_snap();		xc = (width > fb->fbinfo.xres) ? fb->fbinfo.xres : width;		yc = (height > fb->fbinfo.yres) ? fb->fbinfo.yres : height;		fbptr =			fb->fbclone + (y * fb->fbinfo.xres +						   x) * fb->fbinfo.bits_per_pixel / 8;		for (i = 0; i < yc;			 i++, fbptr +=			 fb->fbinfo.xres * fb->fbinfo.bits_per_pixel / 8, image +=			 width * fb->fbinfo.bits_per_pixel / 8)			memcpy(fbptr, image, xc * fb->fbinfo.bits_per_pixel / 8);		memcpy(fb->fbmem, fb->fbclone, fb->fbsize);	}#endif}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -