libfbx顯示漢字

三、關於libfbx

http://yfy001.myetang.com

libfbx是linux framebuffer 的一個擴充庫,使用它,你可以很方便的開發framebuffer的應用程序。

下面這個簡單的程序就可以產生一個有邊框的窗口。
代碼:

/* gui.c -a simple box * * By cloudfly<[email protected]> * */
#include <libfbx/libfbx.h>
#include <libfbx/libfbx-gui.h>
#include <stdlib.h>
#include <unistd.h>
#include <config.h>

int main()
{
    int x, y;
    int dx, dy;
    int frame = 0;
    fb_init();//初始化
    fb_handle_signals();
    x = fb_screen->width;//寬度
    y = fb_screen->height;//高度
    fb_draw_textbox(0,0,x,y,0,255,0,255,0,0,fb_screen);//畫方框
    return 0;
}

gcc -o gui gui.c -lfbx -lfbx-gui -ldl

完成編譯。


同時,libfbx還支持圖像,目前支持的圖像有png和ppm.
下面這個簡單的程序是畫一個移動的圖像
代碼:

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

#include <libfbx/libfbx.h>
#include <math.h>
#include <config.h>

int main()
{
    float speed = 0.125;
    float radians = 0.0;
    float x = 160.0;
    float y = 120.0;
    fb_surface *object;

    fb_init();
    fb_handle_signals();
    object = fb_load_ppm("smiley.ppm");
    fb_cls();

    for(radians = 0.0; radians < (PI * 64.0); radians += (PI / 512.0))
    {
        fb_move_object(speed, radians, &x, &y);
        fb_draw_image(object, fb_screen, (int)x, (int)y);
        speed = 0.1 * (sin(0.125 * radians) + 1.25);
    }
    fb_cleanup();
    return 0;
}

gcc -o fbxmove fbxmove.c -lfbx -ldl

完成編譯。

你可以發現,使用libfbx,你可以非常簡單快捷的開發framebuffer應用程序。

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
程序例:
代碼:

/* gbfbx.c -a simple chinese show
*
* By cloudfly<[email protected]>
*
*/

#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

完成編譯
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章