專利名稱::一種字庫(kù)的網(wǎng)絡(luò)分發(fā)方法及系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明屬于字符信息處理
技術(shù)領(lǐng)域:
,具體涉及一種字庫(kù)的網(wǎng)絡(luò)分發(fā)方法及系統(tǒng),適用于需要通過(guò)網(wǎng)絡(luò)共享字庫(kù)的場(chǎng)合。
背景技術(shù):
:字庫(kù)是現(xiàn)代操作系統(tǒng)的重要組成部分之一,計(jì)算機(jī)通過(guò)它完成字體的呈現(xiàn),如顯示,打印等?,F(xiàn)有主流的字庫(kù)組織方式是按照字體風(fēng)格的不同進(jìn)行,甚至同一風(fēng)格不同粗細(xì)的字體也需要存儲(chǔ)在不同的字庫(kù)中。例如Windows中使用的方正姚體,微軟雅黑等,其中微軟雅黑又有不同的粗細(xì)之分,分別存儲(chǔ)在不同的文件中。而隨著字符集的擴(kuò)充,尤其是為了支持東亞語(yǔ)種,所需的字符數(shù)不斷增加,導(dǎo)致字庫(kù)的數(shù)據(jù)量不斷增加。造成字庫(kù)在網(wǎng)絡(luò)環(huán)境下分發(fā)的不便?,F(xiàn)有的字庫(kù)分發(fā)方法一般采用直接下載整個(gè)字庫(kù)的方式,這種方式存在數(shù)據(jù)量大,響應(yīng)速度慢,冗余數(shù)據(jù)量大等不足之處。
發(fā)明內(nèi)容針對(duì)現(xiàn)有技術(shù)中存在的缺陷,本發(fā)明的目的是提供一種字庫(kù)的網(wǎng)絡(luò)分發(fā)方法及系統(tǒng),該方法及系統(tǒng)能夠減輕網(wǎng)絡(luò)負(fù)載、提高響應(yīng)速度和降低數(shù)據(jù)的冗余量。為了實(shí)現(xiàn)上述目的,本發(fā)明釆用的技術(shù)方案是,一種字庫(kù)的網(wǎng)絡(luò)分發(fā)方法,包括以下步驟(1)發(fā)送端將字庫(kù)中的數(shù)據(jù)劃分為公有數(shù)據(jù)部分和字形專屬數(shù)據(jù)部分,其中,將字庫(kù)中具備全局?jǐn)?shù)據(jù)性質(zhì)并能夠多次使用的數(shù)據(jù)劃分為公有數(shù)據(jù)部分,將字庫(kù)中與字形相關(guān)的數(shù)據(jù)劃分為字形專屬數(shù)據(jù)部分;(2)發(fā)送端動(dòng)態(tài)提取公有數(shù)據(jù)部分中的公有數(shù)據(jù)、字形專屬數(shù)據(jù)部分中與所需字符相關(guān)的字形專屬數(shù)據(jù),并在提取數(shù)據(jù)的過(guò)程中對(duì)被提取的數(shù)據(jù)進(jìn)行打包處理,生成數(shù)據(jù)包;(3)發(fā)送端向接收端分發(fā)步驟(2)中生成的數(shù)據(jù)包,接收端對(duì)收到的數(shù)據(jù)包進(jìn)行解包處理后,提取數(shù)據(jù)包中的數(shù)據(jù)。如上所述的一種字庫(kù)的網(wǎng)絡(luò)分發(fā)方法,所述的公有數(shù)據(jù)只在首次提取和分發(fā)字形專屬數(shù)據(jù)部分中的數(shù)據(jù)時(shí)被提取和分發(fā)一次。如上所述的一種字庫(kù)的網(wǎng)絡(luò)分發(fā)方法,步驟(2)中提取與所需字符相關(guān)的字形專屬數(shù)據(jù)時(shí),如果字形存在依附字形,則將與依附字形相關(guān)的數(shù)據(jù)一并提取。如上所述的一種字庫(kù)的網(wǎng)絡(luò)分發(fā)方法,對(duì)步驟(2)中打包過(guò)的字符進(jìn)行記錄,下次提取字符相關(guān)的字形專屬數(shù)據(jù)時(shí),首先在記錄中查找是否存在相同的字符曾被提取并分發(fā)過(guò),如果存在,則不再對(duì)該字符進(jìn)行重復(fù)處理。如上所述的一種字庫(kù)的網(wǎng)絡(luò)分發(fā)方法,步驟(2)中所述的數(shù)據(jù)包由數(shù)據(jù)頭、索引表和實(shí)體二進(jìn)制數(shù)據(jù)三部分構(gòu)成。如上所述的一種字庫(kù)的網(wǎng)絡(luò)分發(fā)方法,所述的數(shù)據(jù)頭由傳入數(shù)據(jù)總個(gè)數(shù)、當(dāng)前數(shù)據(jù)類型的序號(hào)、傳入數(shù)據(jù)作為整體的類型、當(dāng)前數(shù)據(jù)頭的版本和預(yù)留位組成;所述的索引表由若干個(gè)索引構(gòu)成,每個(gè)索引由當(dāng)前傳入數(shù)據(jù)的類型、標(biāo)識(shí)編碼、與此標(biāo)識(shí)編碼有關(guān)的實(shí)體二進(jìn)制數(shù)據(jù)的存儲(chǔ)位置以及實(shí)體二進(jìn)制數(shù)據(jù)的長(zhǎng)度構(gòu)成。如上所述的一種字庫(kù)的網(wǎng)絡(luò)分發(fā)方法,所述的字庫(kù)為TrueType字庫(kù);所述的公有數(shù)據(jù)部分包括TrueType字庫(kù)的文件頭、描述表目錄以及除字形輪廓數(shù)據(jù)表之外的其他描述表;所述的字形專屬數(shù)據(jù)部分包括字形輪廓數(shù)據(jù)表。如上所述的一種字庫(kù)的網(wǎng)絡(luò)分發(fā)方法,步驟(2)中提取公有數(shù)據(jù)的過(guò)程包括以下步驟l)讀取文件頭,獲取字庫(kù)描述表的數(shù)目;2)根據(jù)描述表的數(shù)目遍歷描述表目錄,獲取一個(gè)描述表的標(biāo)識(shí)以及該描述表的偏移量和數(shù)據(jù)的大??;3)根據(jù)描述表的標(biāo)識(shí)判斷該描述表中的數(shù)據(jù)是否為公有數(shù)據(jù),如果是,則根據(jù)該描述表的偏移量和數(shù)據(jù)大小,找到并讀取指定大小的數(shù)據(jù),否則遍歷下一個(gè)描述表,重復(fù)步驟2)和步驟3),直到遍歷完所有的描述表為止。如上所述的一種字庫(kù)的網(wǎng)絡(luò)分發(fā)方法,步驟(2)中所述的打包處理過(guò)程包括以下步驟1)傳入打包數(shù)據(jù)和相應(yīng)的參數(shù),所述的參數(shù)包含UnPackType類型和數(shù)據(jù)索引,當(dāng)UnPackType類型為FILLGLYF時(shí),數(shù)據(jù)索引為與字符對(duì)應(yīng)的字形索引;當(dāng)UnPackType類型為FONTHEADER時(shí),數(shù)據(jù)索引為0;當(dāng)UnPackType類型為FONTFRAMEWORK時(shí),數(shù)據(jù)索引為描述表對(duì)應(yīng)的標(biāo)識(shí),其中FONTHEADER代表傳入的數(shù)據(jù)為文件頭,F(xiàn)ONTFRAMEWORK代表傳入的數(shù)據(jù)為公有數(shù)據(jù)部分中的描述表,F(xiàn)ILLGLYF則代表傳入的數(shù)據(jù)為字形專屬數(shù)據(jù)部分中與具體字符對(duì)應(yīng)的字形數(shù)據(jù);2)根據(jù)步驟1)中傳入的參數(shù)確定索引參數(shù),所述的索引參數(shù)的結(jié)構(gòu)為{UnPackType,數(shù)據(jù)索引,dwOffset,傳入數(shù)據(jù)長(zhǎng)度),其中dwOffset為當(dāng)前索引的實(shí)體二進(jìn)制數(shù)據(jù)的偏移量;3)將打包數(shù)據(jù)追加到索引數(shù)組和數(shù)據(jù)數(shù)組;4)更新偏移量;5)繼續(xù)傳入打包數(shù)據(jù),直到完成;6)合并索引數(shù)組和數(shù)據(jù)數(shù)組,加上數(shù)據(jù)頭后組合成一個(gè)數(shù)據(jù)包。如上所述的一種字庫(kù)的網(wǎng)絡(luò)分發(fā)方法,步驟(3)中所述的解包處理過(guò)程為首先根據(jù)數(shù)據(jù)頭中的傳入數(shù)據(jù)總個(gè)數(shù),確定索引數(shù)量,然后遍歷所有的索引,根據(jù)索引中數(shù)據(jù)的偏移量和數(shù)據(jù)的大小,從實(shí)體二進(jìn)制數(shù)據(jù)中提取出對(duì)應(yīng)的數(shù)據(jù)。一種字庫(kù)的網(wǎng)絡(luò)分發(fā)系統(tǒng),包括發(fā)送端和接收端,其中,所述的發(fā)送端中設(shè)有以下模塊數(shù)據(jù)劃分模塊用于把字庫(kù)中的數(shù)據(jù)劃分為公有數(shù)據(jù)部分和字形專屬數(shù)據(jù)部分,其中,所述的公有數(shù)據(jù)是指字庫(kù)中具備全局?jǐn)?shù)據(jù)性質(zhì)并能夠多次使用的數(shù)據(jù),所述的字形專屬數(shù)據(jù)是指字庫(kù)中與字形相關(guān)的數(shù)據(jù);數(shù)據(jù)提取模塊用于提取數(shù)據(jù)劃分模塊劃分的公有數(shù)據(jù)和字形專屬數(shù)據(jù);打包模塊用于將數(shù)據(jù)提取模塊提取的數(shù)據(jù)進(jìn)行打包,生成數(shù)據(jù)包;數(shù)據(jù)分發(fā)模塊用于分發(fā)打包模塊生成的數(shù)據(jù)包;所述的接收端中設(shè)有用于解析打包模塊生成的數(shù)據(jù)包的解包模塊。如上所述的一種字庫(kù)的網(wǎng)絡(luò)分發(fā)系統(tǒng),所述的數(shù)據(jù)提取模塊中還設(shè)有公有數(shù)據(jù)提取子模塊和字形專屬數(shù)據(jù)提取子模塊,分別用于提取公有數(shù)據(jù)和字形專屬數(shù)據(jù)。本發(fā)明的效果在于采用本發(fā)明所述的方法及系統(tǒng),將現(xiàn)有字庫(kù)中的數(shù)據(jù)分割為字庫(kù)公有數(shù)據(jù)部分和字形專屬部分,在首次網(wǎng)絡(luò)分發(fā)時(shí),分發(fā)字庫(kù)公有數(shù)據(jù)部分和與所需字符相應(yīng)的字形專屬部分?jǐn)?shù)據(jù),接下來(lái)在每次網(wǎng)絡(luò)分發(fā)時(shí),只分發(fā)與當(dāng)前使用字符相關(guān)的字形專屬數(shù)據(jù)。通過(guò)這種方式,減輕了網(wǎng)絡(luò)負(fù)載,提高了響應(yīng)速度,降低了數(shù)據(jù)的冗余量,達(dá)到了按需分發(fā)的目的。圖1為本發(fā)明所述的系統(tǒng)結(jié)構(gòu)圖2為本發(fā)明所述的方法流程圖3為本發(fā)明具體實(shí)施方式中數(shù)據(jù)類別劃分示意圖4為本發(fā)明具體實(shí)施方式中提取公有數(shù)據(jù)流程圖5為本發(fā)明具體實(shí)施方式中存在依附關(guān)系的字形示例圖6為本發(fā)明具體實(shí)施方式中提取依附關(guān)系字形數(shù)據(jù)流程圖7為本發(fā)明具體實(shí)施方式中數(shù)據(jù)打包流程圖8為本發(fā)明具體實(shí)施方式中數(shù)據(jù)解包流程圖。具體實(shí)施例方式下面結(jié)合實(shí)施例和附圖對(duì)本發(fā)明所述的方法及系統(tǒng)進(jìn)4亍詳細(xì)地描述。如圖l所示,一種字庫(kù)的網(wǎng)絡(luò)分發(fā)系統(tǒng),包括發(fā)送端和接收端,其中,所述的發(fā)送端中設(shè)有以下模塊數(shù)據(jù)劃分模塊11,用于把字庫(kù)中的數(shù)據(jù)劃分為公有數(shù)據(jù)部分和字形專屬數(shù)據(jù)部分,其中,所述的公有數(shù)據(jù)是指字庫(kù)中具備全局?jǐn)?shù)據(jù)性質(zhì)并能夠多次使用的數(shù)據(jù),所述的字形專屬數(shù)據(jù)是指字庫(kù)中與字形相關(guān)的數(shù)據(jù);數(shù)據(jù)提取模塊12,用于提取數(shù)據(jù)劃分模塊11劃分的公有數(shù)據(jù)和字形專屬數(shù)據(jù);本實(shí)施例中,數(shù)據(jù)提取模塊12中設(shè)有公有數(shù)據(jù)提取子模塊121和字形專屬數(shù)據(jù)提取子模塊122,分別用于提取公有數(shù)據(jù)和字形專屬數(shù)據(jù);打包模塊13,用于將數(shù)據(jù)提取模塊12提取的數(shù)據(jù)進(jìn)行打包,生成數(shù)據(jù)包;數(shù)據(jù)分發(fā)模塊14,用于分發(fā)打包模塊13生成的數(shù)據(jù)包;所述的接收端中設(shè)有用于解析打包模塊生成的數(shù)據(jù)包的解包模塊15。如圖2所示,一種字庫(kù)的網(wǎng)絡(luò)分發(fā)方法,包括以下步驟。(1)數(shù)據(jù)劃分模塊11將字庫(kù)中的數(shù)據(jù)劃分為公有數(shù)據(jù)部分和字形專屬數(shù)據(jù)部分。將字庫(kù)中具備全局?jǐn)?shù)據(jù)性質(zhì)并能夠多次使用的數(shù)據(jù)劃分為公有數(shù)據(jù)部分,將字庫(kù)中的與字形相關(guān)的數(shù)據(jù)劃分為字形專屬數(shù)據(jù)部分。如圖3所示,以TrueType字庫(kù)(以下簡(jiǎn)稱TTF)為例一個(gè)標(biāo)準(zhǔn)的TTF文件由2個(gè)部分組成文件頭和一系列的描述表。其中,文件頭包括OffsetTable(偏移表)和TabletDirectory(描述表目錄),偏移表包括文件版本號(hào)、描述表數(shù)目、描述表快速查找范圍、入口選擇、范圍調(diào)整等信息;偏移表后緊跟描述表目錄,包括描述表名稱、描述表內(nèi)容的校驗(yàn)和、描述表的偏移地址及描述表數(shù)據(jù)大小等信息;最后是各個(gè)具體的文件描述表,包括字符編碼的查找方法、字形輪廓數(shù)據(jù)的描述方法等信息。常用的TTF文件描述表共有19個(gè),其中10個(gè)是必備的,其它9個(gè)是可選的。必備表主要包括字符編碼映射表cmap、字形數(shù)據(jù)定位表loca、字形輪廓數(shù)據(jù)表glyf等。其中,glyf表是TTF文件的主體部分,用于存放所有的字形輪廓描述信息,包括描述字形輪廓的數(shù)據(jù)信息和修正字形輪廓的指令信息兩部分。讀取TTF文件中字形數(shù)據(jù)時(shí),首先根據(jù)文件頭得到描述表的個(gè)數(shù),然后遍歷描述表目錄,提取對(duì)應(yīng)描述表數(shù)據(jù)的偏移量和數(shù)據(jù)大小,最后根據(jù)偏移量和數(shù)據(jù)大小找到并讀取數(shù)據(jù)。TTF文件的偏移表和描述表目錄的結(jié)構(gòu)如下表所示,描述表的具體結(jié)構(gòu)可以參考MicrosoftTypography中的相關(guān)文檔說(shuō)明。<table>tableseeoriginaldocumentpage10</column></row><table>由上述TTF文件的組織方式可知,TTF的文件頭(圖3中的公有數(shù)據(jù)部分1)以及除字形輪廓數(shù)據(jù)表之外的其他描述表具備全局?jǐn)?shù)據(jù)性質(zhì)并能夠多次使用的數(shù)據(jù)(圖3中的公有數(shù)據(jù)部分2),因此將其劃分為公有數(shù)據(jù)部分;而字形輪廓數(shù)據(jù)表是與字形相關(guān)的數(shù)據(jù),因此將其劃分為字形專屬數(shù)據(jù)部分。(2)公有數(shù)據(jù)提取子模塊121提取公有數(shù)據(jù)部分中的公有數(shù)據(jù),字形專屬數(shù)據(jù)提取子模塊122提取字形專屬數(shù)據(jù)部分中與所需字符相關(guān)的字形專屬數(shù)據(jù),并在提取數(shù)據(jù)的過(guò)程中打包模塊13對(duì)被提取的數(shù)據(jù)進(jìn)行打包處理,生成數(shù)據(jù)包。對(duì)于公有數(shù)據(jù)部分中的公有數(shù)據(jù),在字庫(kù)的網(wǎng)絡(luò)應(yīng)用時(shí),只需提取和分發(fā)一次。因?yàn)楦鶕?jù)上述劃分公有數(shù)據(jù)部分的規(guī)則,該部分?jǐn)?shù)據(jù)是具備全局?jǐn)?shù)據(jù)性質(zhì)并能夠多次使用的數(shù)據(jù),它不會(huì)因?yàn)樘崛〔煌淖中螌贁?shù)據(jù)而產(chǎn)生不同,所以只需在首次提取和分發(fā)字形專屬數(shù)據(jù)部分中的數(shù)據(jù)時(shí)被提取并分發(fā),當(dāng)下一次提取和分發(fā)字形專屬數(shù)據(jù)部分中的數(shù)據(jù)時(shí),則無(wú)需再次提取并分發(fā)公有數(shù)據(jù)部分。如圖4所示,以提取TTF中的公有數(shù)據(jù)為例來(lái)說(shuō)明本發(fā)明提取公有數(shù)據(jù)的過(guò)程,主要包括以下步驟1)讀取文件頭,獲取描述表的數(shù)目,并將文件頭傳入打包模塊13;2)根據(jù)描述表的數(shù)目遍歷描述表目錄,獲取一個(gè)描述表的標(biāo)識(shí)tag以及該描述表的偏移量和數(shù)據(jù)的大?。?)根據(jù)描述表的標(biāo)識(shí)tag判斷該描述表中的數(shù)據(jù)是否為公有數(shù)據(jù),如果是,則根據(jù)該描述表的偏移量和數(shù)據(jù)的大小,找到并讀取指定大小的數(shù)據(jù),并將其傳入打包模塊13,否則遍歷下一個(gè)描述表,重復(fù)步驟2)和步驟3),直到遍歷完所有的描述表為止。對(duì)于字形專屬數(shù)據(jù)部分中的數(shù)據(jù),可能存在字形之間的依附關(guān)系,即字形是由其他字形組合而成的情況。因此,該部分?jǐn)?shù)據(jù)在提取時(shí),必須考慮字形是否存在依附關(guān)系以及如何提取與依附字形相關(guān)的數(shù)據(jù)問(wèn)題。以TTF為例,根據(jù)標(biāo)準(zhǔn)TTF的內(nèi)在機(jī)制,當(dāng)提取一個(gè)字符對(duì)應(yīng)的字形數(shù)據(jù)時(shí),首先根據(jù)字符的編碼在字符編碼映射表cmap中找到其對(duì)應(yīng)的字形索引,然后在字形數(shù)據(jù)定位表loca中根據(jù)索引找到字形數(shù)據(jù)的起始位置,并同時(shí)確定字形數(shù)據(jù)的大小。然后就可以提取出字符對(duì)應(yīng)字形的數(shù)據(jù)。對(duì)于字形是簡(jiǎn)單回路的情況(即非組合字形),可以直接將其傳入打包模塊。對(duì)于字形是由其他字形組合而成的情況,即存在字形依附關(guān)系的字形,需要同時(shí)提取出其依附字形的數(shù)據(jù)。如圖5所示,編碼為0x517B的字形存在依附字形,依次為glyph08597,glyph06297,glyph07695,glyph07937,glyph08064,glyph08159。如圖6所示,處理依附字形的過(guò)程為首先將提取的字形數(shù)據(jù)傳入打包模塊13,然后遍歷該字形數(shù)據(jù),發(fā)現(xiàn)依附字形后,提取出依附字形的索引,并按照依附字形的索引提取出對(duì)應(yīng)的字形數(shù)據(jù),將其傳入打包模塊13,直至提取完所有當(dāng)前字形的全部依附字形數(shù)據(jù)為止。以圖5為例,首先提取索引為8597的字形數(shù)據(jù),傳入打包模塊13后,再提取索引為6297的字形數(shù)據(jù)并傳入打包模塊13,直至處理完索引為8159的字形數(shù)據(jù)為止。另外,在提取字形專屬數(shù)據(jù)時(shí),可能存在當(dāng)前使用的字符和以前已經(jīng)使用過(guò)的字符部分重復(fù)的問(wèn)題,即與該字符對(duì)應(yīng)的字形數(shù)據(jù)以前已經(jīng)分發(fā)過(guò)。為了提高效率,對(duì)于這個(gè)問(wèn)題,可以對(duì)已經(jīng)分發(fā)過(guò)的字符采用記錄的方式,防止被處理多次。具體方式可以通過(guò)記錄字符編碼的方式來(lái)完成。以圖5為例,字形索引分別為8597、6297、7695、7937、8064、8159的字形,在處理編碼為0x517B的字形時(shí)已經(jīng)進(jìn)行過(guò)打包,則將其記錄在以字體名為文件名的文件中,每行通過(guò)文本方式記錄一個(gè)字形的索引。編碼為0x517B的字形經(jīng)過(guò)處理后,該文件中就會(huì)多出如下幾行的文本859762977695793780648159在接下來(lái)的處理中,首先根據(jù)字形編碼通過(guò)cmap表映射獲得的字形索引,匹配該文件中的文本,如果匹配成功,則直接跳過(guò),否則繼續(xù)處理。例如在處理編碼為0x6205的字形時(shí),通過(guò)cmap映射得到其字形索引為6297,從上述的文件中發(fā)現(xiàn)索引為6297的字形出現(xiàn)過(guò),則不再處理,直接跳過(guò)即可。對(duì)于依附字形,同樣采用此機(jī)制防止字形數(shù)據(jù)的重復(fù)處理。為了便于數(shù)據(jù)的分發(fā),利用打包模塊13在提取數(shù)據(jù)的過(guò)程中對(duì)被提取的數(shù)據(jù)進(jìn)行打包處理,生成數(shù)據(jù)包后再進(jìn)行網(wǎng)絡(luò)分發(fā)。打包數(shù)據(jù)的目的是為了將提取出來(lái)的數(shù)據(jù),可能包含公有數(shù)據(jù)和不定個(gè)數(shù)的字形專屬數(shù)據(jù)的集合,組合成一個(gè)數(shù)據(jù)包,方便數(shù)據(jù)的統(tǒng)一分發(fā)。為此,需要結(jié)合如下的數(shù)據(jù)結(jié)構(gòu)。首先是一個(gè)數(shù)據(jù)頭(名稱HEAD):由傳入數(shù)據(jù)總個(gè)數(shù)usNumOfCode,當(dāng)前數(shù)據(jù)類型的序號(hào)usCurNum,傳入數(shù)據(jù)作為整體來(lái)看的類型usType,當(dāng)前數(shù)據(jù)頭的片反本usVersion和預(yù)留位us0ther組成,其結(jié)構(gòu)^口下。typedefstruct_tagHEADUSHORTusNumOfCode;USHORTusCurNum;USHORTusType;USHORTusVersion;USHORTusOther;)HEAD,化PHEAD;然后是索引表,其中每個(gè)元素為一個(gè)DIRECT結(jié)構(gòu)由當(dāng)前傳入數(shù)據(jù)的類型utDirType、標(biāo)識(shí)編碼dwCode、與此標(biāo)識(shí)編碼有關(guān)的實(shí)體二進(jìn)制數(shù)據(jù)的存儲(chǔ)位置dwOffset(該位置的起始位置為實(shí)體二進(jìn)制數(shù)據(jù)的存儲(chǔ)起始位置)以及實(shí)體二進(jìn)制數(shù)據(jù)的長(zhǎng)度usLenOfBin組成,其結(jié)構(gòu)如下。typedefstruct—tagDIRECTUnPackTypeutDirType;.DWORDdwCode;DWORDdwOffsetUSHORTusLenOfBin;}DIRECT,*LPDIRECT;其中UnPackType為如下所示的枚舉類型。enumUnPackTypeFONTHEADER=0x01,FONTFRAMEWORK=0x100,F(xiàn)ILLGLYF-0x1000FONTHEADER代表TTF中的文件頭,包括偏移表和描述表目錄兩部分。FONTFRAMEWORK代表公有數(shù)據(jù)部分中的各個(gè)描述表,F(xiàn)ILLGLYF則代表與某個(gè)具體字符對(duì)應(yīng)的字形數(shù)據(jù)。最后是所有實(shí)體二進(jìn)制數(shù)據(jù)。上述數(shù)據(jù)頭和索引表是為輔助實(shí)體二進(jìn)制數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。如圖7所示,打包的過(guò)程主要包括以下步驟。1)傳入打包數(shù)據(jù)和相應(yīng)的參數(shù)。所述的參數(shù)包含UnPackType類型和數(shù)據(jù)索引。當(dāng)UnPackType類型為FILLGLYF時(shí),數(shù)據(jù)索引為與字符對(duì)應(yīng)的字形索引;當(dāng)UnPackType類型為FONTHEADER時(shí),數(shù)據(jù)索引為0;當(dāng)UnPackType類型為FONTFRAMEWORK時(shí),數(shù)據(jù)索引為描述表對(duì)應(yīng)的標(biāo)識(shí)。2)根據(jù)傳入的參數(shù)構(gòu)造出索引參數(shù)。索引參數(shù)的結(jié)構(gòu)為{UnPackType,數(shù)據(jù)索引,dwOffset,傳入數(shù)據(jù)長(zhǎng)度},其中dwOffset為當(dāng)前索引的實(shí)體二進(jìn)制數(shù)據(jù)的偏移量。例如,傳入字形索引為4000的字形專屬數(shù)據(jù),其長(zhǎng)度為102個(gè)字節(jié),則根據(jù)傳入的參數(shù)構(gòu)造出的索引參數(shù)如下{FILLGLYF,4000,dwOffset,102},當(dāng)新構(gòu)造一個(gè)數(shù)據(jù)包時(shí),當(dāng)前索引的實(shí)體二進(jìn)制數(shù)據(jù)的偏移量置零,每次傳入新的數(shù)據(jù),無(wú)論公有數(shù)據(jù)還是字形專屬數(shù)據(jù),當(dāng)前索引的實(shí)體二進(jìn)制數(shù)據(jù)的偏移量在構(gòu)造索引參數(shù)結(jié)束后,累加傳入數(shù)據(jù)的長(zhǎng)度。此例中,如果是首次構(gòu)造數(shù)據(jù)包,則上述的dwOffset為0,在構(gòu)造完當(dāng)前索引參數(shù)后,更新為0+102,即102。即下一次構(gòu)造索引單元時(shí),dwOffset為102。如果是第一次操作,還需要重置索引數(shù)組和數(shù)據(jù)數(shù)組。在構(gòu)造完當(dāng)前的索引參數(shù)后,將當(dāng)前的索引參數(shù)追加到索引數(shù)組中,并且將對(duì)應(yīng)的數(shù)據(jù)102個(gè)字節(jié),追加到數(shù)據(jù)數(shù)組中。然后更新偏移量為102。其中數(shù)據(jù)數(shù)組為一個(gè)二進(jìn)制數(shù)組,索引數(shù)組為索引結(jié)構(gòu)的數(shù)組。接下來(lái),如果仍需要傳入數(shù)據(jù),則重復(fù)上述流程。例如接下來(lái)需要傳入TTF的文件頭數(shù)據(jù),則才艮據(jù)傳入?yún)?shù)構(gòu)造出的索引參數(shù)如下{FONTHEADER,0,102,60},其中102根據(jù)上述的更新方式獲得,F(xiàn)ONTHEADER代表當(dāng)前索引對(duì)應(yīng)的數(shù)據(jù)為文件頭,此時(shí)第二項(xiàng)不用填寫(xiě),默認(rèn)為0,60代表當(dāng)前數(shù)據(jù)的大小為60字節(jié)。接下來(lái)的操作也是追加數(shù)據(jù)和更新偏移量。如果還有一個(gè)描述表的數(shù)據(jù)需要繼續(xù)傳入,則繼續(xù)這一個(gè)流程。以傳入cmap表中的數(shù)據(jù)為例,傳入的參數(shù)對(duì)應(yīng)的索引參數(shù)如下{FONTFRAMEWORK,cmap表對(duì)應(yīng)的標(biāo)識(shí),162,29482},其中,F(xiàn)ONTFRAMEWORK代表該索引對(duì)應(yīng)的是TTF描述表類的數(shù)據(jù),162為其對(duì)應(yīng)數(shù)據(jù)的偏移量,29482為數(shù)據(jù)的大小。cmap表對(duì)應(yīng)的標(biāo)識(shí)可以通過(guò)MAKE_TABLE_TAG('c、'm、'a、'p')函數(shù)獲得,因此在傳入相應(yīng)的參數(shù)時(shí)只需傳入表的名稱即可。MAKE_TABLE_TAG函數(shù)的定義如下#defineMAKE—TABLE—TAG(—xl(((ULONG)-xl<<24)I((UL0NG)_x2<<16)I((UL0NG)一x3《8)1(FT—ULong)_x4接下來(lái)的操作同上。3)當(dāng)所有數(shù)據(jù)傳入完畢后,對(duì)數(shù)據(jù)進(jìn)行整合。現(xiàn)有的數(shù)據(jù)分散在兩個(gè)數(shù)組中,需要將其合并,并且加一個(gè)數(shù)據(jù)頭,來(lái)組合成一個(gè)數(shù)據(jù)包。在此例中,構(gòu)造出如下的l《據(jù)頭{3,2,FONTHEADER+F0NTFRAMEW0RK+FILLGLYF,1,0},其中3代表傳入數(shù)據(jù)的總個(gè)數(shù),也就是說(shuō),共有三個(gè)需要索引的數(shù)據(jù),當(dāng)前操作的為第2個(gè)(從零開(kāi)始計(jì)算),數(shù)據(jù)的類型為三個(gè)類型的混合,版本號(hào)為1,保留項(xiàng)為0。數(shù)據(jù)打包完成后,數(shù)據(jù)分發(fā)模塊14便可以將數(shù)據(jù)包分發(fā)給接收端。(3)數(shù)據(jù)分發(fā)模塊14向接收端分發(fā)打包模塊13生成的數(shù)據(jù)包,接收端利用解包模塊15對(duì)收到的數(shù)據(jù)包進(jìn)行解包處理后,提取數(shù)據(jù)包中的數(shù)據(jù)。經(jīng)過(guò)網(wǎng)絡(luò)分發(fā)之后,數(shù)據(jù)需要進(jìn)行解包才能夠使用。解包的過(guò)程如圖8所示。首先根據(jù)數(shù)據(jù)頭中的傳入數(shù)據(jù)總個(gè)數(shù),確定可以使用的索引數(shù)量。其中數(shù)據(jù)的類型標(biāo)識(shí)可以用于快速確定當(dāng)前數(shù)據(jù)包中是否還有所需要的數(shù)據(jù)。接下來(lái),遍歷所有的索引,根據(jù)索引中數(shù)據(jù)的偏移量和數(shù)據(jù)的大小,從實(shí)體二進(jìn)制數(shù)據(jù)中提取出對(duì)應(yīng)的數(shù)據(jù),其中實(shí)體數(shù)據(jù)的起始位置為數(shù)據(jù)頭的大小和所有索引的大小的總和。然后結(jié)合索引中提供的類型變量和標(biāo)識(shí)編碼,共同確定提取出的數(shù)據(jù)如何使用。需要說(shuō)明的是本發(fā)明所述的方法及系統(tǒng)并不限于具體實(shí)施方式中所述的實(shí)施例,本領(lǐng)域技術(shù)人員根據(jù)本發(fā)明的技術(shù)方案得出其他的實(shí)施方式,同樣屬于本發(fā)明的技術(shù)創(chuàng)新范圍。權(quán)利要求1.一種字庫(kù)的網(wǎng)絡(luò)分發(fā)方法,包括以下步驟(1)發(fā)送端將字庫(kù)中的數(shù)據(jù)劃分為公有數(shù)據(jù)部分和字形專屬數(shù)據(jù)部分,其中,將字庫(kù)中具備全局?jǐn)?shù)據(jù)性質(zhì)并能夠多次使用的數(shù)據(jù)劃分為公有數(shù)據(jù)部分,將字庫(kù)中與字形相關(guān)的數(shù)據(jù)劃分為字形專屬數(shù)據(jù)部分;(2)發(fā)送端動(dòng)態(tài)提取公有數(shù)據(jù)部分中的公有數(shù)據(jù)、字形專屬數(shù)據(jù)部分中與所需字符相關(guān)的字形專屬數(shù)據(jù),并在提取數(shù)據(jù)的過(guò)程中對(duì)被提取的數(shù)據(jù)進(jìn)行打包處理,生成數(shù)據(jù)包;(3)發(fā)送端向接收端分發(fā)步驟(2)中生成的數(shù)據(jù)包,接收端對(duì)收到的數(shù)據(jù)包進(jìn)行解包處理后,提取數(shù)據(jù)包中的數(shù)據(jù)。2.如權(quán)利要求1所述的一種字庫(kù)的網(wǎng)絡(luò)分發(fā)方法,其特征在于所述的公有數(shù)據(jù)只在首次提取和分發(fā)字形專屬數(shù)據(jù)部分中的數(shù)據(jù)時(shí)被提取和分發(fā)一次。3.如權(quán)利要求1所述的一種字庫(kù)的網(wǎng)絡(luò)分發(fā)方法,其特征在于步驟(2)中提取與所需字符相關(guān)的字形專屬數(shù)據(jù)時(shí),如果字形存在依附字形,則將與依附字形相關(guān)的數(shù)據(jù)一并提取。4.如權(quán)利要求1所述的一種字庫(kù)的網(wǎng)絡(luò)分發(fā)方法,其特征在于對(duì)步驟(2)中打包過(guò)的字符進(jìn)行記錄,下次提取字符相關(guān)的字形專屬數(shù)據(jù)時(shí),首先在記錄中查找是否存在相同的字符曾被提取并分發(fā)過(guò),如果存在,則不再對(duì)該字符進(jìn)行重復(fù)處理。5.如權(quán)利要求1所述的一種字庫(kù)的網(wǎng)絡(luò)分發(fā)方法,其特征在于步驟(2)中所述的數(shù)據(jù)包由數(shù)據(jù)頭、索引表和實(shí)體二進(jìn)制數(shù)據(jù)三部分構(gòu)成。6.如權(quán)利要求5所述的一種字庫(kù)的網(wǎng)絡(luò)分發(fā)方法,其特征在于所述的數(shù)據(jù)頭由傳入數(shù)據(jù)總個(gè)數(shù)、當(dāng)前數(shù)據(jù)類型的序號(hào)、傳入數(shù)據(jù)作為整體的類型、當(dāng)前數(shù)據(jù)頭的版本和預(yù)留位組成;所述的索引表由若干個(gè)索引構(gòu)成,每個(gè)索引由當(dāng)前傳入數(shù)據(jù)的類型、標(biāo)識(shí)編碼、與此標(biāo)識(shí)編碼有關(guān)的實(shí)體二進(jìn)制數(shù)據(jù)的存儲(chǔ)位置以及實(shí)體二進(jìn)制數(shù)據(jù)的長(zhǎng)度構(gòu)成。7.如權(quán)利要求1至6之一所述的一種字庫(kù)的網(wǎng)絡(luò)分發(fā)方法,其特征在于所述的字庫(kù)為TrueType字庫(kù);所述的公有數(shù)據(jù)部分包括TrueType字庫(kù)的文件頭以及除字形輪廓數(shù)據(jù)表之外的其他描述表;所述的字形專屬數(shù)據(jù)部分包括字形輪廓數(shù)據(jù)表。8.如權(quán)利要求7所述的一種字庫(kù)的網(wǎng)絡(luò)分發(fā)方法,其特征在于步驟(2)中提取公有數(shù)據(jù)的過(guò)程包括以下步驟1)讀取文件頭,獲取字庫(kù)描述表的數(shù)目;2)根據(jù)描述表的數(shù)目遍歷描述表目錄,獲取一個(gè)描述表的標(biāo)識(shí)以及該描述表的偏移量和數(shù)據(jù)的大??;3)根據(jù)描述表的標(biāo)識(shí)判斷該描述表中的數(shù)據(jù)是否為公有數(shù)據(jù),如果是,則根據(jù)該描述表的偏移量和數(shù)據(jù)大小,找到并讀取指定大小的數(shù)據(jù),否則遍歷下一個(gè)描述表,重復(fù)步驟2)和步驟3),直到遍歷完所有的描述表為止。9.如權(quán)利要求7所述的一種字庫(kù)的網(wǎng)絡(luò)分發(fā)方法,其特征在于步驟(2)中所述的打包處理過(guò)程包括以下步驟1)傳入打包數(shù)據(jù)和相應(yīng)的參數(shù),所述的參數(shù)包含UnPackType類型和數(shù)據(jù)索引,當(dāng)UnPackType類型為FILLGLYF時(shí),數(shù)據(jù)索引為與字符對(duì)應(yīng)的字形索引;當(dāng)UnPackType類型為FONTHEADER時(shí),數(shù)據(jù)索引為0;當(dāng)UnPackType類型為FONTFRAMEWORK時(shí),數(shù)據(jù)索引為字庫(kù)描述表對(duì)應(yīng)的標(biāo)識(shí),其中FONTHEADER代表傳入的數(shù)據(jù)為文件頭,F(xiàn)ONTFRAMEWORK代表傳入的數(shù)據(jù)為公有數(shù)據(jù)部分中的描述表,F(xiàn)ILLGLYF則代表傳入的數(shù)據(jù)為字形專屬數(shù)據(jù)部分中與具體字符對(duì)應(yīng)的字形數(shù)據(jù);2)根據(jù)步驟1)中傳入的參數(shù)確定索引參數(shù),所述的索引參數(shù)的結(jié)構(gòu)為{UnPackType,數(shù)據(jù)索引,dwOffset,傳入數(shù)據(jù)長(zhǎng)度},其中dwOffset為當(dāng)前索引的實(shí)體二進(jìn)制數(shù)據(jù)的偏移量;3)將打包數(shù)據(jù)追加到索引數(shù)組和數(shù)據(jù)數(shù)組;4)更新dwOffset;5)繼續(xù)傳入打包數(shù)據(jù),直到完成;6)合并索引數(shù)組和數(shù)據(jù)數(shù)組,加上數(shù)據(jù)頭后組合成一個(gè)數(shù)據(jù)包。10.如權(quán)利要求9所述的一種字庫(kù)的網(wǎng)絡(luò)分發(fā)方法,其特征在于,步驟(3)中所述的解包處理過(guò)程為首先根據(jù)數(shù)據(jù)頭中的傳入數(shù)據(jù)總個(gè)數(shù),確定索引數(shù)量,然后遍歷所有的索引,根據(jù)索引中數(shù)據(jù)的偏移量和數(shù)據(jù)的大小,從實(shí)體二進(jìn)制數(shù)據(jù)中提取出對(duì)應(yīng)的數(shù)據(jù)。11.一種字庫(kù)的網(wǎng)絡(luò)分發(fā)系統(tǒng),包括發(fā)送端和接收端,其中,所述的發(fā)送端中設(shè)有以下模塊數(shù)據(jù)劃分模塊用于把字庫(kù)中的數(shù)據(jù)劃分為公有數(shù)據(jù)部分和字形專屬數(shù)據(jù)部分,其中,所述的公有數(shù)據(jù)是指字庫(kù)中具備全局?jǐn)?shù)據(jù)性質(zhì)并能夠多次使用的數(shù)據(jù),所述的字形專屬數(shù)據(jù)是指字庫(kù)中與字形相關(guān)的數(shù)據(jù);數(shù)據(jù)提取模塊用于提取數(shù)據(jù)劃分模塊劃分的公有數(shù)據(jù)和字形專屬數(shù)據(jù);打包模塊用于將數(shù)據(jù)提取模塊提取的數(shù)據(jù)進(jìn)行打包,生成數(shù)據(jù)包;數(shù)據(jù)分發(fā)模塊用于分發(fā)打包模塊生成的數(shù)據(jù)包;所述的接收端中設(shè)有用于解析打包模塊生成的數(shù)據(jù)包的解包模塊。12.如權(quán)利要求11所述的一種字庫(kù)的網(wǎng)絡(luò)分發(fā)系統(tǒng),其特征在于所述的數(shù)據(jù)提取模塊中還設(shè)有公有數(shù)據(jù)提取子模塊和字形專屬數(shù)據(jù)提取子模塊,分別用于提取公有數(shù)據(jù)和字形專屬數(shù)據(jù)。全文摘要本發(fā)明公開(kāi)了一種字庫(kù)的網(wǎng)絡(luò)分發(fā)方法及系統(tǒng),屬于字符信息處理
技術(shù)領(lǐng)域:
?,F(xiàn)有的字庫(kù)分發(fā)方法中,采用全字庫(kù)分發(fā)方式。這種方式存在數(shù)據(jù)量大,響應(yīng)速度慢,冗余數(shù)據(jù)量大等不足之處。本發(fā)明所述的方法及系統(tǒng)在現(xiàn)有字庫(kù)格式的基礎(chǔ)上,將字庫(kù)中的數(shù)據(jù)劃分為公有數(shù)據(jù)部分和字形專屬數(shù)據(jù)部分兩類數(shù)據(jù);然后動(dòng)態(tài)提取公有數(shù)據(jù)部分中的公有數(shù)據(jù)、字形專屬數(shù)據(jù)部分中與所需字形相關(guān)的專屬數(shù)據(jù),并在提取數(shù)據(jù)的過(guò)程中對(duì)被提取的數(shù)據(jù)進(jìn)行打包處理,生成數(shù)據(jù)包;最后向接收端分發(fā)數(shù)據(jù)包,接收端對(duì)收到的數(shù)據(jù)包進(jìn)行解包處理后,提取數(shù)據(jù)包中的數(shù)據(jù)。采用本發(fā)明所述的方法及系統(tǒng)分發(fā)字庫(kù)時(shí),降低了網(wǎng)絡(luò)負(fù)載和數(shù)據(jù)冗余量,提高了響應(yīng)速度,實(shí)現(xiàn)了按需分發(fā)的目的。文檔編號(hào)H04L12/54GK101369953SQ200810222439公開(kāi)日2009年2月18日申請(qǐng)日期2008年9月17日優(yōu)先權(quán)日2008年9月17日發(fā)明者昉劉,唐英敏,張國(guó)榮,明李申請(qǐng)人:北大方正集團(tuán)有限公司;北京大學(xué);北京北大方正電子有限公司