在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

矢量字庫的用途及在VxWorks5.5平臺如何實現矢量字體顯示

電子設計 ? 作者:電子設計 ? 2018-11-02 08:15 ? 次閱讀

1 VxWorks5.5點陣字庫的局限性

VxWorks5.5 是美國風河公司開發的嵌入式操作系統,圖形系統采用WindML3.0,支持點陣字顯示,不支持矢量字體顯示。點陣字采用內存模式加載,使用前需要將字體庫先加載到內存,再通過WindML 圖形接口實現點陣字顯示。點陣字庫采用。c 文件方式儲存信息,每個字信息都包含在一個數據結構中,其中包含了字體的所有點信息,字體顯示時只要根據字的寬高將點信息直接送入顯存顯示。這種方式的字體實現簡單、顯示速度快,但是一個字體文件只包含一種字體、一個大小的信息,使用具有一定的局限性。

隨著嵌入式軟件的不斷發展,在設計象嵌入式瀏覽器這樣的人機界面的軟件時,發現點陣字庫已經遠遠不能滿足設計要求,嵌入式瀏覽器對字體的需求是根據網頁內容來決定的,在網頁上任何類型,任何大小的字體都可能出現,點陣字庫要將所有字體類型,每種字體的所有大小都包括是不可能的,這種局限性大大降低了瀏覽器的顯示效果。TrueType 字庫引入到VxWorks5.5 系統下,有效的解決了字體的問題,所有Windows 下的TrueType 字庫都可以在VxWorks5.5 系統直接使用,資源非常豐富,能滿足嵌入式系統對字庫的新需求。

2 TrueType字庫原理及FreeType字體引擎

TrueType 是Apple 公司和Microsoft 公司合作開發的頁面描述語言(簡稱TTF),采用了直線和二次貝賽爾曲線來描述字符的輪廓,結合了光柵技術和矢量技術的優點,克服了以往所有點陣字體、矢量字體和向量輪廓字體的缺點,字體可以任意放大、縮小、旋轉和變形而不會影響輸出質量,提供了真正的設備無關性,二次貝賽爾曲線既能保證輪廓曲線的光滑性,又有利于提高字形還原的速度。如下圖1 所示。

矢量字庫的用途及在VxWorks5.5平臺如何實現矢量字體顯示

圖1 TrueType 字體輪廓圖

FreeType 是一個完全免費的、高品質的可移植的字體引擎,它提供同一的接口訪問多種字體格式,包括TrueType,openType,CID,CFF 等。支持單色位圖,反走樣位圖的渲染,FreeType 庫是高度模塊化的程序庫,它使用ANSI C 開發,但采用面向對象的思想,FreeType 用戶可以靈活地對它進行裁剪。

3 VxWorks5.5下矢量字庫的實現

VxWorks5.5 下矢量字庫采用開放源代碼的Freetype 庫和Windows 下的TrueType 字庫結合實現,通過WindML 圖形系統將矢量字應用到VxWorks5.5系統中。矢量字使用前先初始化WindML 圖形系統,再初始化矢量字庫,并將矢量字庫的接口函數掛接到圖形系統下,在應用矢量字庫時只需調用WindML 接口函數,調用方式和點陣字庫一致,實現了與WindML的無縫掛接。TrueType 字庫根據加載方式不同分為動態加載和靜態加載兩種方式,動態加載方式是將TrueType 字庫拷貝到目標機硬盤,根據應用程序的設計要求在程序運行時動態加載字庫;靜態加載方式是將TrueType 字庫在系統啟動時便加載到目標機內存,應用程序可以直接調用字庫信息。動態加載方式優點在于節省內存和加載靈活,缺點在于不同字體切換時消耗的時間長,不適合需字體的頻繁切換的應用程序;靜態加載方式優點在于不同字體切換時消耗的時間短,適合需字體的頻繁切換的應用程序,缺點在于內存消耗大,加載不靈活。

3.1 矢量字體的初始化

矢量字庫的初始化主要有矢量字體設備創建和矢量字體設備注冊兩部分組成。先創建矢量字體設備,如果創建成功則將矢量字體設備注冊到系統中,如果創建不成功則退出程序。

矢量字體設備創建函數UGL_FONT_DRIVER*uglFT2FontDriverCreate(UGL_UGI_DRIVER*pDriver,UGL_FT2_FONT_DRV_CFG *pFT2FontConfig),參數pDriver 為圖形系統設備號,取值graphicsDevID 為WindML 初始化時創建的圖形系統設備號;參數pFT2FontConfig 為字體配置結構,根據字體加載的方式不同參數也不同,具體見3.4 章節;返回值ft_fontDevID為矢量字體設備號。

設備注冊函數UGL_STATE uglRegistryAdd(UGL_UINT32 type, UGL_UINT32 data, UGL_UINT32id, char *name),參數type 為矢量字體設備類型,需定義一個新設備類型UGL_FONT_ENGINE_FTTYPE,取值為13;參數data 為圖形系統設備ID,取值(UGL_UINT32)graphicsDevID;參數id 為矢量字體設備號,取值(UGL_UINT32) ft_fontDevID;參數name取值0.

3.2 字體單雙字節編碼轉換

字符編碼根據長度分為單字節和雙字節兩種編碼方式,單字節編碼包括英文字母、數字和特殊字符等,雙字節編碼包括漢字和自定義字符等。

WindML 字體顯示分雙字節顯示和單字節顯示兩種方式,雙字節顯示是兩個字節作為字體編碼對字庫進行查詢,找到字符位圖并顯示;單字節顯示是單個字節作為字體編碼對字庫進行查詢,找到字符位圖并顯示。當英文字符顯示時,可以使用單字節顯示或雙字節顯示,當中文字符顯示或中英文混合字符顯示時必須使用雙字節顯示。

VxWorks 下字體采用GB2312 編碼,中文字符編碼的每個字節都大于0x80,英文字符編碼都小于0x80,在進行雙字節顯示時,需要將單字節字符轉換成雙字節字符。在字符轉換時,先獲取整個字符串長度,再判斷每個字節是否大于0x80,如果小于0x80,則將單字節擴展成雙字節;如果大于0x80,則將這個字節與后個字節組合成一個雙字節;計算雙字節數并返回,如上圖2 所示。

矢量字庫的用途及在VxWorks5.5平臺如何實現矢量字體顯示

圖2 單字節字符轉換成雙字節字符。

3.3 字體編碼轉換

VxWorks5.5 下漢字采用GB2312 編碼, 而FreeType 在處理漢字時只能識別Unicode 編碼,在處理漢字前需要將GB2312 編碼先轉換成Unicode 編碼,GB2312 與Unicode 的編碼轉換表采用二維數組保存數據,共有7000 多組對應項,如果采用遍歷數組的方式來進行編碼轉換,那么平均每個漢字編碼轉換需要做3000 多次的編碼比較,這非常影響漢字的處理速度。

為了提高編碼轉換的處理速度,編碼轉換時采用折半查找方式來實現,使用折半查找需要先將GB2312編碼從小到大排列,每個GB2312 編碼對應一個Unicode 編碼。在使用折半查找時,先取first=0 end=數組長度,然后(first+end)/2 得到一個中間編號,再通過中間編號獲取相應的GB2312 編碼和顯示漢字編碼比較大小,如果中間值大,則將first=0 end=中間編碼組合再進行折半查找;如果中間值小,則將first=中間編碼 end=數組長度 組合再進行折半查找;如果相等,則將GB2312 編碼對應的Unicode 編碼提交程序處理。

使用折半查找一個漢字最多只需查找13 次,大大提高了漢字Unicode 編碼的查找速度,加速了漢字顯示。

3.4 字庫加載

字體庫加載方式分動態和靜態兩種,兩者之間互有優缺點,可根據用戶的不同需求自主選擇加載方式。

3.4.1 字庫動態加載

字庫動態加載方式是將windows 下的TrueType 字體庫文件(*.ttf,*.ttc)拷貝到目標機目錄下,根據用戶需求在程序執行過程中動態加載字庫。動態加載的實現方法:先聲明兩個結構變量。

1) UGL_FT2_FONT_DRV_CFG ft_font_cfg;

2) UGL_FT2_FONT_PATH_DESC FontPathDesc;

接著設置FontPathDesc 信息, FontPathDesc.PFontSearchPath="/ata0a/ttf/"; FontPathDesc.filter="*.ttf";pFontSearchPath 為字體文件搜索路徑,filter 為文件過濾器。再設置ft_font_cfg 信息,ft_font_cfg.numFontPathDesc=1;ft_font_cfg.pFontPathDesc=&FontPathDesc;ft_font_cfg.defaultCharset=FT_ENCODING_UNICODE;numFontPathDesc 為字體搜索路徑的個數,pFontPathDesc 為搜索路徑,defaultCharset 為設置矢量字體的編碼模式。最后按照3.1 章節對矢量字庫進行初始化。

3.4.2 字庫靜態加載

字體庫靜態加載方式是將windows 下的TrueType字體庫文件(*.ttf,*.ttc)編譯生成一個。o 文件,并在應用程序執行前先加載到內存。靜態加載的實現方法:

在編譯生成。o 字庫文件前, 先確定需要加載的TrueType 字體庫文件,例如需要將f:/font/目錄下的simsun.ttc,simkai.ttf 文件編譯生成一個。o 文件,先創建一個udft2cfg.s 文件,將需要編譯的字庫信息填入文件,再使用編譯命令ccpentium -mtune=pentium –march=pentium -O2 -nostdlib -fno-builtin -fno-defer -pop-DCPU=PENTIUM -DTOOL_FAMILY=gnu -D_WRS_KERNEL-DVXWORKS -xassembler-with-cpp -g -c udft2cfg.o udft2cfg.s 編譯字體文件,生成udft2cfg.o 文件。

靜態加載方式在矢量字體初始化時所用的字體結構信息與動態加載有一些區別,靜態加載所用字體信息已經明確,在初始化時需要將字體信息在結構中描述清楚,結構UGL_FT2_FONT_MEMBUF_DESC 描述字體名稱、起始地址,終止地址,并掛接到結構UGL_FT2_FONT_DRV_CFG 下,最后按照3.1 章節對矢量字體進行初始化。

3.5 矢量字體的粗、斜體實現

矢量字體顯示方式包括正體、粗體、斜體、和粗斜體四種方式,FreeType 字體引擎已經實現了對各種顯示方式的支持,但要在VxWorks5.5 上支持粗、斜體,需要修改udft2fnt.c 和uglfont2.c 的部分代碼。udft2fnt.c修改代碼如下:

1) 在UGL_FT2_FONT 結構中增加兩個結構變量,UGL_SIZE weightsize; UGL_SIZE italicsize;

2) 在uglFT2FontCreate 函數中,去除三個條件pFontDef->weight >=pFT2FontDesc->header.weight.min&& pFontDef->weight <= pFT2FontDesc-> header.weight.max && pFontDef->italic == pFT2FontDesc->header. Italic;增加字體結構變量weightsize,italicsize的賦值,pFT2Font->weightsize = pFontDef->weight;pFT2Font->italicsize=pFontDef->italic;

3) 在uglFT2FontInfo 函數中,增加粗體、斜體信息的設置和獲取代碼,

case UGL_FONT_WEIGHT_SET: pFT2Font->weightsize = *((UGL_SIZE *)pInfo);break;

case UGL_FONT_WEIGHT_GET: (*(UGL_SIZE*)pInfo) = pFT2Font->weightsize;

status = UGL_STATUS_OK;break;

case UGL_FONT_SLANT_ANGLE_SET: pFT2

Font->italicsize = *((UGL_SIZE *)pInfo);break;

case UGL_FONT_ SLANT_ANGLE _GET:(*(UGL_SIZE *)pInfo) = pFT2Font->italicsize;

status = UGL_STATUS_OK;break;

4) 在ft2DrawStringImageCache 函數中,增加矢量字體在斜體時的矩陣值;增加矢量字體在粗、斜體時字體位圖索引的獲取。因為矢量字體在粗、斜體時矩陣值和位圖索引號的獲取和正體有些差異,所以在處理時需和正體分開處理。

5) 在ft2DrawStringSmallBitmaps 函數中,增加矢量字體在斜體時的矩陣值;因為矢量字體在粗、斜體時使用ft2GetGlyphIndex 函數不能正確獲取位圖索引,修改為FT_Get_Char_Index 來獲取位圖索引;增加在粗、斜體時的矢量字體位圖的處理。

uglfont2.c 修改代碼如下:

修改uglConstructFontDef 函數,增加斜體信息賦值,pFontDefinition->italic = pFontDescriptor-> italic.

去除語句pFontDefinition->weight = (pListArray[matchIndex].fontDesc.weight.min + pListArray[matchIndex].fontDesc.weight.max)/2;,使用語句pFontDefinition->weight = (pFontDescriptor-> weight.min +pFontDescriptor->weight.max)/2;替換。

4 結論

矢量字庫已應用于嵌入式瀏覽器、嵌入式閱讀器等多個軟件開發項目,實際工程應用表明,矢量字體的切換速度、顯示速度都能滿足應用要求,并且字體大小的無級縮放、粗斜體顯示、以及旋轉顯示等效果能使人機界面更加友好,使用更加便捷。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5087

    文章

    19145

    瀏覽量

    306121
  • 人機界面
    +關注

    關注

    5

    文章

    528

    瀏覽量

    44168
  • 瀏覽器
    +關注

    關注

    1

    文章

    1032

    瀏覽量

    35407
收藏 人收藏

    評論

    相關推薦

    專業提供適用于MTK平臺矢量引擎、矢量字庫、輸入法(支持多國語言)

     專業提供以下產品:1、適用于MTK平臺矢量引擎及多款矢量字庫2、適用于MTK平臺的平滑點陣字庫3、適用于各種手機
    發表于 06-22 10:22

    專業提供適用于MTK平臺矢量引擎、矢量字庫、輸入法(支持多國語言)

    專業提供適用于MTK平臺矢量引擎、矢量字庫、輸入法(支持多國語言)專業提供以下產品:1、適用于MTK平臺矢量引擎及多款
    發表于 07-22 10:28

    專業提供適用于MTK平臺矢量引擎、矢量字庫、輸入法(支持多國語言)

    專業提供適用于MTK平臺矢量引擎、矢量字庫、輸入法(支持多國語言)專業提供以下產品:1、適用于MTK平臺矢量引擎及多款
    發表于 07-22 10:28

    專業提供適用于MTK平臺矢量引擎、矢量字庫、輸入法(支持多國語言)

    專業提供適用于MTK平臺矢量引擎、矢量字庫、輸入法(支持多國語言)專業提供以下產品:1、適用于MTK平臺矢量引擎及多款
    發表于 07-29 15:15

    專業提供適用于MTK平臺矢量引擎、矢量字庫、輸入法(支持多國語言)

    專業提供適用于MTK平臺矢量引擎、矢量字庫、輸入法(支持多國語言)專業提供以下產品:1、適用于MTK平臺矢量引擎及多款
    發表于 08-05 10:45

    專業提供適用于MTK平臺矢量引擎、矢量字庫、輸入法(支持多國語言)

    專業提供適用于MTK平臺矢量引擎、矢量字庫、輸入法(支持多國語言)專業提供以下產品:1、適用于MTK平臺矢量引擎及多款
    發表于 08-07 10:08

    專業提供適用于MTK平臺矢量引擎、矢量字庫、輸入法(支持多國語言)

    專業提供適用于MTK平臺矢量引擎、矢量字庫、輸入法(支持多國語言)專業提供以下產品:1、適用于MTK平臺矢量引擎及多款
    發表于 08-07 10:08

    專業提供適用于MTK平臺矢量引擎、矢量字庫、輸入法(支持多國語言)

    專業提供適用于MTK平臺矢量引擎、矢量字庫、輸入法(支持多國語言)專業提供以下產品:1、適用于MTK平臺矢量引擎及多款
    發表于 08-07 10:09

    專業提供適用于MTK平臺矢量引擎、矢量字庫、輸入法(支持多國語言)

    專業提供適用于MTK平臺矢量引擎、矢量字庫、輸入法(支持多國語言)專業提供以下產品:1、適用于MTK平臺矢量引擎及多款
    發表于 08-12 09:53

    專業提供適用于MTK平臺矢量引擎、矢量字庫、輸入法(支持多國語言)

    專業提供適用于MTK平臺矢量引擎、矢量字庫、輸入法(支持多國語言)專業提供以下產品:1、適用于MTK平臺矢量引擎及多款
    發表于 08-25 10:56

    專業提供適用于MTK平臺矢量引擎、矢量字庫、輸入法(支持多國語言)

    專業提供適用于MTK平臺矢量引擎、矢量字庫、輸入法(支持多國語言)專業提供以下產品:1、適用于MTK平臺矢量引擎及多款
    發表于 03-29 14:23

    矢量字庫移植測試的相關資料推薦

    單片機移植矢量字庫,并測試運行速度
    發表于 01-10 07:15

    矢量字庫嵌入式機頂盒中的應用

    介紹嵌入式數字衛星接收機的字符顯示原理。提出一種提取Windows矢量字庫信息以及將其轉換為點陣字庫格式的方法。給出主要模塊的流程圖和VC程序實現
    發表于 05-16 14:47 ?18次下載

    英創信息技術EM9280矢量字庫應用簡介

    1、簡述 使用矢量字庫的好處是可靈活選擇顯示字體以及字體大小,便于客戶進行用戶界面的設計。一般來說一個矢量字庫文件包含一組字形,每個字形可
    的頭像 發表于 01-16 09:41 ?1363次閱讀
    英創信息技術EM9280<b class='flag-5'>矢量字庫</b>應用簡介

    單片機巧用Windows矢量字庫

    1 引 言  單片機控制的LED、LCD顯示屏均涉及到各種字體的漢字顯示。建立單片機漢字字庫的傳統方法有使用硬件字庫或者使用UCDOS的點陣
    發表于 11-11 15:06 ?6次下載
    單片機巧用Windows<b class='flag-5'>矢量字庫</b>
    主站蜘蛛池模板: 国模精品一区二区| 成人网在线视频| 色多多在线观看高清免费| 五月六月伊人狠狠丁香网| 天天操天天干天天干| 夜夜操伊人| 毛片高清一区二区三区| 六月婷婷视频| 国产视频一二三| ts 人妖 另类 在线| 午夜影皖普通区| 美女操网站| 99国产国人青青视频在线观看| 都市激情亚洲综合| 美女一级a毛片免费观看| 免费人成网址在线观看国内| 三级完整在线观看高清视频| 热久久这里只有精品| 久久国产高清视频| 成 人 免费 网站| 天天射天天怕| 成年女人免费看一级人体片| 亚洲一区免费在线观看| 亚洲人成www在线播放| 日韩1页| 激情福利网| 国产综合久久久久影院| a级黄色毛片三个搞一| 奇米影视婷婷| 加勒比啪啪| 欧美五月| 免费视频在线观看1| 久久免费精品高清麻豆| 天堂在线国产| 天堂免费视频| 毛茸茸成熟妇女亚洲人| 888米奇色狠狠俺去啦| 立即播放免费毛片一级| 中文字幕在线一区| 无人区理论片手机看片| 久久一级毛片|