999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

字體文件定制及軟件的設計

2019-09-10 07:22:44閆文奇
現代信息科技 2019年17期

摘 ?要:嵌入式設備上常用的有兩種類型的字體:點陣型字體和TrueType類型字體。點陣字體很難進行縮放,否則會失真,而TrueType文件并不存在這個問題。但因TrueType字體文件較大,并不能直接使用在嵌入式系統中。因此,在使用TrueType字體前須對其進行適當的定制,只選取用到的字符,這樣可以使字體文件的大小減小很多,更適合使用在嵌入式系統上。

關鍵詞:嵌入式設備;字體文件;TrueType;造字程序

中圖分類號:TP311.1 ? ? 文獻標識碼:A 文章編號:2096-4706(2019)17-0005-04

Abstract:Two type of fonts are used most on embedded device,the lattice and the TrueType font. It is almost impossible to resize the lattice or distortion will occur while there’s no the same problem on TrueType font. However,the full size TrueType font are usually too big to be used on embedded device directly. Therefore,TrueType fonts should be customized properly before using them,and only the characters used should be selected,which can reduce the size of font files a lot and make them more suitable for use in embedded systems.

Keywords:embedded device;font file;TrueType;font program

0 ?引 ?言

TrueType字體現今在PC機上的使用已經非常廣泛,然而在嵌入式系統中,字體主要還是以點陣型為主。究其原因主要為嵌入式系統資源有限,而TrueType字體占用資源和空間較多,雖然嵌入式系統的資源和性能較原來已經好了很多,但是TrueType字體動輒幾十兆的大小還是太過龐大。隨著顯示精度的提高,點陣型字體已無法達到顯示要求,TrueType字體取代點陣型字體已是大勢所趨,為了克服TrueType字體文件較大的難題,在使用TrueType字體時必須對其進行裁剪,只選取字體文件中將來會用到的字符重新生成新的字體文件,以減小字體文件的大小[1]。

1 ?TrueType字體簡介

TrueType字體技術是由蘋果和微軟聯合推出的一種新型數字字形描述技術,用數學函數描述字體輪廓外形,含有字形結構、顏色填充、數字描述函數、流程條件控制、柵格處理控制、附加提示控制等指令。其字體外形輪廓采用二次貝塞爾曲線,相對之前PostScript等字體,曲線方程次數降低,但配合其豐富的指令集,在實現輪廓曲線光滑性的前提下,大大提高了解釋器的工作速度。加之其公布字體文件結構,可實現在不同系統間進行移植并方便用戶加入已實現的字符,因此TrueType字體得以作為標準字體,應用如此廣泛。

2 ?TrueType字體分析

2.1 ?TrueType字體結構

TrueType字體文件數據內容由表頭、一系列描述表目錄和描述表組成,并由不同表中的數據組合起來描述字體中的每個字,其結構如圖1所示。

2.2 ?表頭

TTF文件開頭12字節為表頭(offset table),其內容及數據類型如下(其中FIXED類型為帶符號整數小數各16位的32位定點實數):

FIXED ? ? version //文件版本號

USHORT ?numTables //描述表數目

USHORT ?searchRange //快速查找范圍

USHORT ?entrySelector //描述表入口

USHORT ?rangeShift //范圍調整

其中最重要的為numTables,其余項都可以由其計算得到,詳細信息可以參考TrueType說明文件[2]。

2.3 ?描述表目錄

表頭(offset table)之后緊跟著描述表目錄,其個數為numTables個,每個描述表目錄項都占有16個字節,其結構如下:

ULONG ?tag //描述表名稱

ULONG ?checksum //描述表校驗和

ULONG ?offset //描述表偏移

ULONG ?length //描述表字節長度

2.4 ?描述表

TrueType類型字體中包含的描述表最多可達到24個,其中10個必須,14個可選,描述表目錄項按照表名字(tag)的升序排列。本文僅介紹10個必須的表,如下所示,可選表信息可參考TrueType說明文件,且其不會影響字體裁剪。

cmap //字符代碼到文字序號映射表

glyf ? //字符輪廓信息表

head //字體文件頭信息表

hhea //水平度量頭信息表

hmtx //垂直尺寸信息表

loca //文字序號到位置索引信息表

maxp //最大值描述表

name //字體名表

post //PostScript信息

OS/2 //OS/2與Windows度量信息

10個表中與字體裁剪關聯較大的表有cmap、glyf、loca等三個;head、hhex、hmtx、maxp、name等五個表也會有所涉及,下面對cmap、loca、glyf三個表進行簡要介紹。

2.4.1 ?cmap表

cmap表給出了字符由其本身編碼到字體中其序號的映射關系。譬如漢字“文”,其Unicode編碼為0x6587,根據這個編碼值通過cmap表便可以索引到“文”字在字體文件中的序號,進而可以根據字形輪廓繪制出“文”字。cmap表結構如圖2所示。

表頭格式為:

USHORT ?cmap_version//cmap版本號

USHORT ?cmap_tables//cmap子表數

描述表目錄格式為:

USHORT ?Platform_ID

USHORT ?Platform_Encoding

ULONG ? Offset

描述子表有四種格式,分別對應Format0、Format2、Format4、Format6,下面以Format4為例,簡述輪廓信息查找過程。

Format4描述子表格式如下:

USHORT ?format//子表格式,此處為4

USHORT ?length//子表長度(字節計)

USHORT ?version//子表版本

USHORT ?segCountX2//子表分段數*2

USHORT ?searchRange//快速查找范圍

USHORT ?entrySelector//入口值范圍

USHORT ?rangeShift//偏移調整

//每段結束字符代碼

USHORT ?endCount[segCount]

USHORT ?reservedPad//保留對齊,為0

//每段開始字符代碼

USHORT ?startCount[segCount]

//字符輪廓序號調整量

USHORT ?idDelta[segCount]

//每段映射子表所有字符輪廓序號存儲

//位置(在glyphIdArray數組中)相對

//當前位置的偏移量

USHORT ?idRangeOffset[segCount]

//文字輪廓序號數組(變長)

USHORT ?glyphIdArray[]

其根據字符編碼查找字符輪廓索引(index)流程如圖3所示。

2.4.2 ?loca表

loca表記錄了每個文字的輪廓數據信息在glyf表中相對于glyf表初始位置的偏移,其依據cmap表中查詢到的字符索引,由該字符索引確定偏移位置,loca表結構比較簡單(其中char_index為字符輪廓索引):

USHORT offsets[char_index];

整個查詢過程如圖4所示。

2.4.3 ?glyf表

glyf表是TrueType文件中重要的表,其存儲了文字的輪廓描述信息,以及一系列的指令信息。glyf表較為復雜,不再將其表中變量一一說明,具體說明見TrueType文件。這里僅介紹簡單及復雜字符輪廓的讀取過程如圖5所示。

3 ?軟件設計

為達到字體的定制功能,字體定制軟件要能夠讀取某一字體文件的內容,對其進行解析,根據需要對其裁剪,最后保存所需的部分,字體定制軟件結構框圖如圖6所示。

字體定制軟件主要由兩個模塊組成:字體文件讀取模塊、字體子集定制模塊,軟件采用基于MFC架構的C++語言開發[3]。

考慮到TTF文件中表數的眾多,如果對每個表分別進行獨立操作,將會使軟件的工程量變得很大,同時結構還會變得相當松散,這是比較差的設計方式。考慮到實際過程中并不需要對所有的表都進行修改,并且利用C++語言的繼承和多態的特性,可以將對描述表的讀取通過以下方式實現。

所有的描述表都需要實現內容讀取、內容保存的功能,具有一定的共性,所以可以設計一個基類CTaleInfo類,而具體的每個表都可以從CTableInfo類進行派生,如圖7所示。

類的定義如下所示:

Class CTableInfo

{

public:

//保存表信息

virtual void SetSave();

//從硬盤讀取文件

virtual void Load();

//將表信息寫入文件

virtual void Store() const;

//將信息附加到表中

virtual void AppendGlyfByDoc(){};

//復制表信息

virtual void Duplicate();

//設置表對應的TTF文件類

virtual void SetTtfDoc();

}

軟件界面如圖8所示。

4 ?結 ?論

該軟件已經開始于工程中使用,其操作方便、運用直觀,可對字體按需定制。經過裁剪的文件大小適合于嵌入式系統,大大提高了系統的運行效率。

參考文獻:

[1] 呂強,史磊,楊季文.TrueType字體文件格式初探 [J].計算機研究與發展,1995(11):23-31+60.

[2] TrueType 1.0 Font Files,Technical Specification(Revision 1.66) [Z].Microsoft Corporation,1995.

[3] 孫鑫.VC++深入詳解(修訂版) [M].北京:電子工業出版社,2012.

作者簡介:閆文奇(1988.10-),男,漢族,江蘇贛榆人,工程師,碩士,研究方向:控制器軟件開發。

主站蜘蛛池模板: 午夜视频在线观看免费网站| 91久久国产综合精品女同我| 色妞永久免费视频| 成人va亚洲va欧美天堂| 午夜一区二区三区| a在线观看免费| 99久久精品视香蕉蕉| 97视频免费看| 麻豆AV网站免费进入| 九九热在线视频| 国产女人爽到高潮的免费视频| 国产九九精品视频| 国产成年女人特黄特色毛片免| 久久亚洲欧美综合| 福利片91| 精品国产成人a在线观看| 午夜一级做a爰片久久毛片| 亚洲天堂区| 99热在线只有精品| 国产欧美日韩视频一区二区三区| 国产精品大尺度尺度视频| 2021国产精品自拍| 国产精品网址在线观看你懂的| 国产麻豆福利av在线播放| 欧美日韩国产在线播放| 久久福利网| 久久人搡人人玩人妻精品一| 伊人久综合| 日韩欧美国产三级| 国产精品网址你懂的| 视频在线观看一区二区| 亚洲视频免费播放| 亚洲无码免费黄色网址| 国产亚洲第一页| 久久综合色88| 一级片一区| 欧美成人午夜影院| 国产丰满大乳无码免费播放| 全免费a级毛片免费看不卡| 欧美性色综合网| 国产精品粉嫩| 日韩东京热无码人妻| 在线免费亚洲无码视频| 青青青伊人色综合久久| 欧美在线一二区| 亚洲一级毛片免费看| 亚洲精品综合一二三区在线| 欧美激情,国产精品| 欧美亚洲欧美区| 日日碰狠狠添天天爽| 在线欧美a| 毛片在线看网站| www中文字幕在线观看| 秘书高跟黑色丝袜国产91在线| 午夜无码一区二区三区在线app| 国产香蕉在线视频| 黄色不卡视频| AV不卡国产在线观看| 精品国产自| 91成人在线观看| 91精品国产自产91精品资源| 亚洲看片网| 不卡午夜视频| 久久综合色天堂av| 一级一级一片免费| 国产精品区视频中文字幕| 色综合久久久久8天国| 精品综合久久久久久97超人| 久久人体视频| 色综合天天娱乐综合网| 在线视频精品一区| 国产精品久久久久久搜索| 又大又硬又爽免费视频| 日本91在线| 无码网站免费观看| 成人午夜在线播放| 国产精品国产主播在线观看| 亚洲国产日韩一区| 色妞永久免费视频| 无码AV日韩一二三区| 国产免费网址| 毛片在线播放a|