|
最近写一个测试字库的程序,接触到了文字显示的一些皮毛,就想在linux
下把中文显示出来,google了好多相关的文章,最后选择了采用libfbx
的方式,但是没有成功,我把我的过程记录下来,请各位兄弟帮忙看看哪里出了问题
实验环境:
WMware+FC4
实验过程:
1. 在/etc/grub.conf中的
kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/ vga=0x301 #rhgb
quiet vga=0x314 ---打开framebuffer 功能,reboot后启动画面有小企鹅出现,表明
framebuffer已经成功打开
2. 从网络上下载 libfbx-0.2.0,不记得是从哪里下载了,反正google一下libfbx-0.2.
0 就可以找到下载的地方了。
3. 编译 libfbx-0.2.0,a. configure b.fixed some error of libfbx-0.2.0
source code c.make clean;make;make install install libfbx library to /usr/
local/lib/
4. 修正 /etc/ld.so.conf,添加 /usr/local/lib
5. 编译代码
/* gbfbx.c -a simple chinese show
*
* By cloudfly<yfy001@etang.com>
*
*/
#include <libfbx/libfbx.h>
#include <libfbx/libfbx-gui.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#define row 2 //纵坐标放大倍数
#define col 3 //横坐标放大倍数
int main()
{
int x,y,i;
char *s="中文汉子显示";
FILE *fp;
char buffer[32];
unsigned char qh,wh;
unsigned long offset;
fb_init(); //图形屏幕初始化
fb_handle_signals();
x=fb_screen->width-300; //设定 x坐标
y=fb_screen->height-300; //y坐标
int n,j,k,m;
if((fp=fopen("St.cfg","rb"))==NULL)//中文字库St.cfg可以从我的主页下载。
ucdos也有
{
fb_cleanup();
return 0;
}
while(*s)
{
qh=*(s)-0xa0;
wh=*(s+1)-0xa0;
offset=(94*(qh-1)+(wh-1))*32L;//计算该汉字在字库中偏移量
fseek(fp,offset,SEEK_SET);
fread(buffer,32,1,fp); //取出汉字32字节的点阵字模存入buffer
中(一个汉字)
for(i=0;i<16;i++)
for(n=0;n<row;n++)
for( j=0;j<2;j++)
for( k=0;k<8;k++)
for(m=0;m<row;m++)
if(((buffer[i*2+j]>>(7-k))&0x1)!=NULL)
fb_putpixel(x+8*j*col+k*col+m,y+i*row+n,0,255,0,fb_screen);
//将32位字节的点阵按位在屏幕上画出来
s+=2; //因为一个汉字内码占用两个字节,所以s必须加2
x+=40;
}
return 1;
}
gcc -o gbfbx gbfbx.c -lfbx -ldl
6. 执行代码
[root@my_linux test]#./test
7. 提示ioctl KDGETMODE: Invalid argument
8. 在libfbx-0.2.0 源代码中的fb_init.c中的if (ioctl(tty, KDGETMODE, &kd_mode)
< 0)
前面和后面打印信息
9. 再make clean;make;make install libfbx-0.2.0
10. 在编译测试代码
11. 再执行编译结果
[root@my_linux test]#./test
12. 还是提示ioctl KDGETMODE: Invalid argument,没有提示我自己后面添加的信息
不知道哪里出错了。各位兄弟请帮忙看看。多谢 |
|