📄 fb_map.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 + -