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

📄 libegui.c

📁 EGui是一个开源的图形系统软件,类似于QT/Embedded、GTK-FB、MicroWindow。目标是嵌入式平台整合解 决方案。基于Linux Framebuffer 设备驱动上实现。有完
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************** * 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 + -