📄 libegui.c
字号:
/******************************************************** * Egui code,LGPL * Function : Egui library on Linux framebuffer * Author: asmcos@hotmail.com * Data : 2005-07-05 * $Id: libegui.c,v 1.17 2006/04/16 18:57:12 hjs Exp $ ********************************************************/#include <stdio.h>#include <stdlib.h>#include <fcntl.h>#include <unistd.h>#include <string.h>#include <sys/ioctl.h>#include <sys/mman.h>#include <sys/types.h>#include <linux/fb.h>#include <Egui.h>#include <font_8x16.h> /* Egui default font */#include <palette.h> /* 8-bit color */struct fb_fix_screeninfo fb_fix;struct fb_var_screeninfo fb_var;int FBfd;int eguifd;Efont defaultfn;int Egui_open( EGui_FBinfo *fbinfo){ char devfile[12]; /* /dev/egui */ eguifd = open("/dev/egui", O_RDONLY); if(eguifd < 0) { printf ("Open /dev/egui error,Don't open display device!\n"); printf ("Please insmod kegui.ko\n"); return 1; } if (-1 == ioctl(eguifd,EGUI_GET_FBINFO,fbinfo)) { printf("ioctl EGUI_GET_FBINFO error\n\n"); return 1; } /* must use devfile,sprintf use %d,it can effect data after fbdevfile*/ memcpy (devfile,fbinfo->fbdevfile,8); sprintf (devfile,"/dev/fb%d",fbinfo->dev); /* /dev/fbx */ FBfd = open(devfile, O_RDWR); if(FBfd < 0) { printf("Open %s error,Don't open display device!\n", fbinfo->fbdevfile); return 1; } //map physics address to virtual address fbinfo->Egui_address = (unsigned char *)mmap(NULL, (int)fbinfo->smem_len+(int )fbinfo->Egui_phyaddress, PROT_READ | PROT_WRITE, MAP_SHARED,FBfd, 0); if (-1L == (long) fbinfo->Egui_address) { printf("Mmap error! mem:%d \n", fbinfo->Egui_phyaddress); return 1; } /* initial default font 8x16 */ defaultfn.width = 8; defaultfn.height = 16; defaultfn.font_buf = fontdata_8x16; if (fbinfo->p_bpp == 1) set_palette(0, 256, (void *)palette); Egui_timer_init(); return 0;}int Egui_close(){ close(FBfd); close(eguifd); FBfd=-1;}set_palette (int c, int nc, const unsigned char (*palette)[3]){ struct fb_cmap cmap; unsigned short red[nc]; unsigned short green[nc]; unsigned short blue[nc]; int i; for (i = 0; i < nc; i++) { unsigned char e[3]; e[0] = palette[i][0]; e[1] = palette[i][1]; e[2] = palette[i][2]; if (0) red[i] = green[i] = blue[i] = (e[0] * 77 + e[1] * 151 + e[2] * 28); else { red[i] = e[0] << 8; green[i] = e[1] << 8; blue[i] = e[2] << 8; } } cmap.start = c; cmap.len = nc; cmap.red = red; cmap.green = green; cmap.blue = blue; cmap.transp = NULL; ioctl (FBfd, FBIOPUTCMAP, &cmap);}/* from nano-X and SDL */intfind_color(unsigned char (*pal)[3], int r, int g, int b){ int R, G, B; long diff = 0x7fffffffL; long sq; int best = 0; int i; for(i = 0 ; i < 255 ; i++) { const unsigned char *e = palette[i]; R = e[0] - r; G = e[1] - g; B = e[2] - b; /* slower distance-cubed with luminance adjustment*/ /* gray is .30R + .59G + .11B*/ /* = (R*77 + G*151 + B*28)/256*/ sq = (long)R*R*30*30 + (long)G*G*59*59 + (long)B*B*11*11; if(sq < diff) { best = i; if (sq ==0) break; diff = sq; } } return best;}/* return pixel */intpixel_from_rgb ( EGui_Window * ewindow, Ecolor * color){ int bpp,pwidth; int ret; int r,g,b; EGui_FBinfo * fbinfo= ewindow->fbinfo; bpp = fbinfo->p_bpp; pwidth = fbinfo->p_width; r = color->r; g = color->g; b = color->b; if (bpp == 1) return find_color(palette,r,g,b); if (bpp!=3) { r >>= (8 - fbinfo->red_length); g >>= (8 - fbinfo->green_length); b >>= (8 - fbinfo->blue_length); r <<= fbinfo->red_offset; g <<= fbinfo->green_offset; b <<= fbinfo->blue_offset; ret = r|g|b; return ret; } else { return ((r<<16)|(g<<8)|b) & 0xffffff; }}/* return rgb */intrgb_from_pixel ( EGui_Window * ewindow, int value){ int bpp,pwidth; int r,g,b; int ret; EGui_FBinfo * fbinfo= ewindow->fbinfo; bpp = fbinfo->p_bpp; pwidth = fbinfo->p_width; if (bpp == 1) { r = palette[value][0]; g = palette[value][1]; b = palette[value][2]; r <<= 16; g <<= 8; return r|g|b; } if (bpp!=3) { unsigned char tmp = 8; r = value >> fbinfo->red_offset; g = value >> fbinfo->green_offset; b = value >> fbinfo->blue_offset; r &= (1 << fbinfo->red_length) - 1; g &= (1 << fbinfo->green_length) - 1; b &= (1 << fbinfo->blue_length) - 1; r <<= (tmp - fbinfo->red_length); g <<= (tmp - fbinfo->green_length); b <<= (tmp - fbinfo->blue_length); r <<= 16; g <<= 8; ret = r|g|b; return ret; } else { ret = value & 0xFFFFFF; return ret; }}intEgui_rgb_to_pixel (EGui_Window * ewindow,unsigned char *dest,unsigned char *rgbbuf,int len){ int bpp,pwidth; int i,rgb; Ecolor color; EGui_FBinfo * fbinfo= ewindow->fbinfo; bpp = fbinfo->p_bpp; pwidth = fbinfo->p_width; if (bpp == 3) { memcpy(dest,rgbbuf,len); return 0; } for (i = 0 ; i<len; i+=3) { rgb = *(int*)(rgbbuf + i); new_color(ewindow,&color,rgb); switch (bpp) { case 1: /* 8 bits */ dest[0] = color.pixel; break; case 2: /* 16 bits */ *(volatile unsigned short *)(dest) = color.pixel & 0xFFFF; break; case 4: /* 32 bits */ *(volatile unsigned int *)(dest) = color.pixel; break; } dest += bpp; } return 0;} intEgui_bgr_to_pixel (EGui_Window * ewindow,unsigned char *dest,unsigned char *bgrbuf,int len){ int bpp,pwidth; int i,bgr; Ecolor color; EGui_FBinfo * fbinfo= ewindow->fbinfo; bpp = fbinfo->p_bpp; pwidth = fbinfo->p_width; for (i = 0 ; i<len; i+=3) { bgr = *(int*)(bgrbuf + i); new_color_bgr(ewindow,&color,bgr); switch (bpp) { case 1: /* 8 bits */ dest[0] = color.pixel; break; case 2: /* 16 bits */ *(volatile unsigned short *)(dest) = color.pixel & 0xFFFF; break; case 3: *(volatile unsigned short *)(dest) = color.pixel & 0xFFFF; dest[2] = (color.pixel >>16) & 0xFF; break; case 4: /* 32 bits */ *(volatile unsigned int *)(dest) = color.pixel; break; } dest += bpp; } return 0;} /*0,1,2,3,4,5,6,7,8 *r,g,b,r,g,b,r,g,b */int new_color_bgr ( EGui_Window * ewindow, Ecolor *color,int bgr){ color->r = bgr & 0xFF; bgr = (bgr >> 8); color->g = bgr & 0xFF; bgr = (bgr >> 8); color->b = bgr & 0xFF; color->pixel = pixel_from_rgb (ewindow,color); return 0;}/*0,1,2,3,4,5,6,7,8 *b,g,r,b,g,r,b,g,r */int new_color ( EGui_Window * ewindow, Ecolor *color,int rgb){ color->b = rgb & 0xFF; rgb = (rgb >> 8); color->g = rgb & 0xFF; rgb = (rgb >> 8); color->r = rgb & 0xFF; color->pixel = pixel_from_rgb (ewindow,color); return 0;}int color_from_rgb ( EGui_Window * ewindow, Ecolor *color){ color->pixel = pixel_from_rgb (ewindow,color); return 0;}intEgui_rpixel(int x,int y ,int * pixel, EGui_Window * ewindow){ int bpp; int pwidth; unsigned char * address; EGui_FBinfo * fbinfo= ewindow->fbinfo; address = fbinfo->Egui_address; bpp = fbinfo->p_bpp; pwidth = fbinfo->p_width; switch (bpp) { case 1: /* 8 bits */ *pixel = address [x + (pwidth * y)] ; break; case 2: /* 16 bits */ *pixel = *(volatile unsigned short *)(address + (x*bpp) + (pwidth*y)); break; case 3: /* 24 bits */ *pixel = (*(volatile unsigned int *)(address + (x*bpp) + (pwidth*y))) &0xFFFFFF; break; case 4: /* 32 bits */ *pixel = *(volatile unsigned int *)(address + (x*bpp) + (pwidth*y)) ; break; } }intEgui_wpixel(int x,int y , Ecolor * color, EGui_Window * ewindow){ int bpp; int pwidth; int pixel; unsigned char * address; EGui_FBinfo * fbinfo= ewindow->fbinfo; address = fbinfo->Egui_address; bpp = fbinfo->p_bpp; pwidth = fbinfo->p_width; pixel = color->pixel; switch (bpp) { case 1: /* 8 bits */ address [x + (pwidth * y)] = pixel; break; case 2: /* 16 bits */ *(volatile unsigned short *)(address + (x*bpp) + (pwidth*y)) = pixel & 0xFFFF; break; case 3: /* 24 bits */ *(volatile unsigned short *)(address + (x*bpp) + (pwidth*y)) = pixel & 0xFFFF; address [(x*bpp) + (pwidth*y) +2] = (pixel >>16) & 0xFF; break; case 4: /* 32 bits */ *(volatile unsigned int *)(address + (x*bpp) + (pwidth*y)) = pixel; break; } }intEgui_wpoint(int x,int y, Ecolor * color, EGui_Window * ewindow){ Egui_wpixel (x,y,color,ewindow); return 0;}int Egui_rpoint(int x,int y,int * rgb, EGui_Window * ewindow){ int pixel; EGui_FBinfo * fbinfo= ewindow->fbinfo; Egui_rpixel (x,y,&pixel,ewindow); *rgb = rgb_from_pixel (ewindow,pixel); return 0;}int Egui_writebuf (int x,int y,int width,int height, int buffer_width, unsigned char *buffer, EGui_Window *ewindow){ int i; int bpp; int pwidth; unsigned char * address; EGui_FBinfo * fbinfo= ewindow->fbinfo;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -