LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3221|回复: 4

[转:飞扬主页]使用libfbx开发framebuffer应用程序

[复制链接]
发表于 2004-7-7 19:25:21 | 显示全部楼层 |阅读模式
FrameBuffer 是出现在 2.2.xx 内核当中的一种驱动程序接口。这种接口将显示设备抽象为帧缓冲区。用户可以将它看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。该驱动程序的设备文件一般是 /dev/fb0、/dev/fb1 等等。比如,假设现在的显示模式是 1024x768-8 位色,则可以通过如下的命令清空屏幕:

$ dd if=/dev/zero of=/dev/fb0 bs=1024 count=768

在应用程序中,一般通过将 FrameBuffer 设备映射到进程地址空间的方式使用,比如下面的程序就打开 /dev/fb0 设备,并通过 mmap 系统调用进行地址映射,随后用 memset 将屏幕清空(这里假设显示模式是 1024x768-8 位色模式,线性内存模式):

  1. int fb;
  2. unsigned char* fb_mem;

  3. fb = open (“/dev/fb0”, O_RDWR);
  4. fb_mem = mmap (NULL, 1024*768, PROT_READ|PROT_WRITE,MAP_SHARED,fb,0);

  5. memset (fb_mem, 0, 1024*768);
复制代码

FrameBuffer 设备还提供了若干 ioctl 命令,通过这些命令,可以获得显示设备的一些固定信息(比如显示内存大小)、与显示模式相关的可变信息(比如分辨率、象素结构、每扫描线的字节宽度),以及伪彩色模式下的调色板信息等等。

说到这里,读者可能已经意识到 FrameBuffer 只是一个提供显示内存和显示芯片寄存器从物理内存映射到进程地址空间中的设备。所以,对于应用程序而言,如果希望在 FrameBuffer 之上进行图形编程,还需要完成其他许多工作。举个例子来讲,FrameBuffer 就像一张画布,使用什么样子的画笔,如何画画,还需要你自己动手完成。这对于大多数人来说,并不是一件简单的事。

libfbx是linux framebuffer 的一个扩充库,使用它,你可以很方便的开发framebuffer的应用程序。

下面这个简单的程序就可以产生一个有边框的窗口。

  1. /* gui.c -a simple box
  2. *
  3. * By cloudfly<yfy001@etang.com>
  4. *
  5. */
  6. #include <libfbx/libfbx.h>
  7. #include <libfbx/libfbx-gui.h>
  8. #include <stdlib.h>
  9. #include <unistd.h>
  10. #include <config.h>

  11. int main()
  12. {
  13. int x, y;
  14. int dx, dy;
  15. int frame = 0;
  16. fb_init();//初始化
  17. fb_handle_signals();

  18. x = fb_screen->width;//宽度
  19. y = fb_screen->height;//高度

  20. fb_draw_textbox(0,0,x,y,0,255,0,255,0,0,fb_screen);//画方框

  21. return 0;
  22. }

  23. gcc -o gui gui.c -lfbx -lfbx-gui -ldl
复制代码

完成编译。


同时,libfbx还支持图像,目前支持的图像有png和ppm.
下面这个简单的程序是画一个移动的图像

  1. /* fbxmove.c - Tests the fb_move_object and fb_draw_image functions.
  2. *
  3. * By Michael Bourgeous
  4. *
  5. * $Id: fbxmove.c,v 1.10 2001/02/25 20:40:07 lethal Exp $
  6. */

  7. #include <libfbx/libfbx.h>
  8. #include <math.h>
  9. #include <config.h>

  10. int main()
  11. {
  12. float speed = 0.125;
  13. float radians = 0.0;
  14. float x = 160.0;
  15. float y = 120.0;
  16. fb_surface *object;

  17. fb_init();
  18. fb_handle_signals();

  19. object = fb_load_ppm("smiley.ppm");

  20. fb_cls();

  21. for(radians = 0.0; radians < (PI * 64.0); radians += (PI / 512.0))
  22. {
  23. fb_move_object(speed, radians, &x, &y);
  24. fb_draw_image(object, fb_screen, (int)x, (int)y);
  25. speed = 0.1 * (sin(0.125 * radians) + 1.25);
  26. }

  27. fb_cleanup();
  28. return 0;
  29. }

  30. gcc -o fbxmove fbxmove.c -lfbx -ldl
复制代码

完成编译。

你可以发现,使用libfbx,你可以非常简单快捷的开发framebuffer应用程序。

下载安装:
你可以从 http://sourceforge.net/ 下载,你也可以从我的主页下 载 http://yfy001.myetang.com  安装可参照相关的说明。
 楼主| 发表于 2004-7-7 19:27:41 | 显示全部楼层

使用libfbx开发显示汉字的framebuffer应用程序

云飞扬 http://yfy001.myetang.com

FrameBuffer 就像一张画布,使用什么样子的画笔,如何画画,还需要你自己动手完成。
许多控制台C程序设计中,要用到汉字进行提示或人机交互,而在控制台下显示汉子,曾经是某些中文linux厂商的秘密哦。如何编制不使用外挂中文平台就能显示汉字的C程序呢?主要的原理就是将汉字画到屏幕上,现在控制台下的中文环境zhcon也是使用了这个原理。

下面的方法可以帮你在西文环境下显示汉字。这种方法是调用中文汉字库进行汉字显示。国家标准规定:汉字库分94个区,每个区有94个汉字(以位作区别),每个汉字在汉字库中有确定的区和位编号,这就是汉字的区位码。每个汉字在库中是以点阵字模形式存储的,一般采用16×16点阵(32字节)、24×24点阵(72字节),每个点用一个二进制位(0或1)表示,对应在屏幕上显示出来,就是相应的汉字。
  由于在中文环境下,输入的是汉字的内码,我们必须将之转换成区位码,算出偏移量,从字库中找到对应的汉字,将其字模显示即可。
  内码转换成区位码方法如下:
   qh=c1-0xa0 wh=c2-0xa0
  其区位码就是:
  qw=qh*0xff+wh
  该汉字在字库中离起点的位置是:
   offset=(94*(qh-1)+(wh-1))*32L
程序例:

  1. /* gbfbx.c -a simple chinese show
  2. *
  3. * By cloudfly<yfy001@etang.com>
  4. *
  5. */

  6. #include <libfbx/libfbx.h>
  7. #include <libfbx/libfbx-gui.h>
  8. #include <stdlib.h>
  9. #include <unistd.h>
  10. #include <stdio.h>
  11. #define row 2 //纵坐标放大倍数
  12. #define col 3 //横坐标放大倍数
  13. int main()
  14. {
  15. int x,y,i;
  16. char *s="中文汉子显示";
  17. FILE *fp;
  18. char buffer[32];
  19. unsigned char qh,wh;
  20. unsigned long offset;

  21. fb_init(); //图形屏幕初始化
  22. fb_handle_signals();
  23. x=fb_screen->width-300; //设定 x坐标
  24. y=fb_screen->height-300; //y坐标

  25. int n,j,k,m;

  26. if((fp=fopen("St.cfg","rb"))==NULL)//中文字库St.cfg可以从我的主页下载。ucdos也有
  27. {
  28. fb_cleanup();
  29. return 0;
  30. }

  31. while(*s)
  32. {
  33. qh=*(s)-0xa0;
  34. wh=*(s+1)-0xa0;
  35. offset=(94*(qh-1)+(wh-1))*32L;//计算该汉字在字库中偏移量
  36. fseek(fp,offset,SEEK_SET);
  37. fread(buffer,32,1,fp); //取出汉字32字节的点阵字模存入buffer中(一个汉字)
  38. for(i=0;i<16;i++)
  39. for(n=0;n<row;n++)
  40. for( j=0;j<2;j++)
  41. for( k=0;k<8;k++)
  42. for(m=0;m<row;m++)

  43. if(((buffer[i*2+j]>>(7-k))&0x1)!=NULL)
  44. fb_putpixel(x+8*j*col+k*col+m,y+i*row+n,0,255,0,fb_screen);
  45. //将32位字节的点阵按位在屏幕上画出来
  46. s+=2;//因为一个汉字内码占用两个字节,所以s必须加2
  47. x+=40;
  48. }
  49. return 1;
  50. }

  51. gcc -o gbfbx gbfbx.c -lfbx -ldl
复制代码

完成编译。

程序中使用的中文字库St.cfg可以从我的主页下载。
发表于 2004-7-8 08:58:36 | 显示全部楼层
好帖,
顶!
发表于 2004-7-11 23:26:07 | 显示全部楼层
也可以通过SDL来间接使用framebuffer,这样控制台下就可以很方便地玩游戏看影碟了。
发表于 2008-5-23 19:26:16 | 显示全部楼层
上面的程序编译都没问题,但是运行后都出错,而且都是一个错误
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表