對字體文件中的數(shù)據(jù)進(jìn)行壓縮的系統(tǒng)和方法
【專利摘要】接收包括壓縮數(shù)據(jù)的壓縮字體文件。對該壓縮數(shù)據(jù)進(jìn)行解壓縮以生成解壓縮數(shù)據(jù)。嘗試對解壓縮數(shù)據(jù)進(jìn)行驗證。在該解壓縮數(shù)據(jù)內(nèi),檢測與字體文件的元素相對應(yīng)的預(yù)定模式的無效數(shù)據(jù)。通過利用該元素對至少一些無效數(shù)據(jù)進(jìn)行替換來對該字體文件進(jìn)行重構(gòu)。
【專利說明】對字體文件中的數(shù)據(jù)進(jìn)行壓縮的系統(tǒng)和方法
[0001]相關(guān)申請的交叉引用
[0002]本申請要求于2011年8月24日提交的美國臨時申請序列號61/526,989的權(quán)益,其通過引用全文合并于此。
【技術(shù)領(lǐng)域】
[0003]本說明書總體上涉及用于對字體進(jìn)行壓縮和解壓縮的系統(tǒng)、方法和裝置,更具體地涉及對字體文件中的字體進(jìn)行壓縮和解壓縮的系統(tǒng)、方法和裝置。
【背景技術(shù)】
[0004]現(xiàn)有系統(tǒng)提供對字體文件的有限壓縮。在現(xiàn)有系統(tǒng)中,字體文件可以在傳輸之前使用壓縮算法進(jìn)行壓縮。在接收器處,可以對壓縮的字體文件進(jìn)行解壓縮。然而,在對字體文件進(jìn)行解壓縮的同時,這樣的現(xiàn)有系統(tǒng)產(chǎn)生了字體加載時間的延遲。
【發(fā)明內(nèi)容】
[0005]依據(jù)一個實施例,接收包括壓縮數(shù)據(jù)的壓縮字體文件。對該壓縮數(shù)據(jù)進(jìn)行解壓縮以生成解壓縮數(shù)據(jù)。嘗試對解壓縮數(shù)據(jù)進(jìn)行驗證。在該解壓縮數(shù)據(jù)內(nèi),檢測與字體文件的元素相對應(yīng)的預(yù)定模式的無效數(shù)據(jù)。通過利用該元素對至少一些無效數(shù)據(jù)進(jìn)行替換來對該字體文件進(jìn)行重構(gòu)。
[0006]在另一個實施例中,所述元素包括以下中的至少一個:與字體文件中的字形相關(guān)聯(lián)的邊框;和軌跡(1ca)表。在一個實施例中,該元素包括軌跡表并且其中該軌跡表包括在軌跡表內(nèi)條目的起始位置的指示。在一個實施例中,該軌跡表是通過對字形表進(jìn)行掃描來得到的。
[0007]在另一個實施例中,在解壓縮數(shù)據(jù)內(nèi)檢測有效數(shù)據(jù)。在一個實施例中,對字體文件進(jìn)行重構(gòu)進(jìn)一步包括對該字體文件進(jìn)行重構(gòu)以包括有效數(shù)據(jù)。
[0008]在另一個實施例中,預(yù)定模式的無效數(shù)據(jù)包括預(yù)定數(shù)量的零。
[0009]依據(jù)一個實施例,在字體文件內(nèi)的表中識別處冗余和非冗余數(shù)據(jù)。應(yīng)用歸零過程以替換所識別的冗余數(shù)據(jù)。對字體文件進(jìn)行壓縮以生成壓縮字體文件。傳送該壓縮字體文件。
[0010]在另一個實施例中,冗余數(shù)據(jù)包括以下中的至少一個:與字體文件中的多個表中的至少一個中的字形相關(guān)聯(lián)的邊框;和軌跡表。
[0011]在另一個實施例中,冗余數(shù)據(jù)包括軌跡表,并且其中該軌跡表包括在該軌跡表內(nèi)條目的起始位置的指示。在一個實施例中,該軌跡表是通過對字形表進(jìn)行掃描來得到的。
[0012]在另一個實施例中,所識別的冗余數(shù)據(jù)被以預(yù)定模式排列的數(shù)據(jù)所替換。在一個實施例中,該預(yù)定模式包括預(yù)定數(shù)量的零。
[0013]依據(jù)一個實施例,接收對包括字體表的字體文件的請求。獲取與該字體表相關(guān)聯(lián)的共享初始概率圖表。[0014]該共享初始概率圖表包括基于所要壓縮的字體表中的字節(jié)流的初始概率估計?;谠摮跏几怕使烙媮韺υ撟止?jié)流進(jìn)行壓縮以生成壓縮字體表。傳送壓縮字體文件。
[0015]在另一個實施例中,使用算術(shù)編碼生成該共享初始概率估計。
[0016]在另一個實施例中,該字節(jié)流包括多個數(shù)位。在一個實施例中,該多個數(shù)位由二進(jìn)制數(shù)字系統(tǒng)表示。在一個實施例中,檢測字節(jié)流中的模式并且自適應(yīng)計算該字節(jié)流中的多個數(shù)位中的一個的概率。
[0017]在另一個實施例中,該字體表包括以下中的一個:字形表;cmap表;緊排表;軌跡表;和名稱表。在一個實施例中,字體表包括軌跡表,并且其中該軌跡表包括在該軌跡表內(nèi)條目的起始位置的指示。在一個實施例中,該軌跡表是通過對字形表進(jìn)行掃描來得到的。
[0018]依據(jù)一個實施例,接收壓縮字體表。獲取與該壓縮字體表相關(guān)聯(lián)的共享初始概率圖表。該共享初始概率圖表包括基于壓縮字體表中的字節(jié)流的初始概率估計?;谠摮跏几怕使烙媽υ撟止?jié)流進(jìn)行解壓縮以生成解壓縮字體表。提供該解壓縮字體表。
[0019]在另一個實施例中,使用算術(shù)編碼來生成該共享初始概率估計。
[0020]在另一個實施例中,該字節(jié)流包括多個數(shù)位。在一個實施例中,該多個數(shù)位由二進(jìn)制數(shù)字系統(tǒng)表示。
[0021]在另一個實施例中,該字體表包括以下中的一個:字形表;cmap表;緊排表;軌跡表;和名稱表。
[0022]依據(jù)一個實施例,接收對包括第一字體表和第二字體表的字體文件的請求?;诘谝蛔煮w表的特性從多個熵編碼器中選擇第一熵編碼器?;诘诙煮w表的特性從多個熵編碼器中選擇第二熵編碼器。第一熵編碼器被應(yīng)用于第一字體表。第二熵編碼器被應(yīng)用于第二字體表。將與第一和第二字體表相對應(yīng)的壓縮數(shù)據(jù)進(jìn)行組合以生成壓縮字體文件。傳送該壓縮字體文件。
[0023]在另一個實施例中,該字體文件進(jìn)一步包括第三字體表,其中沒有任何熵編碼被應(yīng)用于該第三字體表。
[0024]在另一個實施例中,選擇第一熵編碼器包括:執(zhí)行測試以將應(yīng)用于第一字體表的第一熵編碼器與應(yīng)用于第一字體表的第二熵編碼器進(jìn)行比較,并且基于該測試將第一熵編碼器確定為用于第一字體表的最優(yōu)編碼器。
[0025]在另一個實施例中,該測試指:向第一字體表應(yīng)用第一熵編碼器減小了第一字體表的大小。在一個實施例中,第一字體表的特性包括以下中的至少一個:第一字體表的原始大小;第一字體表在測試期間應(yīng)用第一熵編碼器之后的大??;第一字體表的類型;第一字體表的一個或多個內(nèi)容變化;和第一字體表的重要性。在一個實施例中,第一字體表的類型包括以下中的一個:字形表;cmap表;緊排表;軌跡表;和名稱表。
[0026]在另一個實施例中,第一字體表的類型包括軌跡表,并且其中通過該軌跡表是通過對字形表進(jìn)行掃描來得到的。
[0027]依據(jù)一個實施例,接收對包括字體表的字體文件的請求。基于該字體表的特性從多個熵編碼器中選擇熵編碼器。將所選擇的熵編碼器應(yīng)用于字體表。生成包括已經(jīng)對其應(yīng)用了熵編碼器的字體表的壓縮字體文件。傳送該壓縮字體文件。
[0028]在另一個實施例中,該字體文件進(jìn)一步包括第二字體表,其中沒有任何熵編碼被應(yīng)用于該第二字體表。[0029]在另一個實施例中,選擇熵編碼器包括執(zhí)行測試以將應(yīng)用于字體表的所選擇的熵編碼器與應(yīng)用于該字體表的多個熵編碼器中的其它熵編碼器進(jìn)行比較;并且基于該測試將所選擇的熵編碼器確定為用于該字體表的最優(yōu)編碼器。在一個實施例中,該測試指示:向該字體表應(yīng)用所選擇的熵編碼器減小了該字體表的大小。
[0030]在另一個實施例中,該字體表的特性包括以下中的至少一個:字體表的原始大??;字體表在測試期間應(yīng)用熵編碼器之后的大??;字體表的類型;字體表的一個或多個內(nèi)容變化;和字體表的重要性。
[0031]在一個實施例中,該字體表的類型包括以下中的一個:字形表;cmap表;緊排表;軌跡表;和名稱表。
[0032]通過參考以下詳細(xì)描述和附圖,本公開的這些和其它優(yōu)勢對于本領(lǐng)域普通技術(shù)人員將是顯而易見的。
【專利附圖】
【附圖說明】
[0033]圖1示出了依據(jù)實施例的可用來提供字體的通信系統(tǒng);
[0034]圖2示出了依據(jù)實施例的示例性字體服務(wù)的功能組件;
[0035]圖3示出了依據(jù)實施例的示例性用戶設(shè)備的功能組件;
[0036]圖4示出了依據(jù)實施例的示例性網(wǎng)站提供者的示例性組件;
[0037]圖5示出了依據(jù)實施例的在網(wǎng)頁上顯示的多種字體;
[0038]圖6A示出了依據(jù)實施例的示例性字體文件;
[0039]圖6B示出了依據(jù)實施例的示例性冗余數(shù)據(jù);
[0040]圖7是描繪依據(jù)實施例的傳送壓縮字體文件的方法的流程圖;
[0041]圖8是描繪依據(jù)實施例的重構(gòu)壓縮字體文件的方法的流程圖;
[0042]圖9示出了依據(jù)實施例的解壓縮數(shù)據(jù);
[0043]圖10示出了依據(jù)實施例的重構(gòu)字體文件;
[0044]圖11示出了依據(jù)實施例的具有多個字體表的示例性字體文件;
[0045]圖12示出了依據(jù)實施例的多個熵編碼器算法;
[0046]圖13是描繪依據(jù)實施例的應(yīng)用熵編碼器算法的方法的流程圖;
[0047]圖14是描繪依據(jù)實施例的應(yīng)用熵編碼器算法的方法的流程圖;
[0048]圖15是描繪依據(jù)實施例的使用算術(shù)編碼方案壓縮字體文件的方法的流程圖;
[0049]圖16示出了依據(jù)實施例的字節(jié)流和初始概率圖表;
[0050]圖17是描繪依據(jù)實施例的使用算術(shù)編碼方案解壓縮字體文件的方法的流程圖;
[0051]圖18示出了依據(jù)實施例的解壓縮字體表;和
[0052]圖19示出了可以用來實施本發(fā)明的計算機(jī)的組件。
【具體實施方式】
[0053]圖1示出了依據(jù)實施例的可以被用來提供字體的通信系統(tǒng)100。通信系統(tǒng)100包括網(wǎng)絡(luò)102、字體服務(wù)104、用戶設(shè)備106和網(wǎng)站提供者108。通信系統(tǒng)100可以包括多于一個的用戶設(shè)備。這些設(shè)備和/或服務(wù)器使用網(wǎng)絡(luò)102互相通信。
[0054]在圖1的示例性實施例中,網(wǎng)絡(luò)102是因特網(wǎng)。在其它實施例中,網(wǎng)絡(luò)102可以包括多種不同類型的網(wǎng)絡(luò)中的一個或多個,例如企業(yè)內(nèi)部網(wǎng)、局域網(wǎng)(LAN)、廣域網(wǎng)(WAN)、無線網(wǎng)絡(luò)、基于光纖信道的存儲域網(wǎng)絡(luò)(SAN)或以太網(wǎng)。可以使用其它網(wǎng)絡(luò)。替選地,網(wǎng)絡(luò)102可以包括不同類型的網(wǎng)絡(luò)的組合。
[0055]字體服務(wù)104維護(hù)例如可以被用來在網(wǎng)頁上呈現(xiàn)并顯示文本的多種字體并且使得它們可被用戶使用。網(wǎng)站提供者108可以維護(hù)如圖5所示的網(wǎng)站502。替選地,網(wǎng)站502可以由字體服務(wù)104托管或者可以由另一服務(wù)(未示出)托管。
[0056]圖2示出了依據(jù)實施例的示例性字體服務(wù)104的功能組件。字體服務(wù)104包括處理器204和存儲器206。存儲器206包括一個或多個字體文件210。字體服務(wù)104可以包括圖2中未示出的其它組件。在說明性實施例中,字體文件210和相關(guān)字體數(shù)據(jù)存儲在存儲器206內(nèi)的數(shù)據(jù)庫208中。數(shù)據(jù)庫208可以維護(hù)一個或多個字體文件210和相關(guān)字體數(shù)據(jù)。在替選實施例中。字體文件210和字體數(shù)據(jù)可以存儲在遠(yuǎn)離字體服務(wù)104的外部存儲器中。
[0057]圖3示出了依據(jù)實施例的示例性用戶設(shè)備106的功能組件。用戶設(shè)備106包括瀏覽器302、顯示器304和存儲器306。瀏覽器302例如可以是用于經(jīng)由因特網(wǎng)對萬維網(wǎng)站點進(jìn)行訪問的常規(guī)web瀏覽器。顯示器304顯示網(wǎng)頁、圖像和其它信息。例如,采用用戶設(shè)備106的用戶可以使用顯示器304來觀看和/或以其它方式訪問如圖5所示的網(wǎng)站502。
[0058]用戶設(shè)備106可以通過直接(有線)鏈路或無線地連接至網(wǎng)絡(luò)102。用戶設(shè)備106可以具有用于顯示信息的顯示屏(未示出)。例如,用戶設(shè)備106可以是個人計算機(jī)、膝上計算機(jī)、工作站、大型計算機(jī)、諸如無線電話的移動通信設(shè)備、個人數(shù)字助理、蜂窩設(shè)備、膝上計算機(jī)、筆記本、平板設(shè)備、電子書閱讀器等??梢允褂闷渌O(shè)備。
[0059]圖4示出了依據(jù)實施例的示例性網(wǎng)站提供者108的功能組件。網(wǎng)站提供者108包括處理器404和存儲器406。網(wǎng)站提供者108可以包括圖4中未示出的其它組件。網(wǎng)站提供者108可以托管網(wǎng)站502。網(wǎng)站提供者108可以包括服務(wù)器。在替選實施例中,網(wǎng)站502可以由另一設(shè)備和/或服務(wù)器托管。
[0060]圖5示出了依據(jù)實施例的在網(wǎng)頁510上顯示的多種字體。在一個實施例中,網(wǎng)站提供者108托管包括網(wǎng)頁510的網(wǎng)站502。網(wǎng)頁510為采用用戶設(shè)備106的用戶提供使用多種字體呈現(xiàn)的文本的視覺表示。在說明性實施例中,第一字體504可以被應(yīng)用于網(wǎng)頁510內(nèi)的一部分文本;第二字體506可以被應(yīng)用于網(wǎng)頁510內(nèi)的另一部分文本;并且第N字體508可以被應(yīng)用于網(wǎng)頁510內(nèi)的另一部分文本。為了向用戶顯示使用諸如字體504、506或508的特定字體呈現(xiàn)的文本,用戶設(shè)備106接收包含與特定字體相關(guān)的數(shù)據(jù)的相應(yīng)字體文件。在字體文件被用戶設(shè)備106從字體服務(wù)104接收和/或下載并且進(jìn)行緩存或保存(例如,作為cookie)之后,網(wǎng)頁510內(nèi)包含的文本可以使用特定字體進(jìn)行呈現(xiàn)。
[0061]圖6A示出了依據(jù)實施例的示例性字體文件210。字體文件210包含定義字體的一個或多個方面的數(shù)據(jù)。一些數(shù)據(jù)以一個或多個表進(jìn)行組織。此外,字體文件中的一些數(shù)據(jù)是冗余的。在圖6A的說明性實施例中,字體文件210包括多個表601-Α、601-Β、...、601-Ν(此后共同稱作601)。多個表601中的每一個包括相應(yīng)的冗余和非冗余數(shù)據(jù)。第一表(610-Α)包括冗余數(shù)據(jù)602-Α和非冗余數(shù)據(jù)603-Α ;第二表(610-Β)包括冗余數(shù)據(jù)602-Β和非冗余數(shù)據(jù)603-Β ;第N表(610-Ν)包括冗余數(shù)據(jù)602-Ν和非冗余數(shù)據(jù)603-Ν。在字體文件210中可以包括比圖6Α中所描繪的更少或更多的表。字體文件210中的一種或多種類型的冗余數(shù)據(jù)隨后被稱作冗余數(shù)據(jù)602。字體文件210中的一種或多種類型的非冗余數(shù)據(jù)隨后被稱作非冗余數(shù)據(jù)603。
[0062]圖6B示出了依據(jù)實施例的示例性冗余數(shù)據(jù)602。在該說明性實施例中,(字體表601-A中的)冗余數(shù)據(jù)602-A包括軌跡表604,并且(字體表601-B中的)冗余數(shù)據(jù)602-B包括邊框605。在圖6B的說明性實施例中,邊框605包圍字形和/或字母“A”。邊框605可以包圍多個相應(yīng)字母/字符周圍的多個邊框。在一個實施例中,冗余數(shù)據(jù)602-B可以包括用于字形表內(nèi)的字形的一個或多個邊框。
[0063]在圖6B所描繪的說明性實施例中,表601-A包括冗余數(shù)據(jù)602,其包括軌跡表604,并且表601-B包括字形邊框605。表601-A和表601-B可以包括構(gòu)成字體文件210的字形表、軌跡表等中的一個或多個。
[0064]在一個實施例中,軌跡表中的條目包括針對字形的條目。軌跡表604包括指示每個條目的位置(例如,起始位置)或定位的各個條目。例如,軌跡表可以指示針對字母“A”的條目在位置“X”開始。因此,字形以及其位于何處的檢測能夠基于軌跡表來執(zhí)行。軌跡表604可以通過掃描字形表來得到。
[0065]冗余數(shù)據(jù)的一些示例包括:
[0066]字形的邊框-其可以從字形輪廓數(shù)據(jù)得到;
[0067]軌跡表-其可以通過順序掃描字形表并且確定每種字形的大小來得到;
[0068]名稱表的冗余-例如,存在針對第一類型的操作系統(tǒng)(OS)和第二類型的OS的編碼但是具有相同數(shù)據(jù);
[0069]一些標(biāo)志和元數(shù)據(jù)的冗余-例如,垂直量度的三個集合;
[0070]“字符到字形索引映射”或“cmap”表的冗余-例如,如果存在類型12 (4字節(jié)Unicode),則可以從其得到類型4(2字節(jié)Unicode位圖或BMP);
[0071]發(fā)布表的冗余-例如,能夠從諸如字形列表之類的標(biāo)準(zhǔn)表得到多個條目;
[0072]“Kerning”或“緊排”表中的數(shù)據(jù)可能是冗余的,其具有字形定位(GPOS)表中的緊排信息;和
[0073]合成字符中的字形引用。
[0074]在一個實施例中,合成字符中的字形引用可以是標(biāo)準(zhǔn)的,例如“agrave”字符可以由“a”和“grave”組成。
[0075]字體文件中可以包括其它類型的冗余數(shù)據(jù)。
[0076]壓縮
[0077]當(dāng)采用用戶設(shè)備106的用戶請求訪問以觀看網(wǎng)頁510(例如,通過選擇網(wǎng)頁510的統(tǒng)一資源定位符,或者通過其它方法)時,用戶設(shè)備106經(jīng)由網(wǎng)絡(luò)102傳送請求以從字體服務(wù)104獲取字體文件210。
[0078]使用圖7對字體服務(wù)104所執(zhí)行的用于傳送所請求的字體文件的步驟進(jìn)行描述。圖7是描繪依據(jù)實施例的傳送壓縮字體文件的方法的流程圖。在步驟702,在字體文件的表中識別冗余和非冗余數(shù)據(jù)。在對字體文件210進(jìn)行壓縮之前,字體服務(wù)104識別表(例如,第一表601-A)內(nèi)的冗余數(shù)據(jù)(例如,602-A)和非冗余數(shù)據(jù)(例如,603-A)。
[0079]在步驟704,應(yīng)用歸零過程以替換所識別的冗余數(shù)據(jù)。字體服務(wù)104執(zhí)行歸零過程并且替換第一表601-A內(nèi)所識別的冗余數(shù)據(jù)602-A。依據(jù)實施例,所選擇類型的冗余數(shù)據(jù)被相應(yīng)模式的零所替換。例如,軌跡表可以被第一預(yù)定數(shù)量的零所替換,邊框可以被第二預(yù)定數(shù)量的零所替換,等等。如圖6B所描繪的,假設(shè)冗余數(shù)據(jù)602-A包括軌跡表604。被識別為冗余數(shù)據(jù)的表示軌跡表604的數(shù)據(jù)被以預(yù)定模式進(jìn)行排列的數(shù)據(jù)所替換。預(yù)定模式的無效數(shù)據(jù)可以包括預(yù)定數(shù)量的零。在一個實施例中,所識別的冗余數(shù)據(jù)利用預(yù)定數(shù)量的24個零或“0000000000000000”所替換,其對應(yīng)于字體文件210的特定元素。圖9中示出了已經(jīng)被歸零的冗余數(shù)據(jù)的示例。在一個實施例中,預(yù)定模式的無效數(shù)據(jù)906可以對應(yīng)于圖6B所描繪的軌跡表604。在另一個實施例中,冗余數(shù)據(jù)602還可以包括與字體文件210中的多個表中的至少一個中的字形相關(guān)聯(lián)的至少一個邊框605。
[0080]在步驟706,對字體文件進(jìn)行壓縮以生成壓縮字體文件。字體服務(wù)104應(yīng)用熵編碼器算法來壓縮字體文件210。該熵編碼器算法可以是多種熵編碼器算法中的任意一種。這里對選擇熵編碼器算法的方法進(jìn)行描述。在一個實施例中,在壓縮之前執(zhí)行歸零過程。
[0081]在步驟708,傳送壓縮字體文件。字體服務(wù)104經(jīng)由網(wǎng)絡(luò)將壓縮字體文件傳送至用戶設(shè)備106。用戶設(shè)備106可以對壓縮字體文件進(jìn)行緩存或存儲(例如,在存儲器306中)。用戶設(shè)備106隨后使用該字體文件來顯示網(wǎng)頁510。
[0082]在一個實施例中,歸零過程可以有利地使得壓縮效率有所提高,產(chǎn)生更小的壓縮字體文件。
[0083]在一個實施例中,假設(shè)以偏移量2開始提供8字節(jié)的零。這種排列可以表示邊框。然而,另一個位置的8字節(jié)的零則可以對應(yīng)于另一項目。因此,冗余數(shù)據(jù)的位置可以被用來確定冗余數(shù)據(jù)的類型。具體地,字體文件內(nèi)的其它數(shù)據(jù)被用來確定特定字形的邊框數(shù)據(jù)在字體文件內(nèi)的位置。
[0084]冗余數(shù)據(jù)602-A包括以上所描述的任意類型的冗余數(shù)據(jù)。例如,在另一個實施例中,冗余數(shù)據(jù)602-A可以是與字形表中的字形相關(guān)聯(lián)的邊框。字體服務(wù)104因此利用與邊框相關(guān)聯(lián)的第二預(yù)定模式的數(shù)據(jù)替換邊框。例如,字體服務(wù)104可以利用第二預(yù)定數(shù)量的零替換邊框,并且隨后對字體文件210進(jìn)行壓縮。字體服務(wù)104壓縮字體文件210并且將壓縮字體文件傳送至用戶設(shè)備106。
[0085]在一個實施例中,規(guī)則集合包括用于壓縮字體文件以及用于對壓縮字體文件進(jìn)行重構(gòu)的步驟。例如,該規(guī)則集合可以指示如果包括24個零的模式與軌跡表相關(guān)聯(lián),則在重構(gòu)階段將24個零替換為軌跡表。在一個實施例中,字體服務(wù)104和用戶設(shè)備106的壓縮器和解壓縮器分別同意該規(guī)則集合。壓縮器對字體文件運行該規(guī)則集合,并且如果識別出冗余數(shù)據(jù)(例如,軌跡表),則執(zhí)行歸零過程。在一個實施例中,壓縮器可以運行該規(guī)則集合并且在壓縮之前執(zhí)行歸零過程。在可替換實施例中,另一個設(shè)備可以在壓縮之前運行該規(guī)則集合。在一個實施例中,對字體文件中的所有數(shù)據(jù)進(jìn)行分析以確定規(guī)則集合是否能夠被應(yīng)用于字體文件的任意部分。
[0086]解壓縮
[0087]如圖8的流程圖中所描述的,壓縮字體文件在用戶設(shè)備106被接收并且被重構(gòu)。圖8是描繪依據(jù)實施例的對壓縮字體文件進(jìn)行重構(gòu)的方法的流程圖。在步驟802,接收包括壓縮數(shù)據(jù)的壓縮字體文件。包含字體文件210的壓縮字體文件經(jīng)由網(wǎng)絡(luò)102而在用戶設(shè)備106被接收。
[0088]在步驟804,對壓縮數(shù)據(jù)進(jìn)行解壓縮以生成解壓縮數(shù)據(jù)。包括壓縮數(shù)據(jù)的壓縮字體文件210例如由用戶設(shè)備106進(jìn)行解壓縮以生成解壓縮數(shù)據(jù)。如圖9所示,使用解壓縮技術(shù)的用戶設(shè)備106將壓縮數(shù)據(jù)變換為解壓縮數(shù)據(jù)902。依據(jù)一個實施例,解壓縮步驟是熵編碼器的解壓縮步驟。
[0089]在步驟806,嘗試對解壓縮數(shù)據(jù)進(jìn)行驗證。用戶設(shè)備106對解壓縮數(shù)據(jù)902進(jìn)行解釋以便驗證該解壓縮數(shù)據(jù)。在圖9的說明性實施例中,用戶設(shè)備106確定數(shù)據(jù)904包括有效解壓縮數(shù)據(jù)。當(dāng)嘗試對解壓縮數(shù)據(jù)902進(jìn)行驗證時,如步驟808中進(jìn)一步描述的,檢測無效數(shù)據(jù)(連同有效數(shù)據(jù)一起)。
[0090]在步驟808,在解壓縮數(shù)據(jù)內(nèi)檢測與字體文件元素相對應(yīng)的預(yù)定模式的無效數(shù)據(jù)。在解壓縮數(shù)據(jù)902內(nèi),用戶設(shè)備106檢測與字體文件210的元素相對應(yīng)的預(yù)定模式的無效數(shù)據(jù)906。在圖9的說明性實施例中,預(yù)定模式的“0000000000000000”對應(yīng)于字體文件210的特定元素。例如,預(yù)定模式的無效數(shù)據(jù)906可以對應(yīng)于冗余數(shù)據(jù)602。在一個實施例中,無效數(shù)據(jù)906例如指示圖6B所描繪的軌跡表604。在一個實施例中,用戶設(shè)備106中的Iint工具可以檢查解壓縮數(shù)據(jù)902有效還是已經(jīng)被歸零。如果確定了解壓縮數(shù)據(jù)902不是有效的并且已經(jīng)被歸零,則如步驟8010所描述的,對該數(shù)據(jù)進(jìn)行重構(gòu)。
[0091 ] 在一個實施例中,冗余數(shù)據(jù)可以與字體文件的元素相關(guān)聯(lián)。在一個實施例中,該元素包括與字體文件中的字形相關(guān)聯(lián)的邊框605 ;以及軌跡表604中的至少一個。元素的其它示例包括名稱表中的冗余;一些標(biāo)志和元數(shù)據(jù)中的冗余;cmap表中的冗余;發(fā)布表中的冗余;緊排表中的數(shù)據(jù);以及合成字符中的字形引用。
[0092]在一個實施例中,該元素包括估計表604,其中該軌跡表包括在軌跡表內(nèi)條目的起始位置的指示。該軌跡表可以通過掃描字形表來得到。
[0093]依據(jù)一個實施例,字體(例如,OpenType字體或更為一般地,spline字體(SFNT)容器格式中的一種字體)可以包括表的集合。每個表可以具有4字節(jié)標(biāo)簽以及內(nèi)容(例如,字節(jié)序列)。每個表可以包含字體的不同方面。例如,字形表可以包含字體中的字形的輪廓數(shù)據(jù),而cmap表則可以包含字符映射信息。
[0094]在步驟8010,通過將無效數(shù)據(jù)中的至少一些替換為元素而對字體文件進(jìn)行重構(gòu)。在圖9-10的說明性實施例中,用戶設(shè)備106可以通過將無效數(shù)據(jù)906中的至少一些替換為生成重構(gòu)軌跡表1002的相關(guān)聯(lián)元素(例如,軌跡表)來生成重構(gòu)字體文件1001。在一個實施例中,可以使用協(xié)定啟發(fā)式算法來執(zhí)行重構(gòu)。在一個實施例中,可以在重構(gòu)步驟期間確保發(fā)生解壓縮字體文件的有效性。
[0095]在一個實施例中,當(dāng)(例如,在用戶設(shè)備106)重構(gòu)壓縮字體文件時,用戶設(shè)備106可以執(zhí)行一致性檢查。如果數(shù)據(jù)字段不是有效的(由于其已經(jīng)被歸零),則用戶設(shè)備106可以使用算法來重構(gòu)任意缺失數(shù)據(jù),同時確保其與字體文件中的其它數(shù)據(jù)相一致。如果數(shù)據(jù)不是冗余的,則傳送非冗余數(shù)據(jù)而不對其應(yīng)用歸零過程。
[0096]名稱表中的冗余數(shù)據(jù)
[0097]在一個實施例中,字體文件的名稱表中的條目可能是冗余的。各種的族名稱一其中的一些可以從基礎(chǔ)名稱以及字體中諸如權(quán)重的其它信息得到一可以包括冗余數(shù)據(jù)。此外,一些字體文件可以具有用于對權(quán)重、垂直量度等進(jìn)行編碼的多個冗余表。名稱表可以隨各種類型的OS編碼出現(xiàn)。此外,即使當(dāng)格式4的cmap表中的數(shù)據(jù)隨另一個cmap表是冗余的時,也需要格式4的cmap表以符合OpenType規(guī)范。例如,字體可以針對擴(kuò)展Unicode收斂而包含格式12的cmap表。
[0098]當(dāng)對數(shù)據(jù)應(yīng)用過程(例如,歸零過程)時,如果數(shù)據(jù)實際上不是冗余的(例如,如果權(quán)重變體名稱是不常見的),則該數(shù)據(jù)被保留,而不是對其應(yīng)用一個過程(例如,被歸零)。
[0099]例如,假設(shè)字體的名稱不常見并且該字體的屬性無法通過族名稱和權(quán)重進(jìn)行推導(dǎo)。該字體名稱可以是“Fonty Fett”并且在字體名稱中沒有字體權(quán)重等的屬性的指示。"Fonty Fett”可以具有族名稱“Fonty”以及權(quán)重代碼“700”(“加粗”)。在該實施例中,該字體名稱不包含冗余數(shù)據(jù),并且沒有字體名稱的部分被歸零。
[0100]當(dāng)對應(yīng)于“Fonty Fett”字體的字體文件被重構(gòu)時,其導(dǎo)致可以在該字體被接受的所有上下文上所使用的有效字體。例如,該字體可以在OS中被接受而呈現(xiàn)堆疊、嵌入便攜式格式化文件或者其它文件格式中,等等。在用戶設(shè)備106進(jìn)行解壓縮的實施方式中,在數(shù)據(jù)從字體請求返回之后但是在使用該字體進(jìn)行布局、呈現(xiàn)之前,該解壓縮可以在對(冗余和非冗余)數(shù)據(jù)的單次操作中應(yīng)用。在圖5的說明性實施例中,字體文件210被用來在網(wǎng)站510上呈現(xiàn)文本。
[0101]在一個實施例中,歸零過程可能是有利的,因為重構(gòu)字體可能具有更高程度的一致且有效的置信度。在一個實施例中,可以不使用歸零過程來壓縮任意字節(jié)序列,但是僅壓縮有效字體。因此,歸零過程可以僅對有效字體應(yīng)用由此使得安全風(fēng)險最小化。
[0102]通過使用歸零過程,占據(jù)字體文件中的空間的冗余數(shù)據(jù)得以被減少或消除。這進(jìn)一步減少了字體文件傳輸?shù)难舆t。此外,通過使用歸零過程,與偽裝為無效字體的無效或惡意數(shù)據(jù)相關(guān)聯(lián)的安全風(fēng)險得以最小化。
[0103]其它實施例
[0104]在其它實施例中,請求字體文件的明確命令可以被傳送至用戶設(shè)備并且被用戶設(shè)備接收。例如,當(dāng)已經(jīng)識別出冗余數(shù)據(jù)(例如,軌跡表)時,可以使用例如表達(dá)“軌跡表已經(jīng)被移除”的明確命令,代替應(yīng)用歸零過程。
[0105]在又另一個實施例中,可以從涂寫(scratch)定義新的字體格式;其中該新的字體格式不具有現(xiàn)有字體格式所具有的相同冗余源。這樣,可能獲得與現(xiàn)有字體和格式相兼容的字體。
[0106]在其它實施例中,可以對字體文件中的冗余數(shù)據(jù)應(yīng)用過程組合。這些過程可以由任意設(shè)備(例如,利用瀏覽器的設(shè)備)或者任意供應(yīng)字體文件的設(shè)備應(yīng)用。此外,這些過程可以由存儲字體文件的諸如用戶設(shè)備106的本地機(jī)器應(yīng)用。
[0107]在一個實施例中,字體文件的壓縮可以是透明且無損的(B卩,重新構(gòu)成的字體文件在功能上應(yīng)當(dāng)?shù)韧谠凶煮w文件)。例如,重構(gòu)的軌跡表1002可以等同或基本類似于軌跡表604。在一個實施例中,通過在字體文件壓縮之前對字體文件應(yīng)用諸如歸零過程之類的過程。壓縮字體文件的大小被減小。因此,可以提高向用戶設(shè)備傳遞字體文件的速度,可以減小延遲并且可以提聞?wù)w效率。
[0108]依據(jù)一個實施例,字體文件的字體格式是向后兼容的。例如,向后兼容性可以應(yīng)用于由傳真機(jī)、打印機(jī)等所使用的字體。
[0109]可詵擇的熵編碼
[0110]字體文件可以包括多個表(例如,字形表、緊排表、cmap表等)。依據(jù)一個實施例,對于每個不同的表,可以選擇適當(dāng)?shù)撵鼐幋a器并且使用其對表進(jìn)行編碼。例如,如果字體文件包括十二個表,則可能為每個表選擇不同的熵編碼器。在一個實施例中,可以確定相同的熵編碼器可應(yīng)用于且最佳適用于多于一個的表。在另一個實施例中,可以確定對于表中的一個(或多個)不需要熵編碼器。
[0111]依據(jù)圖11所示的實施例,字體表210包括多個表1111-Α,1111-Β,...,1111-Ν。第一表(1111-Α)、第二表(Illl-B)和第N表(Illl-N)隨后共同被稱作表1111。圖12示出了可用于在對字體表進(jìn)行編碼時使用的多個熵編碼器算法。這里將關(guān)于圖13的流程圖中所描述的步驟來對圖11和12進(jìn)行描述。
[0112]圖13是描繪依據(jù)實施例的應(yīng)用熵編碼器算法的方法的流程圖。
[0113]在步驟1302,接收對字體文件的請求,該字體文件包括第一字體表和第二字體表。在圖1和11的說明性實施例中,字體服務(wù)104接收對包括第一字體表Illl-A和第二字體表Illl-B的字體文件210的請求。該請求可以由用戶設(shè)備106發(fā)起并且經(jīng)由網(wǎng)絡(luò)102發(fā)送。
[0114]在步驟1304,基于第一字體表的特性從多種熵編碼器算法中選擇第一熵編碼器。參考圖12,基于第一字體表Illl-A的一個或多個特性從其它熵編碼器算法(例如,第二熵編碼器算法1203-Β,...,第N熵編碼器算法1203-Ν)中選擇第一熵編碼器算法1203-Α。根據(jù)一個實施例,字體文件210中的每個表可以具有不同的特性。
[0115]在步驟1306,基于第二字體表的特性從多種熵編碼器算法中選擇第二熵編碼器?;诘诙煮w表Illl-B的一個或多個特性從其它熵編碼器算法(例如,第一熵編碼器算法1203-Α,...,第N熵編碼器算法1203-Ν)中選擇第二熵編碼器算法1203-Β。如這里所描述的,字體服務(wù)104可以執(zhí)行該選擇。第二熵編碼器算法1203-Β不同于第一熵編碼器算法1203-Α。
[0116]在一個實施例中,在對字體文件210進(jìn)行壓縮之前,可以進(jìn)行試驗或測試以確定哪種熵編碼器算法最佳地適用于多個表1111中的每一個。字體服務(wù)104在試驗期間可以使用各種啟發(fā)式算法或標(biāo)準(zhǔn)來確定要使用哪種熵編碼器算法。這些標(biāo)準(zhǔn)可以包括各種類別,包括進(jìn)行壓縮的時間、網(wǎng)絡(luò)延時以及進(jìn)行解壓縮的時間。對于每個表,可以選擇使得標(biāo)準(zhǔn)的一個或多個類別最優(yōu)化的算法。在一個實施例中,可以向字體文件210中的多個表1111中的每一個應(yīng)用圖12中的所有可用熵編碼器算法1202,并且為每個字體表選擇最佳的熵編碼器算法。在另一個實施例中,所選擇的字體表的特性可以被用來確定并收窄哪個(哪些)熵編碼器算法是最為適合的。例如,對于第一表(1111-Α),可以基于第一表(Illl-A)的特性而確定第一熵編碼器算法(1203-Α)是最為適合的;并且對于第二表(1111-Β),可以基于第二表(Illl-B)的特性而確定第二熵編碼器算法(1203-Β)是最為適合的。類似地,對于每個其余的字體表,可以選擇相應(yīng)的熵編碼器算法。
[0117]在一個實施例中,字體表的特性也可以被用來確定哪個熵編碼器算法是最優(yōu)的。這些特性可以包括以下中的至少一個:字體表的原始大??;字體表在測試期間應(yīng)用第一熵編碼器之后的大??;第一字體表的類型;第一字體表的一個或多個內(nèi)容變化;和第一字體表的重要性。字體表的類型包括以下中的一個:字形表;cmap表;緊排表;軌跡表;和名稱表。字體表可以包括軌跡表,并且該軌跡表可以包括在該軌跡表內(nèi)條目的起始位置的指示。
[0118]例如,為了使得字體大小最小化,可以利用每種、一些或全部可用熵編碼器算法來執(zhí)行試驗壓縮。然后,可以選擇出最優(yōu)的熵編碼器算法(例如,導(dǎo)致最小壓縮大小的熵編碼器算法)。如所描述的,該處理可以對于字體中的每個表進(jìn)行一次。在對字體進(jìn)行壓縮時,字體服務(wù)104可以決定使用哪種熵編碼器算法。
[0119]在步驟1308,對第一字體表應(yīng)用第一熵編碼器。第一熵編碼器算法1203-A被字體服務(wù)104應(yīng)用于第一字體表1111-A,生成第一壓縮數(shù)據(jù)。
[0120]在步驟1310,對第二字體表應(yīng)用第二熵編碼器。第二熵編碼器算法1203-B被字體服務(wù)104應(yīng)用于第二字體表1111-B,生成第二壓縮數(shù)據(jù)。
[0121]相應(yīng)地,當(dāng)接收到對字體文件210的請求時,對于該字體文件中的每個字體表,選擇熵編碼器算法并且對其加以應(yīng)用。每個表可以利用不同的低水平熵編碼器算法進(jìn)行壓縮。
[0122]在步驟1312,將與第一和第二字體表相對應(yīng)的壓縮數(shù)據(jù)進(jìn)行組合以生成壓縮字體文件。通過字體服務(wù)104將與第一字體表1lll-A和第二字體表1lll-B相對應(yīng)的壓縮數(shù)據(jù)組合以生成壓縮字體文件。
[0123]在步驟1314,傳送該壓縮字體文件。該壓縮字體文件從字體服務(wù)104經(jīng)由網(wǎng)絡(luò)102被傳送至用戶設(shè)備106。在一個實施例中,如果在步驟1302處對字體文件的請求是對web字體文件的請求,則該web字體可以被存儲在字體服務(wù)104上并且壓縮的web字體文件可以在用戶設(shè)備106進(jìn)行請求時使用web協(xié)議(例如,超文本傳輸協(xié)議(HTTP))通過網(wǎng)絡(luò)102被傳送至用戶設(shè)備106。用戶設(shè)備106接收該壓縮字體文件并且對其進(jìn)行解壓縮,并且使用該字體文件來顯示文本。
[0124]圖14是描繪依據(jù)實施例的應(yīng)用熵編碼器算法的方法的流程圖。
[0125]在步驟1402,接收對包括字體表的字體文件的請求。在圖1和11的說明性實施例中,字體服務(wù)104接收對包括第一字體`表1lll-A的字體文件210的請求。該請求可以由用戶設(shè)備106發(fā)起并且經(jīng)由網(wǎng)絡(luò)102進(jìn)行發(fā)送。
[0126]在步驟1404,基于字體表的特性從多種熵編碼器算法中選擇熵編碼器。基于第一字體表1lll-A的一個或多個特性從其它熵編碼器算法(例如,第二熵編碼器算法1203-B,…,第N熵編碼器算法1203-N)中選擇第一熵編碼器算法1203-A。根據(jù)一個實施例,字體文件210中的每個表關(guān)于壓縮可以具有不同特性。
[0127]在步驟1406,該熵編碼器被應(yīng)用于字體表。第一熵編碼器算法1203-A被字體服務(wù)104應(yīng)用于第一字體表1111-A。
[0128]在步驟1408,生成壓縮字體文件,其包括具有應(yīng)用于其上的熵編碼器的字體表。通過字體服務(wù)104生成包括第一字體表1lll-A的壓縮字體文件,第一字體表1lll-A具有應(yīng)用于其上的第一編碼器算法1203-A。
[0129]在步驟1410,傳送壓縮字體文件。該壓縮字體文件經(jīng)由網(wǎng)絡(luò)從字體服務(wù)104傳送至用戶設(shè)備106。在一個實施例中,如果在步驟1302處的對字體文件的請求是對web字體文件的請求,則該web字體可以被存儲在字體服務(wù)104上并且壓縮的web字體文件可以在用戶設(shè)備106進(jìn)行請求時使用web協(xié)議(例如,超文本傳輸協(xié)議(HTTP))通過網(wǎng)絡(luò)102被傳送至用戶設(shè)備106。
[0130]為了字體服務(wù)104選擇熵編碼算法以對字體表內(nèi)所包含的數(shù)據(jù)進(jìn)行壓縮,字體服務(wù)104可以進(jìn)行一個或多個測試。例如,字體服務(wù)104可以對每個字體表應(yīng)用各種編碼算法或壓縮算法以對每個字體表確定最優(yōu)的熵編碼算法。在一個實施例中,字體服務(wù)104可以應(yīng)用一些或全部的熵編碼算法以確定哪種熵編碼算法對于特定字體表是最優(yōu)的。此外,字體服務(wù)104可以使用特定字體表的某些特性來收窄全部編碼方案的子集并且應(yīng)用該子集。這可以對所有字體表進(jìn)行重復(fù)。
[0131]依據(jù)圖12所描繪的實施例,選擇第一熵編碼器算法1203-A包括執(zhí)行測試以將應(yīng)用于第一字體表Illl-A的第一熵編碼器算法與應(yīng)用于第一字體表Illl-A的第二熵編碼器算法1203-B進(jìn)行比較。選擇第一熵編碼器算法1203-A還包括基于該測試確定第一熵編碼器算法1203-A為對于第一字體表Illl-A的最優(yōu)編碼器。
[0132]在一個實施例中,該測試可以指示向第一字體表Illl-A應(yīng)用第一熵編碼器算法1203-A提供第一字體表Illl-A大小的減小。通過該測試還可以確定第一熵編碼器算法1203-A可以提供最大的大小減小并且在應(yīng)用于第一字體表Illl-A時可以具有優(yōu)于其它熵編碼器算法的額外優(yōu)勢。
[0133]示例性編碼方案
[0134]根據(jù)一個實施例,一些表可以被組合為單個壓縮流,使得對每個表建立單獨的低水平壓縮器的開銷降低??梢允褂脙蓚€級別的表結(jié)構(gòu)來實施單一壓縮流。第一級別的表可以是壓縮流的序列,每個標(biāo)識出所使用的熵編碼器算法。第二級別的表可以包括用于字體中的每個表的條目,每個均由標(biāo)簽、使用哪個壓縮流的標(biāo)識符、到該流中的偏移量和長度構(gòu)成。
[0135]可以使用的一些其它編碼方案包括:
[0136]Lempel - Ziv - Markov 鏈算法(LZMA)算法
[0137]GNU zip (gzip) Burrows - Wheeler 算法(bzip)和 bzip2
[0138]Burrows - Wheeler 算法(bzip)和 bzip2
[0139]通過HTTP的共享詞典壓縮(SDCH)
[0140]對最優(yōu)壓縮的排序
[0141]在一個實施例中,壓縮的有效性可以取決于數(shù)據(jù)或?qū)ο笤趬嚎s流內(nèi)出現(xiàn)的順序。對數(shù)據(jù)的排序可以被應(yīng)用而使得壓縮最優(yōu)化(例如,字體內(nèi)的表,字體內(nèi)的字形)。字形可以在不影響字體外觀的情況下被重新排序,但是可能需要對表的號碼重新編號以進(jìn)行補(bǔ)償。作為說明性示例,如果具有曲線的字形被彼此分組在一起并且具有直線部分的字形也被彼此分組在一起則可能發(fā)生更好的壓縮。因此,更為優(yōu)化的字形順序可以是“ΑΕΠΠ JKLMNTVWXYZB⑶G0PQRSU”。如果在原始字體中,字形被編號為A=I,B=2,C=3,D=4, E=5,等等。則在更為優(yōu)化的字體中,字形將被重新編號為A=I, B=17, C=18, D=19, E=2,等等。引用個體字形的新字體中的所有表都必須被重新編號而使得在這樣的表中,原始字體中對字形2 (B)的引用在優(yōu)化字體中變?yōu)閷ψ中?7的引用。這樣的表的示例包括cmap (字符映射)、GSUB (字形替換)和GPOS (字形定位)。
[0142]無編碼
[0143]依據(jù)一個實施例,響應(yīng)于接收到對包括第三字體表(B卩,1111-N)的字體文件210的請求,字體服務(wù)104可以確定不應(yīng)當(dāng)應(yīng)用壓縮算法或熵編碼器算法1202來對第三字體表Illl-N進(jìn)行編碼。例如,沒有熵編碼器算法對于第三字體表Illl-N是最優(yōu)的。此外,字體服務(wù)104可以通過執(zhí)行一個或多個測試來確定如果向包括第三字體表Illl-N的數(shù)據(jù)應(yīng)用任意一種熵編碼算法,所導(dǎo)致的壓縮數(shù)據(jù)將在大小方面與原始未壓縮數(shù)據(jù)相比將會更大、等同或稍小。例如,如果第三字體表Illl-N中所包含的數(shù)據(jù)小則可能會發(fā)生這樣的狀況,并且對數(shù)據(jù)進(jìn)行壓縮可能不節(jié)約很多空間或者在時間和成本方面并不值得對數(shù)據(jù)進(jìn)行壓縮。另外,第三表Illl-N可能涉及到超時,并且雖然在過去值得使用編碼算法對其中所包含的數(shù)據(jù)進(jìn)行壓縮,但是字體服務(wù)104考慮到所涉及的表可以確定不再值得壓縮數(shù)據(jù)。因此,字體服務(wù)104確定沒有任何熵編碼被應(yīng)用于第三字體表1111-N。
[0144]解壓縮
[0145]包括壓縮數(shù)據(jù)的壓縮字體文件210例如被用戶設(shè)備106進(jìn)行解壓縮以生成解壓縮數(shù)據(jù)。用戶設(shè)備106使用(與用來壓縮數(shù)據(jù)的壓縮技術(shù)相匹配的)解壓縮技術(shù)將壓縮數(shù)據(jù)變換為解壓縮數(shù)據(jù)。用戶設(shè)備基于壓縮字體中存儲的選擇數(shù)據(jù)來選擇熵編碼器技術(shù)進(jìn)行解壓縮。由于不同熵編碼技術(shù)對于字體內(nèi)的不同表可能是最優(yōu)的,所以依據(jù)一個實施例,用戶設(shè)備基于字體中的多個選擇數(shù)據(jù)條目來為每個表選擇熵編碼技術(shù)。
[0146]在一個實施例中,由于解壓縮可能耗費時間和中央處理單元(CPU)負(fù)載(例如,對于實現(xiàn)更高壓縮比的更為先進(jìn)的熵編碼器算法而言),所以用戶設(shè)備106可以在本地緩存中存儲字體文件的非壓縮版本。例如,如果用戶設(shè)備106正在訪問網(wǎng)站提供商108所托管的網(wǎng)站(通過選擇、訪問和/或點擊瀏覽器302,和/或向瀏覽器302鍵入網(wǎng)站名稱),則用戶設(shè)備106可以將用來呈現(xiàn)網(wǎng)站上所包含文本的字體文件的非壓縮版本存儲在本地緩存(例如,存儲器306)中以便減少時間。因此,在初始使用時,總體時間由于網(wǎng)絡(luò)延時可以被最小化所以能夠進(jìn)行優(yōu)化,并且在后續(xù)從緩存使用時,總體時間可以由于字體文件將已經(jīng)是非壓縮的而可以有所優(yōu)化。
[0147]字體文件可以在服務(wù)器側(cè)進(jìn)行壓縮,并且字體文件可以在瀏覽器中解壓縮。這例如可以被移動電話和/或移動瀏覽器在平臺或者諸如圖書閱讀器的應(yīng)用中使用。
[0148]使用web字體可以使得能夠有比過去視覺上更為豐富且具有語意含義的網(wǎng)站,而這需要字體被預(yù)先安裝在用戶系統(tǒng)上并且被限于預(yù)先安裝的字體。
[0149]每個表的共享詞典編碼
[0150]依據(jù)一個實施例,可以對字體文件中的每個表運行單獨的平緩(f late Xgzip )流。
[0151]通過HTTP的共享詞典壓縮可以預(yù)先為壓縮詞典播種有可能出現(xiàn)在流中的串。在壓縮期間,對該串進(jìn)行引用。在一個實施例中,SDCH可以在字體服務(wù)104和用戶設(shè)備106之間共享。SDCH例如可以將一部分串分配給數(shù)字代碼。如果串是短語,則該短語可以被代碼“110”替代。使用SDCH的字體服務(wù)104和用戶設(shè)備106辨識出代碼“ 110”每次被使用都引用該短語。
[0152]可以使用其它技術(shù)以便提高壓縮效率。依據(jù)一個實施例,可以對每個字節(jié)流使用共享初始概率圖表。如圖11所示,第一表(1111-A)、第二表(Illl-B)和第N表(Illl-N沖的每個包括相應(yīng)的字節(jié)流1114-A、1114-B和1114-N?;谧止?jié)流1114_A、1114-B和1114-N的特性進(jìn)行預(yù)定計算。每個字節(jié)流可以包括數(shù)據(jù)。該數(shù)據(jù)可以以任意形式表示。在一個實施例中,該字節(jié)流包括多個數(shù)位并且其中該多個數(shù)位由二進(jìn)制數(shù)字系統(tǒng)表示。因此,該字節(jié)流可以包括多個數(shù)位。
[0153]圖15是描繪依據(jù)實施例的使用算術(shù)編碼方案對字體文件進(jìn)行壓縮的方法的流程圖。這里將參考圖11和16對圖15的流程圖進(jìn)行描述。
[0154]在步驟1502,接收對包括字體表的字體文件的請求。從用戶設(shè)備106經(jīng)由網(wǎng)絡(luò)102所發(fā)送的對字體文件210的請求在字體服務(wù)104被接收。如圖11和16所描繪的,字體文件210包括第一表1111-A,其包括字節(jié)流1114-A。在圖16所描繪的實施例中,字節(jié)流1114-A可以包括某些數(shù)位模式(1601、1602、1603和1604)。
[0155]在步驟1504,獲取與該字體表相關(guān)聯(lián)的共享初始概率圖表,其中該共享初始概率圖表包括基于所要壓縮的字體表中的字節(jié)流的初始概率估計。與第一字體表Illl-A相關(guān)聯(lián)的共享初始概率圖表1610由字體服務(wù)104獲取。共享初始概率圖表1610包括基于所要壓縮的字體表210中的字節(jié)流1114-A的初始概率估計1621。該共享初始概率圖表(或預(yù)先播種的概率圖表)例如在壓縮前使用以便提高壓縮效率。
[0156]用于算術(shù)編碼和壓縮的預(yù)先播種的概率圖表
[0157]用于算術(shù)編碼和壓縮的初始概率圖表或預(yù)先播種的概率圖表是一種可作為SDCH的變體的編碼方案。在一個實施例中,當(dāng)開始每個流(例如,每個表1111)的壓縮時,將范圍編碼器的概率表初始化為已經(jīng)依據(jù)經(jīng)驗確定(例如,通過對所要壓縮的流的語料庫進(jìn)行分析)為最優(yōu)值的值。在一個實施例中,共享初始概率圖表可以在字體服務(wù)104和用戶設(shè)備106之間進(jìn)行共享。字體文件210中的每個表可以具有包括共享初始概率圖表的唯一詞典。
[0158]在一個實施例中,共享初始概率圖表包括可以通過分析與所要壓縮的字節(jié)流內(nèi)的O和I比特相關(guān)聯(lián)的概率來得到的初始概率估計。該初始概率估計可以使用算術(shù)編碼得到。
[0159]算術(shù)編碼
[0160]某些模式可能出現(xiàn)在字節(jié)流1114-A中。例如,當(dāng)字節(jié)流1114-A由二進(jìn)制數(shù)字系統(tǒng)表示時,可能有包含在字節(jié)流中的某種模式的O和I。因此,存在與字節(jié)流中所包含的每個數(shù)位相關(guān)聯(lián)的概率。例如,存在數(shù)位或比特將為I的概率以及該比特將為O的概率。與字節(jié)流相關(guān)聯(lián)的數(shù)位的概率被稱為初始概率估計。如圖16所描繪的,在初始概率圖表1610中,存在與字節(jié)流1114-A中的第一數(shù)位1601相關(guān)聯(lián)的初始概率估計1621(例如,該數(shù)位將為“O”的概率20%)。此外,這指示了存在該數(shù)位將為“I”的概率80%。替選地,初始概率估計可以指示數(shù)位為“I”的概率或者可以包括該數(shù)位為“O”或者“I”的概率。在另一個實施例中,在使用不同基數(shù)(例如,非二進(jìn)制)數(shù)字系統(tǒng)的情況下,初始概率估計可以包括與兩個或更多數(shù)位相關(guān)聯(lián)的概率。如這里所描述的,字節(jié)流中的多個數(shù)位中的一個的概率被自適應(yīng)地計算。
[0161]參考圖16,初始概率圖表1610通過初始概率估計1622指示字節(jié)流1114-A中的第二數(shù)位1602有95%可能為數(shù)位“O”。初始概率估計1622基于各種因素計算。在一個實施例中,因素中的一個可以是該字節(jié)流中的之前數(shù)位的狀態(tài)。
[0162]類似地,初始概率圖表1610通過初始概率估計1623指示字節(jié)流1114-A中的第三數(shù)位1603有87%可能為數(shù)位“O”。如字節(jié)流1114-A所示出的,該估計是準(zhǔn)確的。
[0163]然而,該估計可能并非始終是準(zhǔn)確的。初始概率圖表1610通過初始概率估計1624指示字節(jié)流1114-A中的第四數(shù)位1604有35%可能為數(shù)位“O”。因此,該第四數(shù)位1604更可能為數(shù)位“I”。然而,該估計并不準(zhǔn)確,因為第四數(shù)位1604實際上為數(shù)位“O”。在確定估計中的錯誤之后,對算術(shù)編碼方案進(jìn)行適當(dāng)調(diào)節(jié)以便確定對應(yīng)于后續(xù)數(shù)位的概率估計。
[0164]自話應(yīng)筧術(shù)編碼
[0165]在一個實施例中,通過對字節(jié)流1114-A進(jìn)行分析,某些模式可以被檢測并且被用來自適應(yīng)地計算概率。例如,如果在模式中檢測到多個“O”數(shù)位,則該編碼自適應(yīng)地學(xué)習(xí)到在該模式結(jié)束之后,下一個數(shù)位為“I”的概率為0-P,其中P是下一個數(shù)位將為“O”的概率。自適應(yīng)算術(shù)編碼可以先驗的。也就是說,自適應(yīng)算術(shù)編碼基于直到當(dāng)前數(shù)位的相對數(shù)位序列已經(jīng)成為的內(nèi)容而隨時間估計下一個數(shù)位的概率。
[0166]返回參考圖15,在步驟1506,基于初始概率估計對字節(jié)流進(jìn)行壓縮以生成壓縮字體表。字節(jié)流1114-A (具體地是第一數(shù)位1601)由字體服務(wù)104基于初始概率估計1621進(jìn)行壓縮以生成壓縮字體表。
[0167]共享初始概率圖表1610在對包括字節(jié)流1114-A的第一字體表Illl-A的壓縮期間被使用。初始概率估計1621可以基于字節(jié)流1114-A。在一個實施例中,字體表210中的每個表可以使用對應(yīng)于相應(yīng)表的共享初始概率圖表以相似方式進(jìn)行壓縮。字體服務(wù)104和用戶設(shè)備106可以關(guān)于共享初始概率圖表進(jìn)行協(xié)定以應(yīng)用于每種類型的表。例如,在字體文件中可能有多個表并且每個表(例如,軌跡表、字形表等)可以使用唯一的初始概率圖表。在一個實施例中,可以確定所有類型的某種表(例如,所有軌跡表)可以使用相同的初始概率圖表;并且所有字形表使用與用于其它類型的表(例如,軌跡表,cmap表等)的初始概率圖表不同的相同初始概率圖表。
[0168]為了為某種類型的表確定最優(yōu)的初始概率圖表,可以對字體表(例如,軌跡表)應(yīng)用算術(shù)編碼算法。該算術(shù)編碼算法因此可以被應(yīng)用于不同字體文件的相同類型的字體表(例如,軌跡表)。對于所測試的所有字體表確定自適應(yīng)概率計算并且取所有相同類型的字體表的平均值。該平均值然后被用來構(gòu)建初始概率圖表。該平均值指示更為準(zhǔn)確的概率估計,因為它是對相同類型的若干字體表運行算術(shù)編碼算法的結(jié)果。在一個實施例中,對于任意字體文件的該特定類型的字體表(例如,軌跡表)的每個實例使用初始概率圖表。如以上所描述的,該初始概率圖表在字體服務(wù)104和用戶設(shè)備106之間進(jìn)行共享。
[0169]字體服務(wù)104已了解包含在字節(jié)流內(nèi)的實際數(shù)位。然而,用戶設(shè)備106不知道該實際數(shù)位,而是使用初始概率圖表來估計該數(shù)位的概率。因此,字體服務(wù)104和用戶設(shè)備106協(xié)定包含初始概率圖表的初始SDCH詞典以便對壓縮/解壓縮進(jìn)行初始化。
[0170]在替選實施例中,包含初始概率圖表的新詞典可以從字體服務(wù)104傳送至用戶設(shè)備106。這例如可以在進(jìn)行更新并且字體服務(wù)104希望與用戶設(shè)備106同步新數(shù)據(jù)和/或新算法的情況下進(jìn)行。
[0171]在一個實施例中,用于每個表的共享初始概率圖表可以是唯一的。在壓縮之后,壓縮字體表然后可以被組合以生成壓縮字體文件。
[0172]在步驟1508,傳送該壓縮字體文件。字體服務(wù)104經(jīng)由網(wǎng)絡(luò)102將該壓縮字體文件傳送至用戶設(shè)備106。用戶設(shè)備106可以將壓縮字體文件進(jìn)行緩存或存儲(例如,在存儲器306中)。
[0173]在一個實施例中,通過使用初始概率估計,字節(jié)流1114-A的壓縮效率有所提高并且概率估計因此被更新。字節(jié)流1114-A基于初始概率估計進(jìn)行壓縮以生成壓縮字體表。
[0174]解壓縮
[0175]當(dāng)用戶設(shè)備106接收到已經(jīng)對其應(yīng)用了算術(shù)編碼的壓縮字體數(shù)據(jù)時,對該壓縮字體數(shù)據(jù)進(jìn)行解壓縮。圖17描繪了依據(jù)實施例的使用算術(shù)編碼方案對字體文件進(jìn)行解壓縮的方法。
[0176]在步驟1702,接收壓縮字體表。用戶設(shè)備106接收該壓縮字體表。例如,用戶設(shè)備106可以在請求字體文件210之后接收壓縮字體表,其包括第一字體表Illl-A的壓縮版本。用戶設(shè)備106可以請求壓縮字體表以向采用用戶設(shè)備106的用戶提供圖5所示的網(wǎng)頁510的顯示。用戶可能希望觀看使用包含該字體的字體文件所呈現(xiàn)的文本。
[0177]在步驟1704,獲取與壓縮字體表相關(guān)聯(lián)的共享初始概率圖表,其中該共享初始概率圖表包括基于壓縮字體表中的字節(jié)流的初始概率估計。在用戶設(shè)備106獲取與壓縮字體表相關(guān)聯(lián)的共享初始概率圖表1610。共享初始概率圖表包括基于第一壓縮字體表中的字節(jié)流1114-A的初始概率估計。共享初始概率圖表1610可以在用戶設(shè)備106和字體服務(wù)104之間進(jìn)行共享并且可以由用戶設(shè)備106在本地進(jìn)行緩存。
[0178]在步驟1706,基于初始概率估計對字節(jié)流進(jìn)行解壓縮以生成解壓縮字體表。如圖18所示,基于(初始概率圖表1610中所示的)初始概率估計對字節(jié)流1814進(jìn)行解壓縮以生成解壓縮字體表1811。
[0179]在解壓縮的同時,初始概率估計對壓縮字體數(shù)據(jù)中的第一數(shù)位的概率進(jìn)行估計。落在第一間隔之間的任意數(shù)字等于第一數(shù)位,而落在第二間隔之間的任意數(shù)字則等于第二數(shù)位。例如,落在I和0.8之間的任意數(shù)字將為數(shù)位“O”而落在0.8和I之間的任意數(shù)字將為數(shù)位“I”。通過估計數(shù)位的概率對壓縮字體數(shù)據(jù)進(jìn)行解壓縮。由于概率僅是估計而并不是數(shù)位的實際識別,因此可能會有不準(zhǔn)確估計的機(jī)會。假設(shè)形成了數(shù)位為數(shù)位“O”或數(shù)位“ I ”的不準(zhǔn)確估計,則不準(zhǔn)確估計的成本會是最低的。
[0180]在一個實施例中,如果初始概率表在字體服務(wù)104和用戶設(shè)備106之間進(jìn)行共享,則相同的初始概率估計則至少在最初被應(yīng)用于壓縮數(shù)據(jù)。因此,用戶設(shè)備106使用共享初始概率表對字體文件進(jìn)行解碼和推導(dǎo)。
[0181]用戶設(shè)備106使用解壓縮的字體文件來顯示文本。例如,解壓縮的字體表1811被用來提供使用網(wǎng)頁(例如,圖5中的網(wǎng)頁510)內(nèi)的字體呈現(xiàn)的文本的顯示。在一個實施例中,表1811基本上類似于表210。因此,在接收字體表中存在最小化(或沒有)誤差。
[0182]通過使用自適應(yīng)算術(shù)編碼,字體的壓縮可以通過提供較小的壓縮字體文件而節(jié)約空間。這可以使得通過網(wǎng)絡(luò)傳輸字體的延時較小。此外,這會加速壓縮和解壓縮,同時呈現(xiàn)包含字體的復(fù)雜文檔或網(wǎng)站。這尤其可應(yīng)用于web字體。當(dāng)然,自適應(yīng)算術(shù)編碼和共享初始概率圖表可以被用于提供字體以外的其它用途。例如,其可以被用來對應(yīng)用包文件內(nèi)的不同元素進(jìn)行壓縮。根據(jù)一個實施例,一個初始概率表可以被用于XML資源數(shù)據(jù),而另一個則被用于Dalvik可執(zhí)行(.dex)文件,并且再另一個則被用于諸如圖像的資產(chǎn)。
[0183]在各個實施例中,這里所描述的包括圖7、8、13、14、15和17中所描述的方法步驟在內(nèi)的方法步驟可以以與所描述或示出的特定順序不同的順序來執(zhí)行。在其它實施例中,可以提供其它步驟,或者可以從所描述的方法中消除步驟。
[0184]這里所描述的系統(tǒng)、裝置和方法可以使用數(shù)字電路來實施,或者使用一個或多個使用公知計算機(jī)處理器、存儲器單元、存儲設(shè)備、計算機(jī)軟件和其它組件的計算機(jī)來實施。通常,計算機(jī)包括用于執(zhí)行指令的處理器以及用于存儲指令和數(shù)據(jù)的一個或多個存儲器。計算機(jī)還可以包括或者耦接到一個或多個大容量存儲設(shè)備,諸如一個或多個磁盤、內(nèi)部硬盤和可移動潘、磁光盤、光盤等。
[0185]這里所描述的系統(tǒng)、裝置和方法可以使用以客戶端-服務(wù)器關(guān)系進(jìn)行操作的計算機(jī)來實施。通常,在這樣的系統(tǒng)中,客戶端計算機(jī)遠(yuǎn)離服務(wù)器計算機(jī)并且經(jīng)由網(wǎng)絡(luò)進(jìn)行交互??蛻舳?服務(wù)器關(guān)系可以由運行在相應(yīng)客戶端和服務(wù)器計算機(jī)上的計算機(jī)程序定義和控制。
[0186]這里所描述的系統(tǒng)、裝置和方法可以在基于網(wǎng)絡(luò)的云計算系統(tǒng)中使用。在這樣的基于網(wǎng)絡(luò)的云計算系統(tǒng)中,服務(wù)器或者連接到網(wǎng)絡(luò)的另一處理器經(jīng)由網(wǎng)絡(luò)與一個或多個客戶端計算機(jī)進(jìn)行通信??蛻舳擞嬎銠C(jī)例如可以經(jīng)由駐留在客戶端計算機(jī)上并在其上操作的網(wǎng)絡(luò)瀏覽器應(yīng)用與服務(wù)器進(jìn)行通信??蛻舳擞嬎銠C(jī)可以將數(shù)據(jù)存儲在服務(wù)器上并且經(jīng)由網(wǎng)絡(luò)訪問該數(shù)據(jù)??蛻舳擞嬎銠C(jī)可以經(jīng)由網(wǎng)絡(luò)向服務(wù)器傳送對數(shù)據(jù)的請求或者對在線服務(wù)的請求。該服務(wù)器可以執(zhí)行所請求的服務(wù)并且向客戶端計算機(jī)提供數(shù)據(jù)。服務(wù)器還可以傳送適于使得客戶端計算機(jī)執(zhí)行指定功能的數(shù)據(jù),例如執(zhí)行計算、在屏幕上顯示指定數(shù)據(jù)等。例如,服務(wù)器可以傳送適于使得客戶端計算機(jī)執(zhí)行這里所描述的包括圖7、8、13、14、15和17的一個或多個步驟在內(nèi)的一個或多個方法步驟的請求。這里所描述的包括圖7、8、13、14、15和17的一個或多個步驟在內(nèi)的某些方法步驟可以由基于網(wǎng)絡(luò)的云計算系統(tǒng)中的服務(wù)器或另一個處理器執(zhí)行。這里所描述的包括圖7、8、13、14、15和17的一個或多個步驟在內(nèi)的某些方法步驟可以由基于網(wǎng)絡(luò)的云計算系統(tǒng)中的客戶端計算機(jī)來執(zhí)行。這里所描述的包括圖
7、8、13、14、15和17的一個或多個步驟在內(nèi)的方法步驟可以由基于網(wǎng)絡(luò)的云計算系統(tǒng)中的服務(wù)器和/或客戶端計算機(jī)以任意組合形式來執(zhí)行。
[0187]這里所描述的系統(tǒng)、裝置和方法可以使用有形地實現(xiàn)于例如非易失性機(jī)器可讀存儲設(shè)備的信息載體中的計算機(jī)程序產(chǎn)品來實施,例如由可編程處理器來執(zhí)行;并且這里所描述的包括圖7、8、13、14、15和17的一個或多個步驟在內(nèi)的方法步驟可以使用可由這樣的處理器執(zhí)行的一個或多個計算機(jī)程序來實施。計算機(jī)程序是能夠在計算機(jī)中直接或間接地使用來執(zhí)行某個活動或者導(dǎo)致某個結(jié)果的計算機(jī)程序指令的集合。計算機(jī)程序可以以任意形式的編程語言進(jìn)行編寫,包括編譯或解釋語言,并且其能夠以任意形式進(jìn)行部署,包括作為獨立程序或者作為用于在計算環(huán)境中使用的模塊、組件、子例程或其它單元。
[0188]圖19中圖示了可以用來實施這里所描述的系統(tǒng)、裝置和方法的示例性計算機(jī)的高級別框圖。計算機(jī)1900包括操作地耦接至數(shù)據(jù)存儲設(shè)備1902和存儲器1903的處理器1901。處理器1901通過執(zhí)行定義這樣的操作的計算機(jī)程序指令來控制計算機(jī)1900的整體操作。計算機(jī)程序指令可以存儲在數(shù)據(jù)存儲設(shè)備1902或者其它計算機(jī)可讀介質(zhì)中,并且在期望執(zhí)行計算機(jī)程序指令時被加載到存儲器1903中。因此,圖7、8、13、14、15和17的方法步驟能夠由計算機(jī)程序指令定義,所述計算機(jī)程序指令存儲在存儲器1903和/或數(shù)據(jù)存儲設(shè)備1902中并且由執(zhí)行該計算機(jī)程序指令的處理器1901控制。例如,計算機(jī)程序指令可以被實施為由本領(lǐng)域技術(shù)人員進(jìn)行編程以執(zhí)行圖7、8、13、14、15和17的方法步驟所定義的算法的計算機(jī)可執(zhí)行代碼。因此,通過執(zhí)行計算機(jī)程序指令,處理器1901執(zhí)行圖7、8、13、
14、15和17的方法步驟所定義的算法。計算機(jī)1900還包括用于經(jīng)由網(wǎng)絡(luò)與其它設(shè)備進(jìn)行通信的一個或多個網(wǎng)絡(luò)接口 1904。計算機(jī)1900還包括使得用戶能夠與計算機(jī)1900進(jìn)行交互的一個或多個輸入/輸出設(shè)備1905 (例如,顯不器、鍵盤、鼠標(biāo)、揚(yáng)聲器、按鈕等)。
[0189]處理器1901可以包括通用和專用微處理器,并且可以是計算機(jī)1900的單個處理器或多個處理器之一。處理器1901例如可以包括一個或多個中央處理單元(CPU)。處理器1901、數(shù)據(jù)存儲設(shè)備1902和/或存儲器1903可以包括一個或多個專用集成電路(ASIC)和/或一個或多個現(xiàn)場可編程門陣列(FPGA),被它們補(bǔ)充或者結(jié)合于其中。[0190]數(shù)據(jù)存儲設(shè)備1902和存儲器1903每一個包括有形的非易失性計算機(jī)可讀存儲介質(zhì)。數(shù)據(jù)存儲設(shè)備1902和存儲器1903每一個可以包括高速隨機(jī)存取存儲器,諸如動態(tài)隨機(jī)存取存儲器(DRAM)、靜態(tài)隨機(jī)存取存儲器(SRAM)、雙倍數(shù)據(jù)速率同步動態(tài)隨機(jī)存取存儲器(DDRRAM)或者其它隨機(jī)存取固態(tài)存儲設(shè)備,并且可以包括非易失性存儲器,諸如一個或多個磁盤存儲設(shè)備,諸如內(nèi)部硬盤和可移動盤、磁光盤存儲設(shè)備、光盤存儲設(shè)備、閃存設(shè)備、半導(dǎo)體存儲器設(shè)備,諸如可擦除可編程只讀存儲器(EPR0M)、電可擦除可編程只讀存儲器(EEPROM)、壓縮盤只讀存儲器(⑶-ROM)、數(shù)字多功能盤只讀存儲器(DVD-ROM)或者其它非易失性固態(tài)存儲設(shè)備。
[0191]輸入/輸出設(shè)備1905可以包括諸如打印機(jī)、掃描儀、顯示屏等的外圍設(shè)備。例如,輸入/輸出設(shè)備1905可以包括諸如陰極射線管(CRT)或液晶顯示器(IXD)監(jiān)視器之類的用于向用戶顯示信息的顯示設(shè)備、鍵盤以及諸如鼠標(biāo)或軌跡球之類的用戶能夠通過其向計算機(jī)1900提供輸入的指示設(shè)備。
[0192]包括字體服務(wù)104、網(wǎng)站提供者108、用戶設(shè)備106在內(nèi)的任意或所有在此討論的系統(tǒng)和裝置及其包括處理器204、存儲器206、數(shù)據(jù)庫208、字體文件210、瀏覽器302、顯示器304、存儲器306、處理器404和存儲器406的組件可以使用諸如計算機(jī)1900的計算機(jī)來實施。
[0193]本領(lǐng)域技術(shù)人員將會認(rèn)識到,實際計算機(jī)或計算機(jī)系統(tǒng)的實施方式可以具有其它結(jié)構(gòu)或者還可以包含其它組件,并且圖19是用于說明目的的這樣的計算機(jī)的一些組件的聞級別表不。
[0194]以上詳細(xì)描述應(yīng)被理解為在每個方面都是說明性和示例性而并非是限制性的,并且這里所公開的本發(fā)明的范圍并非從詳細(xì)描述進(jìn)行確定,而是從如根據(jù)專利法所允許的完全寬度進(jìn)行解釋的權(quán)利要求所確定。所要理解的是,這里所示出并描述的實施例僅是本發(fā)明的原理的說明并且本領(lǐng)域技術(shù)人員可以實施各種修改而并不背離本發(fā)明的精神和范圍。本領(lǐng)域技術(shù)人員能夠?qū)嵤└鞣N其它特征組合而并不背離本發(fā)明的精神和范圍。
【權(quán)利要求】
1.一種方法,包括: 接收包括壓縮數(shù)據(jù)的壓縮字體文件; 對所述壓縮數(shù)據(jù)進(jìn)行解壓縮以生成解壓縮數(shù)據(jù); 嘗試對所述解壓縮數(shù)據(jù)進(jìn)行驗證; 在所述解壓縮數(shù)據(jù)內(nèi)檢測與字體文件的元素相對應(yīng)的預(yù)定模式的無效數(shù)據(jù);以及 通過利用所述元素對至少一些所述無效數(shù)據(jù)進(jìn)行替換來對所述字體文件進(jìn)行重構(gòu)。
2.根據(jù)權(quán)利要求1的方法,其中所述元素包括以下中的至少一個: 與所述字體文件中的字形相關(guān)聯(lián)的邊框;和 軌跡表。
3.根據(jù)權(quán)利要求2的方法,其中所述元素包括所述軌跡表,并且其中所述軌跡表包括在所述軌跡表內(nèi)條目的起始位置的指示。
4.根據(jù)權(quán)利要求3的方法,其中所述軌跡表是通過對字形表進(jìn)行掃描來得到的。
5.根據(jù)權(quán)利要求1的方法,進(jìn)一步包括: 在所述解壓縮數(shù)據(jù)內(nèi)檢測有效數(shù)據(jù)。
6.根據(jù)權(quán)利要求5的方法,其中對所述字體文件進(jìn)行重構(gòu)進(jìn)一步包括: 對所述字體文件進(jìn)行重構(gòu)以包括所述有效數(shù)據(jù)。
7.根據(jù)權(quán)利要求1的方法,其中所述預(yù)定模式的無效數(shù)據(jù)包括預(yù)定數(shù)量的零。
8.一種方法,包括: 在字體文件內(nèi)的表中識別冗余和非冗余數(shù)據(jù); 應(yīng)用歸零過程以替換所識別的冗余數(shù)據(jù); 對所述字體文件進(jìn)行壓縮以生成壓縮字體文件;以及 傳送所述壓縮字體文件。
9.根據(jù)權(quán)利要求8的方法,其中所述冗余數(shù)據(jù)包括以下中的至少一個: 與所述字體文件中的多個表中的至少一個中的字形相關(guān)聯(lián)的邊框;和 軌跡表。
10.根據(jù)權(quán)利要求8的方法,其中所述冗余數(shù)據(jù)包括所述軌跡表,并且其中所述軌跡表包括在所述軌跡表內(nèi)條目的起始位置的指示。
11.根據(jù)權(quán)利要求10的方法,其中所述軌跡表是通過對字形表進(jìn)行掃描來得到的。
12.根據(jù)權(quán)利要求8的方法,其中所識別的冗余數(shù)據(jù)被用預(yù)定模式排列的數(shù)據(jù)替換。
13.根據(jù)權(quán)利要求12的方法,其中所述預(yù)定模式包括預(yù)定數(shù)量的零。
14.一種存儲計算機(jī)程序指令的非易失性計算機(jī)可讀介質(zhì),當(dāng)在處理器上執(zhí)行時,所述計算機(jī)程序指令使得所述處理器執(zhí)行一種方法,所述方法包括: 接收包括壓縮數(shù)據(jù)的壓縮字體文件; 對所述壓縮數(shù)據(jù)進(jìn)行解壓縮以生成解壓縮數(shù)據(jù); 嘗試對所述解壓縮數(shù)據(jù)進(jìn)行驗證; 在所述解壓縮數(shù)據(jù)內(nèi)檢測與字體文件的元素相對應(yīng)的預(yù)定模式的無效數(shù)據(jù);以及 通過利用所述元素對至少一些所述無效數(shù)據(jù)進(jìn)行替換來對所述字體文件進(jìn)行重構(gòu)。
15.根據(jù)權(quán)利要求14的非易失性計算機(jī)可讀介質(zhì),其中所述元素包括以下中的至少一個:與所述字體文件中的字形相關(guān)聯(lián)的邊框;和 軌跡表。
16.根據(jù)權(quán)利要求15的非易失性計算機(jī)可讀介質(zhì),其中所述元素包括所述軌跡表,并且其中所述軌跡表包括在所述軌跡表內(nèi)條目的起始位置的指示。
17.根據(jù)權(quán)利要求16的非易失性計算機(jī)可讀介質(zhì),其中所述軌跡表是通過對字形表進(jìn)行掃描來得到的。
18.根據(jù)權(quán)利要求14的非易失性計算機(jī)可讀介質(zhì),進(jìn)一步包括定義以下步驟的指令: 在所述解壓縮數(shù)據(jù)內(nèi)檢測有效數(shù)據(jù)。
19.根據(jù)權(quán)利要求18的非易失性計算機(jī)可讀介質(zhì),其中對所述字體文件進(jìn)行重構(gòu)進(jìn)一步包括: 對所述字體文件進(jìn)行重構(gòu)以包括所述有效數(shù)據(jù)。
20.根據(jù)權(quán)利要求14的非易失性計算機(jī)可讀介質(zhì),其中所述預(yù)定模式的無效數(shù)據(jù)包括預(yù)定數(shù)量的零。
21.—種方法,包括: 接收對包括字體表的字體文件的請求; 獲取與所述字體表相關(guān)聯(lián)的共享初始概率圖表,所述共享初始概率圖表包括基于所要壓縮的所述字體表中的字節(jié)流的初始概率估計; 基于所述初始概率估計對所述字節(jié)流進(jìn)行壓縮以生成壓縮字體表;以及 傳送所述壓縮字體文件。
22.根據(jù)權(quán)利要求21的方法`,進(jìn)一步包括: 使用算術(shù)編碼生成所述共享初始概率估計。
23.根據(jù)權(quán)利要求21的方法,其中所述字節(jié)流包括多個數(shù)位。
24.根據(jù)權(quán)利要求23的方法,其中所述多個數(shù)位由二進(jìn)制數(shù)字系統(tǒng)表示。
25.根據(jù)權(quán)利要求23的方法,進(jìn)一步包括: 檢測所述字節(jié)流中的模式;以及 自適應(yīng)地計算所述字節(jié)流中的所述多個數(shù)位中的一個的概率。
26.根據(jù)權(quán)利要求21的方法,其中所述字體表包括以下中的一個: 字形表; cmap 表; 緊排表; 軌跡表;和 名稱表。
27.根據(jù)權(quán)利要求26的方法,其中所述字體表包括所述軌跡表,并且其中所述軌跡表包括在所述軌跡表內(nèi)條目的起始位置的指示。
28.根據(jù)權(quán)利要求27的方法,其中所述軌跡表是通過對字形表進(jìn)行掃描來得到的。
29.—種方法,包括: 接收壓縮字體表; 獲取與所述壓縮字體表相關(guān)聯(lián)的共享初始概率圖表,所述共享初始概率圖表包括基于所述壓縮字體表中的字節(jié)流的初始概率估計;基于所述初始概率估計對所述字節(jié)流進(jìn)行解壓縮以生成解壓縮字體表;以及 提供所述解壓縮字體表。
30.根據(jù)權(quán)利要求29的方法,其中所述共享初始概率估計是使用算術(shù)編碼來生成的。
31.根據(jù)權(quán)利要求29的方法,其中所述字節(jié)流包括多個數(shù)位。
32.根據(jù)權(quán)利要求31的方法,其中所述多個數(shù)位由二進(jìn)制數(shù)字系統(tǒng)表示。
33.根據(jù)權(quán)利要求29的方法,其中所述字體表包括以下中的一個: 字形表; cmap 表; 緊排表; 軌跡表;和 名稱表。
34.一種存儲計算機(jī)程序指令的非易失性計算機(jī)可讀介質(zhì),當(dāng)在處理器上執(zhí)行時,所述計算機(jī)程序指令使得所述處理器執(zhí)行一種方法,所述方法包括: 接收對包括字體表的字體文件的請求; 獲取與所述字體表相關(guān)聯(lián)的共享初始概率圖表,所述共享初始概率圖表包括基于所要壓縮的所述字體表中的字節(jié)流的初始概率估計; 基于所述初始概率估計對所述字節(jié)流進(jìn)行壓縮以生成壓縮字體表;以及 傳送所述壓縮字體文件。
35.根據(jù)權(quán)利要求34的非易失性計算機(jī)可讀介質(zhì),進(jìn)一步包括定義以下步驟的指令: 使用算術(shù)編碼來生成所述共享初始概率估計。
36.根據(jù)權(quán)利要求34的非易失性計算機(jī)可讀介質(zhì),其中所述字節(jié)流包括多個數(shù)位。
37.根據(jù)權(quán)利要求36的非易失性計算機(jī)可讀介質(zhì),其中所述多個數(shù)位由二進(jìn)制數(shù)字系統(tǒng)表示。
38.根據(jù)權(quán)利要求36的非易失性計算機(jī)可讀介質(zhì),進(jìn)一步包括定義以下步驟的指令: 檢測所述字節(jié)流中的模式;以及 自適應(yīng)地計算所述字節(jié)流中的所述多個數(shù)位中的一個的概率。
39.根據(jù)權(quán)利要求34的非易失性計算機(jī)可讀介質(zhì),其中所述字體表包括以下中的一個: 字形表; cmap 表; 緊排表; 軌跡表;和 名稱表。
40.根據(jù)權(quán)利要求39的非易失性計算機(jī)可讀介質(zhì),其中所述字體表包括所述軌跡表,并且其中所述軌跡表包括在所述軌跡表內(nèi)條目的起始位置的指示。
41.一種方法,包括: 接收對包括第一字體表和第二字體表的字體文件的請求; 基于所述第一字體表的特性從多個熵編碼器中選擇第一熵編碼器; 基于所述第二字體表的特性從所述多個熵編碼器中選擇第二熵編碼器;將所述第一熵編碼器應(yīng)用于所述第一字體表; 將所述第二熵編碼器應(yīng)用于所述第二字體表; 將與所述第一和第二字體表相對應(yīng)的壓縮數(shù)據(jù)進(jìn)行組合以生成壓縮字體文件;以及 傳送所述壓縮字體文件。
42.根據(jù)權(quán)利要求41的方法,其中所述字體文件進(jìn)一步包括第三字體表,其中沒有任何熵編碼被應(yīng)用于所述第三字體表。
43.根據(jù)權(quán)利要求41的方法,其中選擇第一熵編碼器包括: 執(zhí)行測試以將應(yīng)用于所述第一字體表的所述第一熵編碼器與應(yīng)用于所述第一字體表的所述第二熵編碼器進(jìn)行比較,并且基于所述測試將所述第一熵編碼器確定為用于所述第一字體表的最優(yōu)編碼器。
44.根據(jù)權(quán)利要求43的方法,其中所述測試指示:向所述第一字體表應(yīng)用所述第一熵編碼器減小了所述第一字體表的大小。
45.根據(jù)權(quán)利要求44的方法,其中所述第一字體表的所述特性包括以下中的至少一個: 所述第一字體表的原始大??; 所述第一字體表在所述測試期間應(yīng)用所述第一熵編碼器之后的大?。? 所述第一字體表的類型; 所述第一字體表的一個或多個內(nèi)容`變化;和 所述第一字體表的重要性。
46.根據(jù)權(quán)利要求45的方法,其中所述第一字體表的類型包括以下中的一個: 字形表; cmap 表; 緊排表; 軌跡表;和 名稱表。
47.根據(jù)權(quán)利要求46的方法,其中所述第一字體表的類型包括所述軌跡表,并且其中所述軌跡表是通過對字形表進(jìn)行掃描來得到的。
48.一種方法,包括: 接收對包括字體表的字體文件的請求; 基于所述字體表的特性從多個熵編碼器中選擇熵編碼器; 將所選擇的熵編碼器應(yīng)用于所述字體表; 生成包括已經(jīng)對其應(yīng)用了所述熵編碼器的所述字體表的壓縮字體文件;以及 傳送所述壓縮字體文件。
49.根據(jù)權(quán)利要求48的方法,其中所述字體文件進(jìn)一步包括第二字體表,其中沒有任何熵編碼被應(yīng)用于所述第二字體表。
50.根據(jù)權(quán)利要求48的方法,其中選擇熵編碼器包括: 執(zhí)行測試以將應(yīng)用于所述字體表的所選擇的熵編碼器與應(yīng)用于所述字體表的所述多個熵編碼器中的其它熵編碼器進(jìn)行比較;以及 基于所述測試將所選擇的熵編碼器確定為用于所述字體表的最優(yōu)編碼器。
51.根據(jù)權(quán)利要求50的方法,其中所述測試指示:向所述字體表應(yīng)用所選擇的熵編碼器減小了所述字體表的大小。
52.根據(jù)權(quán)利要求51的方法,其中所述字體表的所述特性包括以下中的至少一個: 所述字體表的原始大??; 所述字體表在所述測試期間應(yīng)用所述熵編碼器之后的大??; 所述字體表的類型; 所述字體表的一個或多個內(nèi)容變化;和 所述字體表的重要性。
53.根據(jù)權(quán)利要求52的方法,其中所述字體表的類型包括以下中的一個: 字形表; cmap 表; 緊排表; 軌跡表;和 名稱表。
54.一種存儲 計算機(jī)程序指令的非易失性計算機(jī)可讀介質(zhì),當(dāng)在處理器上執(zhí)行時,所述計算機(jī)程序指令使得所述處理器執(zhí)行一種方法,所述方法包括: 接收對包括第一字體表和第二字體表的字體文件的請求; 基于所述第一字體表的特性從多個熵編碼器中選擇第一熵編碼器; 基于所述第二字體表的特性從所述多個熵編碼器中選擇第二熵編碼器; 將所述第一熵編碼器應(yīng)用于所述第一字體表; 將所述第二熵編碼器應(yīng)用于所述第二字體表; 將與所述第一和第二字體表相對應(yīng)的壓縮數(shù)據(jù)進(jìn)行組合以生成壓縮字體文件;以及 傳送所述壓縮字體文件。
55.根據(jù)權(quán)利要求54的非易失性計算機(jī)可讀介質(zhì),其中所述字體文件進(jìn)一步包括第三字體表,其中沒有任何熵編碼被應(yīng)用于所述第三字體表。
56.根據(jù)權(quán)利要求54的非易失性計算機(jī)可讀介質(zhì),進(jìn)一步包括定義以下步驟的指令: 執(zhí)行測試以將應(yīng)用于所述第一字體表的所選擇的第一熵編碼器與應(yīng)用于所述第一字體表的所述第二熵編碼器進(jìn)行比較;以及 基于所述測試將所述第一熵編碼器確定為用于所述第一字體表的最優(yōu)編碼器。
57.根據(jù)權(quán)利要求56的非易失性計算機(jī)可讀介質(zhì),其中所述測試指示:向所述第一字體表應(yīng)用所述第一熵編碼器減小了所述第一字體表的大小。
58.根據(jù)權(quán)利要求57的非易失性計算機(jī)可讀介質(zhì),其中所述第一字體表的所述特性包括以下中的至少一個: 所述第一字體表的原始大?。? 所述第一字體表在測試期間應(yīng)用所述第一熵編碼器之后的大??; 所述第一字體表的類型; 所述第一字體表的一個或多個內(nèi)容變化;和 所述第一字體表的重要性。
59.根據(jù)權(quán)利要求58的非易失性計算機(jī)可讀介質(zhì),其中所述第一字體表的類型包括以下中的一個: 字形表; cmap 表; 緊排表; 軌跡表;和 名稱表。
60.根據(jù)權(quán)利要求59的非易失性計算機(jī)可讀介質(zhì),其中所述第一字體表的類型包括所述軌跡表,并且其中所述軌跡表是通過`對字形表進(jìn)行掃描來得到的。
【文檔編號】G06F17/21GK103890754SQ201280051119
【公開日】2014年6月25日 申請日期:2012年8月23日 優(yōu)先權(quán)日:2011年8月24日
【發(fā)明者】戴維·庫特爾, 拉斐爾·萊納斯·萊維恩 申請人:谷歌公司