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

📄 fb_map.c

📁 可以移植到带有FB的任何嵌入式平台下的小游戏
💻 C
字号:
#include "gaimfive.h"static unsigned char background_color[4]={255, 255, 255, 0};static unsigned char line_clolr[4]={0, 0, 0, 0};unsigned short red[256], green[256], blue[256];struct fb_cmap map332 = {0, 256, red, green, blue, NULL};unsigned short red_b[256], green_b[256], blue_b[256];struct fb_cmap map_back = {0, 256, red_b, green_b, blue_b, NULL};unsigned char *fb_buffer=NULL;int	fb_handle = 0;unsigned long 	fb_length = 0;int	fb_var_bpp=0;int fb_var_bit_width=0;int	openfb(char *dev_name){	char *dev=NULL;	//dev = getenv(FRAMEBUFFER);	if (dev==NULL)		dev = dev_name;	fb_handle = open(dev, O_RDWR);	if (fb_handle < 0)	{		printf("open device error!\n");		return -1;	}	return fb_handle;}void get_fb_var_screeninfo(int fhandle, struct fb_var_screeninfo *fb_var){	int iret=0;	iret = ioctl(fhandle, FBIOGET_VSCREENINFO, fb_var);	if (iret != 0)		exit(1);}void	set_fb_var_screeninfo(int fhandle, struct fb_var_screeninfo *fb_var){	int iret=0;	iret = ioctl(fhandle, FBIOPUT_VSCREENINFO, fb_var);	if (iret!=0)		exit(1);}void	get_fb_fix_screeninfo(int fhandle, struct fb_fix_screeninfo *fb_fix){	int iret=0;	iret = ioctl(fhandle, FBIOGET_FSCREENINFO, fb_fix);	if (iret!=0)		exit(1);}unsigned char make8color(unsigned char r, unsigned char g, unsigned char b){	unsigned char iret = 0;	iret = (r & 0xE0) | (g & 0x1C) | (b & 0x03);	return iret;}unsigned short make15color(unsigned char r, unsigned char g, unsigned char b){	unsigned char iret = 0;	iret = ((r & 0xF8)<<10) | ((g & 0xF8)<<5) | (b & 0xF8);	return iret;}unsigned short make16color(unsigned char r, unsigned char g, unsigned char b){	unsigned short iret = 0;	iret = ((r & 0xF8)<<11)	| ((g & 0xFC)<<5) | (b & 0xF8);	return iret;}void set8map(int fh, struct fb_cmap *map){	if (ioctl(fh, FBIOPUTCMAP, map) < 0) 	{		printf("Error putting colormap");		exit(1);	}}void get8map(int fh, struct fb_cmap *map){	if (ioctl(fh, FBIOGETCMAP, map) < 0) 	{		printf("Error getting colormap");		exit(1);	}}void make332map(struct fb_cmap *map){	int rs, gs, bs, i;	int r=8, g=8, b=4;	map->red = red;	map->green = green;	map->blue = blue;	rs = 256/(r-1);	gs = 256/(g-1);	bs = 256/(b-1);	for (i=0; i<256; i++) 	{		map->red[i]   = (rs*((i/(g*b))%r))*255;		map->green[i] = (gs*((i/b)%g))*255;		map->blue[i]  = (bs*((i)%b))*255;	}}void set332map(int fh){	make332map(&map332);	set8map(fh, &map332);}void	get_fb_var_var_bp(struct fb_var_screeninfo *fb_var){	int bit_width = fb_var->bits_per_pixel;	switch (bit_width)	{		case 8:			fb_var_bpp=1;			break;		case 15:		case 16:			fb_var_bpp=2;			break;		case 24:		case 32:			fb_var_bpp=4;			break;		default:			fb_var_bpp=4;			break;				}	return ;}void	*convertRGB_fb(unsigned char *rgb, int bpp){	unsigned long 	i=0;	void 						*fbbuff = NULL;	unsigned char 	*c_buffer=NULL;	unsigned short 	*s_buffer=NULL;	unsigned int		*i_buffer=NULL;	switch (bpp)	{		case 8:			c_buffer = (unsigned char *)malloc(sizeof(unsigned char));			memset(c_buffer, 0x00, sizeof(unsigned char));			c_buffer[i] = make8color(rgb[0], rgb[1], rgb[2]);			fbbuff = c_buffer;			break;		case 15:			s_buffer = (unsigned short *)malloc(sizeof(unsigned short));			memset(s_buffer, 0x00, sizeof(unsigned short));			s_buffer[i] = make15color(rgb[0], rgb[1], rgb[2]);			fbbuff = s_buffer;			break;		case 16:			s_buffer = (unsigned short *)malloc(sizeof(unsigned short));			memset(s_buffer, 0x00, sizeof(unsigned short));			s_buffer[i] = make16color(rgb[0], rgb[1], rgb[2]);			fbbuff = s_buffer;			break;		case 24:		case 32:			i_buffer = (unsigned int *)malloc(sizeof(unsigned int));			memset(i_buffer, 0x00, sizeof(unsigned int));			i_buffer[i] = ((rgb[0]<<16) & 0xFF0000) | ((rgb[1]<<8) & 0xFF00) | (rgb[2] & 0xFF);			fbbuff = i_buffer;			break;		default:			printf("fb video mode not support\n");			exit(1);	}	return  fbbuff;}void	fb_mmap_buffer(){	struct fb_var_screeninfo var;	struct fb_fix_screeninfo fix;	int fh=-1;	fh = openfb("/dev/fb0");   	get_fb_var_screeninfo(fh, &var);	get_fb_fix_screeninfo(fh, &fix);		fb_length = (fix.line_length * 8)/var.bits_per_pixel;	fb_var_bit_width = var.bits_per_pixel;	get_fb_var_var_bp(&var);	fb_buffer = mmap(NULL, fb_length*1000*fb_var_bpp, PROT_WRITE|PROT_READ, MAP_SHARED, fh, 0);	if(fb_buffer == MAP_FAILED)	{		printf("fb mmmap error\n");		return ;	}}void fb_draw_point(unsigned char *color, unsigned int pos_x, unsigned pos_y){	unsigned char *fbptr = NULL;	unsigned short *fbbuff = NULL;	fbbuff = convertRGB_fb(color, fb_var_bit_width);	if(fb_var_bpp == 1)	{ 		get8map(fb_handle, &map_back);		set332map(fb_handle);	}	fbptr = fb_buffer + (pos_y*fb_length + pos_x)*fb_var_bpp;	memcpy(fbptr, fbbuff, fb_var_bpp);	if(fb_var_bpp == 1)		set8map(fb_handle, &map_back);	free(fbbuff);}void fb_draw_chess(unsigned char *color, unsigned int x, unsigned int y){	int k=0, m=0, pos_y=0, pos_x=0, length=0;	pos_y = y + 3;	pos_x = x + 6;	length = 4;	for (k=0; k<4; k++)	{		fb_draw_horizontal_line(color, pos_x, pos_y, length, 1);	 	pos_x = pos_x - 1;	 	pos_y = pos_y + 1;	 	length = length + 2;	}		for (k=0; k<2; k++)		fb_draw_horizontal_line(color, pos_x, pos_y++, length, 1);	for (k=0; k<4; k++)	{		fb_draw_horizontal_line(color, pos_x, pos_y, length, 1);	 	pos_x = pos_x + 1;	 	pos_y = pos_y + 1;	 	length = length - 2;	}		}void fb_draw_horizontal_line(unsigned char *color, unsigned int pos_x, unsigned pos_y, unsigned int lenght, unsigned int widht){	int x_index=0, y_index=0;	unsigned char *fbptr = NULL;	unsigned short *fbbuff = NULL;	fbbuff = convertRGB_fb(color, fb_var_bit_width);	if(fb_var_bpp == 1)	{ 		get8map(fb_handle, &map_back);		set332map(fb_handle);	}	fbptr = fb_buffer + (pos_y*fb_length + pos_x)*fb_var_bpp;	for (y_index=0; y_index<widht; y_index++)	{		fbptr = fb_buffer + ((pos_y+y_index)*fb_length + pos_x)*fb_var_bpp;		for (x_index=0; x_index<lenght; x_index++, fbptr += fb_var_bpp)			memcpy(fbptr, fbbuff, fb_var_bpp);	}	if(fb_var_bpp == 1)		set8map(fb_handle, &map_back);		free(fbbuff);}void 	fb_draw_vertical_line(unsigned char *color, unsigned int pos_x, unsigned pos_y, unsigned int lenght, unsigned int widht){	int x_index=0, y_index=0;	unsigned char *fbptr = NULL;	unsigned short *fbbuff = NULL;	fbbuff = convertRGB_fb(color, fb_var_bit_width);	if(fb_var_bpp == 1)	{ 		get8map(fb_handle, &map_back);		set332map(fb_handle);	}	fbptr = fb_buffer + (pos_y*fb_length + pos_x)*fb_var_bpp;	for (y_index=0; y_index<lenght; y_index++)	{		fbptr = fb_buffer + ((pos_y+y_index)*fb_length + pos_x)*fb_var_bpp;		for (x_index=0; x_index<widht; x_index++, fbptr += fb_var_bpp)			memcpy(fbptr, fbbuff, fb_var_bpp);	}	if(fb_var_bpp == 1)		set8map(fb_handle, &map_back);		free(fbbuff);}void	fb_draw_rect(unsigned char *color, unsigned int x, unsigned int y, unsigned int width, unsigned int height){	int i=0, j=0;	unsigned char *fbptr=NULL;	unsigned char *fbbuffer=NULL;		fbbuffer = convertRGB_fb(color, fb_var_bit_width);	if(fb_var_bpp == 1)	{ 		get8map(fb_handle, &map_back);		set332map(fb_handle);	}	fbptr = fb_buffer + (y*fb_length + x)*fb_var_bpp;	for (i=0; i<height; i++)	{		fbptr = fb_buffer + ((y+i)*fb_length + x)*fb_var_bpp;		for (j=0; j<width; j++, fbptr += fb_var_bpp)			memcpy(fbptr, fbbuffer, fb_var_bpp);	}	if(fb_var_bpp == 1)		set8map(fb_handle, &map_back);	free(fbbuffer);}

⌨️ 快捷键说明

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