激情综合丁香-激情综合六月-激情综合婷婷亚洲图片-激情综合图区-激情综合网五月

EM9280(嵌入式Linux版)矢量字庫應用簡介

 2013-6-5              

1、簡述

        使用矢量字庫的好處是可靈活選擇顯示的字體以及字體大小,便于客戶進行用戶界面的設計。一般來說一個矢量字庫文件包含一組字形,每個字形可以存成位圖、向量表示或其他結構(可縮放的格式使用一種數(shù)學表示和控制數(shù)據(jù)/程序的結合方式),字體文件包含一個或多個表,叫做字符圖,可用來為某種字符編碼將字符碼轉換成字形索引,例如ASCII、Unicode、Big5等等。因此如何從字體文件中獲取到字符碼所對應的位圖數(shù)據(jù)才是關鍵。

 

        FreeType 是一個開源的獲取字模數(shù)據(jù)的軟件包,其函數(shù)庫可實現(xiàn)讓客戶應用程序方便的訪問字體文件,并方便地提取某個字符的字形數(shù)據(jù)(bitmap),從而使得應用程序可按照bitmap格式將字形顯示出來。所以要在EM9280上實現(xiàn)矢量字庫的應用,必須首先移植FreeType。

 

2、FreeType移植

        FreeType的移植過程:

        1、下載源碼:git clone git://git.sv.nongnu.org/freetype/freetype2.git

        2、轉入工作目錄:cd freetype2

        3、生成configure:./autogen.sh

        4、配置,生成Makefile

              ./configure --host=arm-none-linux-gnueabi(平臺) --prefix=/(安裝目錄)

        5、編譯 make

        6、安裝 make install

 

        編譯成功后將生成的libfreetype.so.2.6.10等庫文件,這些文件放入到EM9280根文件系統(tǒng)/lib目錄下。為了方便客戶使用,同時我們還放置了兩個字體文件:

        simsun_2_50.ttc (宋體)

        arial_1_08.ttf (Arial)

 

        到此EM9280的環(huán)境下FreeType的移植就完成了。下面將介紹應用程序如何利用FreeType函數(shù)進行字符顯示。

 

3、矢量字庫的應用程序開發(fā)

        調(diào)用FreeType函數(shù)庫進行字符顯示一般是以下幾個步驟:
        1、初始化庫 FT_Init_FreeType( )
        2、通過創(chuàng)建一個新的 face 對象來打開一個字體文件 FT_New_Face( )
        3、以點或者象素的形式選擇一個字符大小 FT_Set_Char_Size( )
        4、裝載一個字形(glyph)圖像,并把它轉換為位圖 FT_Render_Glyph( )
        5、顯示一個簡單的字符 draw_bitmap( )

 

        在進行應用程序開發(fā)時,首先需要將FreeType相關的頭文件添加到編譯工具的相關include目錄下,對應英創(chuàng)公司提供eclipse編譯環(huán)境,即如下圖所示,需要將 FreeType2 include目錄下的ft2build.h 和freetype復制到 PC機的c:\Sourcery G++ Lite \ arm-none-linux-gnueabi\libc\usr\include\目錄下。

 

 

        FreeType的應用需要用到專用的動態(tài)庫libfreetype.so、libz.so兩個文件,所以需要將這兩個文件復制到應用程序工程文件project目錄下,同時在eclipse環(huán)境對此程序編譯時,需要設置相應的編譯屬性。在Project Explorer視窗下,選擇需要設置的工程文件,然后點擊鼠標右鍵,選擇 Properties項,在窗口中選擇C/C++ Build -> Settings -> Tool Settings -> Sourcery G++ C++ Linker -> Libraries,如下圖所示。其中的一個窗口用于指定庫文件的名稱,一個用于指定庫文件的路徑。

 

 

        在英創(chuàng)公司提供的光盤示例程序step1_lcdtest中, 其中l(wèi)cd_graph.h文件圖形操作的API函數(shù),在此基礎之上,我們增加了顯示文本的幾個函數(shù):

 

        功能描述: 初始化FreeType庫,并創(chuàng)建face打開simsun_2_50.ttc字體文件。
        返回值: 0 成功     <0 失敗
        int loadttf( )

 

        功能描述: 設置字體大小。
        輸入?yún)?shù): size 字體大小標號,對應關系:10 -- 五號   14 -- 四號   16 -- 三號   22 -- 二號   26 -- 一號   42 -- 初號

        返回值: 當前字體大小值。
        int setfntsize( int size )

 

        功能描述: 獲取字體大小。
        返回值: 當前字體大小值。
        int getfntsize( )

 

        功能描述: 設置前景色。
        輸入?yún)?shù): color 32位rgb值
        void setcolor( unsigned int color )

 

        功能描述: 設置背景色。
        輸入?yún)?shù): color 32位rgb值
        void setbkcolor( unsigned int color )

 

        功能描述: 顯示字符串到屏幕相應位置。
        輸入?yún)?shù): rect 用于定義字符串顯示位置框:left top right bottom。    textstring 字符串內(nèi)容,由漢字內(nèi)碼和ASCII碼組成 
        返回值: 當前字體大小值。 
        void drawtext( RECT rect, char* textstring )

 

        在調(diào)用drawtext()函數(shù)之前,客戶可調(diào)用setcolor( ) 、setbkcolor( )分別設置字體的顏色以及背景顏色。對于字體顯示來說,目前我們提供的范例程序僅支持單一背景顏色。

 

        以下為FreeType應用實現(xiàn)的部分代碼:

 

        int loadttf( )
        {
                int error;

                error = FT_Init_FreeType( &library );
                if( error )
                { 
                        printf( 'FT_Init_FreeType error:%d\n ', error );
                        return -1;
                }

                error = FT_New_Face( library,'/usr/simsun_2_50.ttc',0,&face_simsun );
                if( error )
                {
                        printf( 'FT_New_Face error:%d\n ', error );
                        return -1; 
                }

                error = FT_Select_Charmap( face_simsun, FT_ENCODING_UNICODE );
                if( error )
                {
                        printf( 'FT_Select_Charmap error:%d\n ', error );
                        return -1;
                }

                return 0; 
        }

 

        void drawtext( RECT rect, char* textstring )
        {
                int i1, len;
                char* u_text; 
                int pen_x, pen_y;
                int error;
                FT_UInt glyph_index;
                FT_ULong ul_char; 
                FT_Bool use_kerning;
                FT_UInt previous;

                pen_x = rect.left;
                pen_y = rect.bottom;

                if( textstring==NULL ) return; 
                i1 = strlen(textstring);

                u_text = new char[2*i1]; 
                /*字符串進行unicode的轉換*/
                len = UCS2.GetUniCode( textstring, u_text, 2*i1 );

                use_kerning = FT_HAS_KERNING( face_simsun );
                previous = 0;

                for( i1=0; i1<LEN; )
                {
                        ul_char = (u_text[i1+1]<<8) | u_text[i1];
                        glyph_index = FT_Get_Char_Index( face_simsun, ul_char );
                        if( use_kerning && previous && glyph_index )
                        {
                                FT_Vector delta;
                                FT_Get_Kerning( face_simsun, previous, glyph_index, FT_KERNING_DEFAULT, &delta );
                                pen_x += delta.x >> 6; 
                        }  
                        error = FT_Load_Glyph( face_simsun, /* handle to face object */
                                glyph_index, /* glyph index */
                                FT_LOAD_DEFAULT); /* load flags, see below */
                        if( error )
                                printf( 'FT_Load_Glyph():%d\n ', error );
                        error = FT_Render_Glyph( face_simsun->glyph, /* glyph slot */
                                FT_RENDER_MODE_LCD);

                        if( error )
                                printf( 'FT_Render_Glyph():%d\n ', error );

                        FT_GlyphSlot slot = face_simsun->glyph; 
                        /*顯示字符的bitmap*/
                        draw_bitmap( &slot->bitmap, pen_x + slot->bitmap_left, pen_y-slot->bitmap_top );
                        pen_x += slot->advance.x >> 6; 
                }

                delete u_text; 
        }

        void setfntsize( int size )
        {
                int error;

                error = FT_Set_Char_Size(
                        face_simsun, /* handle to face object */
                        0, /* char_width in 1/64th of points */
                        size*64, /* char_height in 1/64th of points */
                        129, /* horizontal device resolution */
                        135 ); /* vertical device resolution */ 
                if( error )
                {
                        printf( 'FT_Set_Char_Size error:%d\n ', error );
                        return;
                }
                FontSize = (unsigned int)size;
        }

 

        這里需要解釋下設置字符大小參數(shù)中垂直分辨率以及水平分辨率的定義,這兩個參數(shù)均是指顯示設備的分辨率,單位每英寸(inch)的點數(shù)(dpi),所以對于不同尺寸的LCD屏,其參數(shù)值是不同的。以下為EM9280常接的幾種LCD屏dpi值。

 


名稱型號分辨率dpi分辨率
4.3' TFT彩色LCDLR430480×272128×128
5.6' TFT彩色LCDAT056TN52640×480144×144
7.0' TFT彩色LCDAT070TN83640×480135×129
8.4' TFT彩色LCDG084SN03800×600119×119
10.4' TFT彩色LCDG104SN03800×600119×119


 

        后續(xù)我們提供的光盤資料會更新step1_lcdtest相關代碼,感興趣的客戶可以我們聯(lián)系索取相應的代碼。

        技術支持電話:028-85329360

        技術支持郵箱:support@emtronix.com 或 support@emlinix.com

主站蜘蛛池模板: 天天看片网站| 无需付费大片免费在线观看| 日本限制级在线| 成人三级黄色片| 国内视频自拍在线视频| 国产精品视_精品国产免费| 99久久免费午夜国产精品| 精品亚洲综合在线第一区| 手机看片久久高清国产日韩 | 在线免费观看网址| 久久久久综合中文字幕| 午夜插插| 亚洲国产一区在线观看| 韩国一级毛片a级免观看| 国产网站大全| 久久国产精彩视频| 欧美一区欧美二区| 香蕉视频免费在线观看| 亚洲综合丁香| 2022国产情侣真实露脸在线| 一级黄色片免费的| 天天更新天天久久久更新影院| 风流慈禧一级毛片在线播放| 在线播放国产不卡免费视频| 免费可在线观看黄的视频| 欧美日韩成人午夜免费| 国产一级大片免费看| 国产成人福利美女观看视频| 国产精品亚洲四区在线观看| 高清午夜毛片| 黄色淫片| 黄色录像欧美| 黄色不卡视频| 黄黄视频在线观看| 精子网久久国产精品| 91精品一区二区三区在线| 成人国产在线不卡视频| 丁香六月激情婷婷| free麻豆| 蜜桃视频一区二区在线看| 精品一区视频|