远程字体管理的制作方法

文档序号:11935165阅读:216来源:国知局
远程字体管理的制作方法与工艺

字体被计算设备用来使用字样(typeface)的特定大小、磅值和样式来表示文本,诸如使用打印机打印文本,在显示设备上示出文本等等。还可以生成具有不同处理(例如,斜体、粗体等等)的字体。

用户可以访问可以用来支持文本的丰富显示的数千种字体。然而,存储这些字体并且向用户以及希望使用该字体查看文本(例如,指定特定字体的文档)的其他用户传送这些字体可能消耗计算设备的显著数量的资源,其可能由于支持查看数百甚至数千个字符的字体而加剧。



技术实现要素:

描述了远程字体管理技术。在一个或多个实施方式中,通过计算设备经由网络获得远程定位的一个或多个布局表,其对应于与使用字体输出文本的请求相关联的字体。文本的布局使用所获得的一个或多个布局表通过计算设备来生成,以标识文本的输出中所涉及的依赖字形。通过计算设备经由网络从远离计算设备定位的字体文件获得所标识的字形,并且使用所获得的字形通过计算设备来渲染文本。

在一个或多个实施方式中,通过计算设备获得与关于来自第一字体文件的第一字体的请求有关的数据。第一字体文件可通过计算设备经由网络远程访问,并且请求涉及文本的显示。由计算设备选择第二字体,其中对应的第二字体文件的至少部分本地存储在计算设备处,这些部分可用作所请求的第一字体的数据的替代。在一段时间的至少一部分期间,使用对应的第二字体文件的部分以所选择的第二字体来渲染文本,在该一段时间的至少一部分期间,可通过计算设备远程访问的所获得的数据不能在本地用于渲染文本。响应于所获得的数据在计算设备处本地用于渲染文本的可访问性,使用所获得的数据来渲染文本。

在一个或多个实施方式中,一种系统包括至少部分地以硬件实施的一个或多个模块。一个或多个模块被配置成执行操作,这些操作包括:经由网络获得远程定位的一个或多个布局表,该一个或多个布局表对应于与使用字体输出文本的请求相关联的字体,并且使用所获得的一个或多个布局表生成文本的布局来标识文本的输出中所涉及的依赖字形。这些操作还包括:响应于所述生成,经由网络从远离计算设备定位的字体文件获得所标识的字形,并且使用所获得的字形渲染文本。

提供本发明内容以便以简化形式介绍以下在具体实施方式中进一步描述的概念的选择。本发明内容不旨在标识所要求保护的主题的关键特征或必要特征,也不旨在用于帮助确定所要求保护的主题的范围。

附图说明

参考附图描述具体实施方式。在图中,附图标记的一个或多个最左边的数字标识该附图标记首次出现的图。在说明书和图中的不同实例中使用相同的附图标记可以指示相似或相同的项。在图中表示的实体可以指示一个或多个实体,并且因此可以可交换地参照讨论中的实体的单个或复数形式。

图1是可操作来采用本文中所描述的字体管理技术的示例实施方式中的环境的图示。

图2描绘了示例实施方式中的系统,其中,字体相关数据经由网络流传输到计算设备以用于渲染文本。

图3是描绘示例实施方式中的过程的流程图,其中,使用一个或多个布局表生成布局以标识通过计算设备要获得哪些字形来渲染文本。

图4描绘了示例实施方式中的系统,其中,字体回退技术被用作字体流传输和管理的一部分。

图5是描绘示例实施方式中的过程的流程图,其中,本地可用字体用作替代,同时远程字体在本地不可用。

图6和图7示出了创建用于字形依赖性示图的依赖性列表的示例。

图8图示了包括示例设备的各种组件的示例系统,该示例设备可以被实施为如参照图1至图7所描述的任何类型的计算设备以实施本文中所描述的技术的实施例。

具体实施方式

概述

字体的多样性不断增加,因此在使用常规技术存储和传送这些字体中消耗的资源量也在增加。因而,描述了字体管理技术,其可以被配置成以可以用来节省计算设备和网络资源的方式在传送和分布与字体有关的数据中利用网络存储。

例如,可以采用字体提供方模块(例如,作为插件软件组件)来下载针对字体集合和字体文件数据的元数据,诸如布局表。字体提供方模块可以被配置成首先下载与要用于显示特定选择的文本的字体有关的元数据,例如,文档、网页等。然后,元数据可以用作字体匹配的一部分来标识字体和对应的字体文件。

然后,字体文件的标识可以用来获得一个或多个布局表,该一个或多个布局表可用于生成如应用于文本的字体的布局,以通过从布局表构建字形依赖性示图来标识要在渲染文本中涉及的字形。然后,可以经由网络远程地获得这些所标识的字形并且以稀疏文件格式保存以用于渲染文本,并且还可以被用作跨进程的字体缓存的一部分而用于渲染其它文本。这样,计算设备可以从要被利用的字体文件获得字形,而不获得并不使用的字形,从而在获得和存储字体有关数据中节省网络和计算设备资源。

附加地,还可以采用回退技术,诸如从而在获得如上文所描述的元数据、字形等的同时替代本地可用字体。因此,用户可以查看文本而不用等待获得字体有关数据,并且一旦获得,可以使用所获得的数据渲染文本。这些和其它特征的进一步讨论可以在以下部分中找到。

在下面的讨论中,首先描述可以采用本文中所描述的技术的示例环境。然后描述示例过程,其可以在示例环境以及其它环境中执行。结果,示例过程的执行不限于示例环境,并且示例环境不限于示例过程的执行。

以下讨论描述了可以利用先前描述的系统和设备来实施的远程字体管理技术。每个过程的各方面可以以硬件、固件或软件或其组合来实施。该过程被示出为指定由一个或多个设备执行的操作的一组方框,并且不一定限于所示出的用于由相应方框执行操作的顺序。在以下讨论的部分中,将参照如上文所描述的图。

关于图1至图7的示例描述的功能性、特征和概念可以用于本文中所描述的过程的上下文中。进一步地,下文关于不同过程描述的功能性、特征和概念可以在不同过程之间互换,并且不限于在单个过程的上下文中实施。此外,与不同的代表性过程和本文中的对应的图相关联的方框可以以不同的方式一起应用和/或组合。因此,关于本文中的不同示例环境、设备、组件和过程描述的各个功能性、特征和概念可以以任何合适的组合来使用,并且不限于由所枚举的示例所表示的特定组合。

示例环境

图1是可操作以采用本文中所描述的字体管理技术的示例实施方式中的环境100的图示。所图示的环境100包括经由网络106通信地耦接到服务提供方104(例如,web服务)的计算设备102。计算设备102以及可以实施服务提供方104的计算设备可以以多种方式配置。

例如,计算设备可以被配置为能够通过网络106进行通信的计算机,该计算机的所图示的示例包括台式计算机、移动站、娱乐器具、通信地耦接到显示设备的机顶盒、无线电话、游戏控制台等等。因此,计算设备102的范围可以从具有大量存储器和处理器资源的全资源设备(例如,个人计算机、游戏控制台)到具有有限存储器和/或处理资源的低资源设备(例如,传统机顶盒、手持游戏控制台)。附加地,尽管示出了单个计算设备102,但是计算设备102可以表示多个不同的设备,诸如由企业用来执行操作的多个服务器,诸如通过服务提供方104、遥控器和机顶盒组合、图像捕获设备和被配置成捕获手势的游戏控制台等等来执行。

尽管网络106被图示为因特网,但是网络可以采取广泛多种的配置。例如,网络106可以包括广域网(WAN)、局域网(LAN)、无线网络、公共电话网络、内联网等等。进一步地,尽管示出了单个网络106,但是网络106可以被配置成包括多个网络。

计算设备102被图示为包括多种硬件组件,其示例包括处理系统108,被图示为存储器110的计算机可读存储媒体的示例,还可以包括如在所图示的示例中所示出的显示设备等等。处理系统108表示通过执行存储在存储器110中的指令来执行操作的功能性。尽管进行了单独图示,但是这些组件的功能性可以被进一步划分、组合(例如,在专用集成电路上)等等。

计算设备102被进一步图示为包括操作系统112。操作系统112被配置成将计算设备102的底层功能性抽象到在计算设备102上可执行的应用114。例如,操作系统112可以抽象计算设备102的处理系统104、存储器106、网络连接和/或显示设备功能性,使得可以在不知道“如何”实施这个底层功能性的情况下编写应用114。比如,应用114可以向操作系统112提供要渲染的数据,而并不理解将如何执行该渲染。操作系统112还可以表示多种其它功能性,诸如来管理可由计算设备102的用户导航的文件系统和用户接口。

计算设备102还被图示为包括字体提供方模块116、字体缓存模块118和字体缓存120。服务提供方104被图示为包括字体管理器模块122和包括在存储装置126中的一个或多个字体文件124。同时,由这些组件表示的功能性可以用于最小化计算设备102的资源消耗,但仍然提供对大字体库的访问。这意味着相同的文本可以在如所图示的不同类别的设备上精确地再现,而与在每个设备上本地安装什么字体无关。

再现文档保真度的现有途径要么具有随文档一起的嵌入的字体,要么引用外部资源。然而,嵌入途径增加了文档的存储大小。虽然这可以通过创建字体的子集版本来缓解,但是该子集是具有与原始文件不同的字符支持和布局的新的不同资源,意味着在该现有途径中缓存逻辑出局。进一步地,因为子集不包含原始字体的完全覆盖,所以对文档的任何附加编辑可能找不到字符,从而使得在该现有途径中嵌入是仅供查看的解决方案。

对于web文档,现有途径典型地使用层叠样式表(CSS)经由URL来引用自定义字体,其可以基于消费者具有有效的网络连接的假设而针对网页和web应用很好地工作。然而,这种常规的CSS解决方案仅仅以浏览器内部的内容为目标。附加地,因为现有系统API被设计成一次性消费并且一次期望整个文件,所以在每个实例中下载潜在的大文件。

尽管压缩技术可以用于减小文件大小,但是在一些实例中,使用整个文件可能涉及数百甚至数千个字符。子集的创建还可以应用于web字体以减小大小和带宽,然而,与单个独立文档相比较,选择哪些字符要用于创建子集对于网站可能更复杂,因为网站可能包含多数网页、多种语言,以及甚至动态内容。进一步地,使用这种常规技术处理多个子集变型还可能使CSS变得复杂并且减慢在浏览器中的匹配进程。

除了再现单个已知字体资源的保真度之外,还可能期望支持发现哪些附加字体资源可用于选择的能力。尽管一些现有途径支持查询web API的可用字体资源以及直接枚举和下载可用字体资源的能力,但是该功能性限于执行下载然后全局安装字体或仅仅在进程内使用该字体的应用本身。本地安装在该常规技术中意味着这种字体现在永久安装,没有自动清理管理可以来告知用户哪些字体来自哪里。另一方面,常规的进程内的使用不支持跨进程共享利益,并且可能涉及来自计算设备上的每个应用的冗余带宽,而不是要使用相同资源。

因而,所图示的环境100可以被配置成支持可以解决和克服这些常规限制的多种功能性。例如,字体提供方模块116可以被配置为插件软件组件,其可以用于经由网络106从字体文件124远程下载元数据和其它数据(诸如布局表),该元数据和其它数据可以用于扩展字体流传输以支持不同的字体服务。

字体缓存模块118可以用于支持跨进程的字体缓存功能性,使得字体集合元数据、布局表和字形可以从服务提供方104一次下载并且由多个应用114使用。例如,来自字体文件124的元数据和/或布局表可以与字体文件124的字形分开下载,并且甚至各个字形本身可以根据需要下载,而不下载整个字体文件124。字体缓存模块118然后可以追踪字体文件124的哪些部分是本地的,并且与字体提供方模块116通信以获得任何期望的部分。进一步地,可以使用具有字体回退的非阻塞设计和可以利用稀疏文件来节省存储空间的字体下载队列来存储该数据。

进一步地,下载请求可以包括文件和文件范围,也包括诸如字符和字形之类的更高级信息。例如,可以使用依赖性示图来执行对要下载的哪些字形的标识,并且因此可以用于提高下载效率。比如,字体流传输可以使用关于Unicode的信息和关于字体格式的信息来智能地将字符请求转换为字形请求,以及将字形请求转换为文件范围请求。这也可以考虑可能在文本布局期间发生的字形替代和添加,并且可以合并有关字符(诸如阿拉伯语)的范围以避免由于部分字体回退而导致的不一致的外观。

图2描绘了示例实施方式中的系统200,其中,字体有关数据经由网络流传输到计算设备以用于渲染文本。图3描绘了示例实施方式中的过程300,其中,从一个或多个布局表生成布局以标识哪些字形由计算设备获得来渲染文本。对这两个附图的讨论在下面并行地进行。

字体由文件、一组文件或文件的一部分表示。用于字体的标准文件格式的示例是OpenType。OpenType字体文件包括被称为表的一组命名的数据结构,其中每个都有自己的布局和目的。例如,“名称”表指定诸如字体的姓氏(例如,“Helvetica”)的串;“cmap”表将标准Unicode字符映射到被称为字形的特定于字体的形状;“gsub”表指定基于上下文的字形替代(例如,fi连字(ligature)而非分开的f字形和i字形);以及“glyf”表包含字形形状的几何描述。在下文中,参照利用OpenType格式的使用对字体流传输技术进行描述,但是应当显而易见的是,这些技术等同地适用于其它字体格式。

文本典型地在应用或文档中表示为Unicode字符串以及相关联的属性,诸如字体姓氏、字体磅值(例如,粗体)、字体样式(例如,斜体)、字体大小(例如,12点)。附加属性可以包括段落对齐和调整、如小型大写字母和旧式数字的排版特征以及许多其它属性。

通过使用第一阶段202、第二阶段204、第三阶段206、第四阶段208和第五阶段210在图2中示出可执行的以渲染文本的示例阶段。在第一阶段202,通过字体提供方模块116从应用114接收请求212以根据特定字体216渲染文本214。如先前所描述的,字体提供方模块116可以被配置为可由多个应用114访问的插件组件,例如,作为操作系统112的一部分。还可以设想其它示例,诸如将字体提供方模块116的功能性合并为应用114自身的一部分等等。

在第二阶段204,响应于输出字体216中的文本214的请求212,经由网络从服务提供方104远程获得对应于所请求的字体的至少一个字体集合218。比如,字体集合218可以包括字体元数据220,诸如姓氏222、磅值224、样式226等。这样,字体元数据220经由网络106与字体本身分开传送,并且因此可以用于提高效率并且节省网络106以及计算设备102资源。

然后,可以通过搜索至少一个字体集合找到对应于所请求的字体的元数据来执行字体匹配(方框302),并且因此可以用于标识对应于所请求的字体的字体文件。对于字体匹配,将来自请求212的文本214的输入属性(诸如姓氏、磅值和样式)与如在字体集合218的字体元数据220中指定的可用字体的属性进行比较,以找到最接近的匹配。

字体集合218最初由字体提供方模块116填充以获得字体元数据220,而并不实际下载集合中的每个字体。例如,字体提供方模块116可以以JavaScript® Object Notation(JSON)或另一格式来下载包含针对大量字体的字体元数据220的单个文件。

一旦字体集合218已经被初始化,字体缓存模块120就可以将字体集合218缓存在字体缓存120中用于随后重用。因此,当各个字体文件稍后被应用114或其它应用需要时,这些字体文件也由字体提供方模块116下载并且由字体缓存模块118缓存在字体缓存120中。

在第三阶段206,通过计算设备经由网络获得远程定位的一个或多个布局表,其对应于与使用字体输出文本的请求相关联的字体(方框304)。继续先前的示例,字体元数据220可以用于定位对应于所请求的字体216的特定字体文件124。然后,可以经由网络106远程获得来自字体文件124的布局表228,并且还将该布局表228提供给字体缓存模块118以用于存储在字体缓存120中,例如,供其它应用使用。

在第四阶段208,使用所找到的布局表228来生成文本的布局和字形依赖性,以标识文本的输出中所涉及的字形。例如,可以通过使用一个或多个布局表将输入字形映射到输出字形来生成依赖性示图(方框305)。附加地,可以使用依赖性示图生成文本的布局,以标识文本的输出中所涉及的字形(方框306)。

比如,图示了文本布局模块230,其表示可以将布局表228接受作为输入以生成文本214的布局230的功能性,该功能性可以使用如下文所描述的依赖性示图来执行。因此,文本布局模块228可以利用布局表228来确定文本214的布局232和尺寸以标识要在文本的渲染中使用的字形234,而并不通过构建字形依赖性示图实际下载那些字形。

例如,文本布局模块230可以将字符代码映射到字形ID,该字形ID是字符的特定于字体的表示。还使用字体中的度量来计算作为布局232的一部分的字形位置。基于文本属性、语言文字(script)(例如,阿拉伯文)和字体中的信息,其它字形可以替代标称(nominal)字形。附加地,可以执行换行,并且字形可以作为字符连接(例如,连字号字符)和调整(例如,连接如阿拉伯文之类的语言文字的字符)的结果来添加。因此,如由文本布局模块230输出的布局232被用于标识要渲染的字形234以及字形234在文本214的布局232中的相应位置。

在第五阶段210,经由网络106从对应于字体的字体文件124(例如,从服务提供方104)中远程获得所标识的字形234(方框308)。因此,获得实际上被标识为用于渲染文本214的字形234,而并不获得不使用的字形,从而节省网络106和计算设备102资源。

然后,使用所获得的字形渲染文本(方框310)。如上文所描述的,由文本布局进程产生的字形ID用于定位字体中的字形数据。字形数据典型地将字形轮廓的形状指定为一系列曲线。它还可以包括针对不同大小或分辨率而优化形状的提示指令。一些字体在“glyf”表中使用TrueType轮廓和提示,而其它字体在“CFF”表中使用PostScript轮廓和提示。附加地,字体可以包含针对特定大小的字形位图。进一步地,渲染字形可以取决于其它字形,因为:(1)TrueType字形可以被定义为其它字形的组合,以及(2)多色字形可以通过将不同颜色的字形层叠在彼此的顶部上来定义。

因此,在该示例中,字体提供方模块116和字体缓存模块118结合经由服务提供方104的字体文件124的远程存储可以有效地传送和管理哪些数据被传送和维护以渲染特定字体中的文本,而并不获得不在该渲染中使用的数据。因为该数据可以经由网络106从服务提供方104流传输到计算设备102,所以可以采用回退技术来减少输出文本以供用户查看的延迟,其进一步的讨论可以在下面的描述中找到并且在对应的图中示出。

图4描绘了示例实施方式中的系统400,其中,字体回退技术被用作字体流传输和管理的一部分。使用第一阶段402、第二阶段404和第三阶段406图示系统400。图5描绘了示例实施方式中的过程500,其中,描述了字体回退技术,其中,本地可用字体用作替代,而远程字体在本地不可用。对这两个附图的讨论在下文并行地进行。在下文中,描述了字体回退技术,其中,如果字体数据在本地不可用于计算设备102,则可以替代以不同的字体,直到该数据在本地可用于计算设备102为止。这可以以多种方式实施,诸如在与图2和图3所描述的字体匹配所不同的步骤中,可以作为字体匹配的组成部分来执行等等。例如,字体回退可以发生在将字符转换为字形ID之后。

通过计算设备获得与关于来自第一字体文件的第一字体的请求有关的数据。第一字体文件可通过计算设备经由网络远程访问,并且该请求涉及文本的显示(方框502)。如在第一阶段402处所示出的,字体提供方模块116可以从服务提供方104的字体管理器模块112请求非本地字体数据408。非本地字体数据408可以以多种方式配置,诸如具有字体元数据220的字体集合218、用于标识字形的布局表228以及所标识的字形234本身等等。因此,字体提供方模块116可以请求非本地字体数据408经由网络106从服务提供方104流传输到计算设备102。

该数据的流传输可能花费一定量的时间,如此,非本地字体数据408可能在计算设备102处本地不可用。因而,字体回退模块410表示执行如在第二阶段404处所图示的字体回退412技术的操作系统112的功能性。例如,字体回退模块410可以选择第二字体,其中,对应的第二字体文件的至少部分本地存储在计算设备处,这些部分可用作所请求的第一字体的数据的替代(方框504)。这可以包括替代的字体文件、字形等等。在一段时间的至少一部分期间,使用对应的第二字体文件的部分来以所选择的第二字体来渲染文本,在该一段时间的至少一部分期间,可通过计算设备远程访问的所获得的数据在本地不可用于渲染文本(方框506)。这样,用户不是被迫等待,直到非本地字体数据408成为可用的为止,而是可以通过利用第二字体文件立即查看该文本。

在第三阶段408,非本地字体数据414在计算设备102处成为本地可用的,并且因此可以通过字体回退模块410提供给应用114。因此,响应于所获得的数据在计算设备处本地用来渲染文本的可访问性,使用所获得的数据来渲染文本(方框508)。比如,应用114可以提供该非本地字体数据412以供操作系统112渲染。还设想了其中应用114不知道这种替代、并且相反,该回退功能性被抽象出作为操作系统112的一部分的其它示例。

因此,出于本地性的原因,可以发生字体回退。如果最佳匹配字体文件是经由网络106远程的(即,不在字体缓存中),则替代地由字体提供方模块116选择本地回退字体。字体还可以是部分远程的。也就是说,文件的一些部分可以是本地的(在字体缓存120中),而其它部分是远程的,例如,不在字体缓存120中。如果是这样,则字体回退模块410查询字体缓存模块118以检测用于绘制文本的所指定的字符的字体文件的部分是否在本地缓存,并且选择回退字体以绘制非本地字符。

回退也可以发生在字符转换为字形之后,在这种情况下,字体缓存模块118确定所标识的字形是否是本地的,并且如果不是,则回退。在由于本地性而发生回退的任何情况下,可以创建包括字体的身份以及所标识的远程字符或字形的下载请求。然后可以将下载请求添加到传递到字体提供方模块116的字体下载队列。

注意,上述进程并不阻塞数据的下载。这确保了绘图文本是高效的,尽管文本可以以与所请求的字体不同的字体绘制。如果发生由于缺少本地性而导致的回退,则下载请求作为附带后果被添加到字体下载队列。在方便的时候,应用114(或字体提供方模块116)可以请求所排队的下载请求被执行。然后,字体提供方模块116在后台下载所请求的字体数据,并且通过使用字体缓存模块118将其缓存在字体缓存120中。可以在下载完成时通知应用114,此时应用114可以使得文本被使用新的本地数据绘制。

例如,应用114可以以多种字体绘制整个文本页面。页面上的一些文本可以使用远程字体、字符或字形,在这种情况下,使用本地回退字体,并且将下载请求添加到字体下载队列。在绘制页面之后,应用114请求在字体提供方模块116的队列中的下载请求的执行。字体提供方模块116然后在后台下载数据并且将其缓存在字体缓存120中。在下载完成时通知应用114,此时它重绘页面。在第二遍绘图时,所请求的字符和字形中的每个都是本地的,因此不会发生回退。

再次返回到图1,字体提供方模块116是由字体缓存模块118和字体缓存120使用以从服务提供方104的字体文件124下载字体集合元数据和字体文件数据的组件。字体缓存模块118可以包括可用提供方的列表。这些可以包括作为字体流传输实施方式的一部分的内置提供方、通过安装机制添加的可插入提供方或两者。每个提供方由提供方ID标识,该提供方ID可以是整数、GUID、字符串或其它唯一值。给定提供方ID,字体缓存模块118可以通过调用方法或诸如消息传递的某种其它机制来实例化对应的提供方并且使用其功能性。字体提供方模块116可以在与字体缓存模块118相同的进程中或在单独的进程中实施。

字体提供方模块116可以被配置成实施具有多种功能的良好定义的接口,其中第一功能是初始化字体集合218。字体集合218由提供方ID和提供方定义的密钥标识。例如,如果字体提供方模块116使得用户能够购买或以其它方式获取字体,则字体集合密钥可以包括用户的帐户名称。如果每个字体提供方模块116被配置成具有单个字体集合,则字体流传输实施方式可以省略提供方定义的字体集合密钥的概念。

用于初始化字体集合的过程可以包括以下:

1.字体缓存使用提供方ID实例化字体提供方。

2.字体缓存调用提供方方法,指定字体集合密钥。

3.字体提供方使用服务所需的任何协议从Web服务或其它字体源下载元数据。

4.提供方解析由字体源返回的数据,并且回调到由字体缓存实施的字体集合“构建器”接口。对于每个字体,提供方指定字体的身份(例如,提供方定义的文件密钥和面部索引)以及相关联的字体属性。

5.当提供方完成时,字体缓存使用经由构建器接口返回的信息构造字体集合的内部表示。

如应当显而易见的,还可以设想上述变型。例如,取代了代替在步骤2中直接下载信息,字体提供方模块116可以向字体缓存模块118返回下载信息(例如,URI等),字体缓存模块118会执行下载并且将结果传递回提供方。同样地,取代了在步骤3中回调到构建器对象,字体提供方模块116可以将所下载的信息转换为字体缓存模块118所理解的商定格式。

字体提供方模块116的第二功能是从字体文件124下载字体文件数据。字体文件124可由提供方ID和提供方定义的文件密钥来标识。注意,在构造字体集合期间,文件密钥可以源自字体提供方模块116本身。格式还可以使得多个字体能够成为一个文件中的多个包(例如,TrueType集),因此字体可以由字体文件引用加面部索引来标识。

远程字体文件中的字节的范围如下进行下载:

1.字体缓存使用提供方ID实例化字体提供方。

2.如果文件的大小不是已知的,则字体缓存模块118调用提供方方法以得到文件大小。该方法接受提供方定义的文件密钥。字体提供方模块116可以通过向web服务发送HTTP HEAD请求来确定文件大小。或者,如果在构造字体集合期间文件大小已知,则字体提供方模块116可以将大小编码为文件密钥的一部分。

3.字体缓存模块118调用提供方方法以得到下载信息。该方法接受提供方定义的文件密钥和回调接口。字体提供方模块116经由回调接口返回诸如URI、认证信息等之类的下载信息。

4.使用所返回的下载信息,字体缓存下载所期望的文件范围并且将其缓存。

如应当显而易见的,还可以设想上述的变型。例如,字体提供方模块116可以将数据本身下载到由字体缓存模块118提供的缓冲器中。

除了上文所描述的功能之外,提供方接口可以包括字体提供方模块116可以借以确保从字体缓存120中丢弃过时的数据的机制。例如,字体集合可以包括过期日期,在该过期日期之后,字体缓存120丢弃或重新初始化字体集合,当字体集合或其它资源过期时,字体提供方模块116可以以编程方式通知字体缓存模块118,等等。

如果支持每用户或每应用数据,则字体提供方模块116接口可以包括字体提供方模块116可以借以限制对所下载的数据的访问的机制。例如,字体集合构建器接口可以包括用于在字体集合上设置自由访问控制列表(DACL)的方法。字体缓存模块118然后可以使用所指定的访问将字体集合暴露给应用进程。

字体缓存模块118和相关联的字体缓存120是负责下载数据并且缓存结果的组件。字体缓存模块118在字体提供方的帮助下下载数据。字体缓存120和字体缓存模块118可以用于:

•访问所缓存的字体集合。

•请求下载字体集合。

•查询字体文件的本地性(即,远程、本地或部分的)。

•查询字体文件的部分的本地性。

•请求下载字体文件的部分。

字体缓存模块118和字体缓存120可以被实施为专用系统组件,使得多个应用114共享相同的字体缓存120。这样,如果多个应用114请求相同的数据,则数据被下载一次,并且缓存数据的单个副本。

在一个或多个实施方式中,应用114不直接与字体缓存120交互,而是经过字体支持库。字体支持库暴露用于字体匹配、文本布局、文本渲染等的更高级别接口。稍后描述的字体下载队列和智能字符和字形缓存的使用也可以被认为是字体支持库的部分。字体支持库驻留在应用进程中并且通过专用进程间通信机制与字体缓存模块118交互。可替代地,字体支持库和字体缓存模块118和字体缓存120都可以以内核模式实施,在这种情况下,字体支持库可以直接调用字体缓存。

字体支持库经由高级接口将字体集合暴露给应用114。应用114通过指定提供方ID和字体集合密钥来得到字体集合。或者,实施方式可以包括默认“系统”字体集合的概念,在这种情况下,不使用参数。字体支持库调用字体缓存模块118或向字体缓存模块118发送消息,字体缓存模块118将句柄返回到只读共享存储器,该存储器包含字体缓存120中的字体集合的内部二进制表示。如果字体集合未被缓存,则不返回字体集合,但是启动下载。

字体缓存120将二进制字体集合数据保存为文件,或保存为较大文件中的记录。二进制表示包括每个字体的具有对字体属性的引用的记录。二进制表示还可以包括查找表,以使得能够基于诸如姓氏等之类的属性例如经由哈希表查找或二进制搜索快速找到字体。在一个或多个实施方式中,二进制格式不直接暴露给应用。取而代之,字体支持库提供了枚举字体、查找字体、得到字体属性等等的方法。

作为二进制格式的替换方案,字体缓存模块118和字体缓存120可以将字体集合串行化为XML文件或类似格式,并且根据需要将其读取到存储器110中。或者,字体集合可以存储在SQL数据库或类似的东西中。在任一情况下,字体缓存模块118作为单片(monolithic)共享存储器对象不与字体支持库一起共享字体集合。取而代之,字体支持库可以将各个方法调用转发到字体缓存模块118,字体缓存模块118返回结果。

对于每个缓存的字体文件,字体缓存模块118创建包含字体数据的稀疏文件。该文件被划分为固定大小的区块,并且使用一些文件系统的特征来仅仅为所指定的区块分配存储。与字体数据本身分开,字体缓存模块118分配被称为区块映射的位阵列。区块映射包含字体中每个区块的一个位。如果对应的区块是远程的,则每个位为0,并且如果对应的区块是本地的,则每个位为1。字体缓存模块118可以将区块映射附加到字体数据,将其作为并行文件或流而存储在字体数据旁边,或者将所有区块映射存储为单个文件中的记录。

当字体缓存模块118下载字体数据时,其首先将数据写入到字体缓存120中的所缓存的文件,然后设置区块映射中的对应位。为了在断电或其它突然终止的情况下确保数据完整性,可以小心地确保字体数据本身在对应的区块映射位之前被刷新到磁盘。在下载数据之后,字体缓存模块118还(经由字体支持库)通知等待下载完成的任何应用114。

字体支持库通过向字体缓存模块118发送消息来访问字体数据,并且取回用于所缓存的字体数据和区块映射的只读共享存储器对象。这样,字体支持库可以有效地访问字体数据和本地性信息而不复制数据。

还构想了其它设计。例如,字体缓存模块118可以使用文件范围而不是区块。取代了稀疏文件,字体缓存模块118可以将新下载的范围附加到文件,并且维护逻辑文件范围到所缓存的文件偏移的映射。在这种情况下,字体支持库可以通过将各个消息发送到字体缓存模块118来读取数据,字体缓存模块118将数据复制到缓冲器。

字体缓存模块118可以采用技术来限制字体缓存120的增长。例如,字体缓存模块118可以定义最大总大小,并且根据需要丢弃最近最少使用的字体文件以保持在该限制下。

字体下载队列可以用于追踪字体下载请求、字符下载请求和字形下载请求。字体下载队列的内容可以表示为在顶层具有字体文件的分层数据结构。每个文件由其提供方ID和提供方定义的文件密钥来标识。对于每个文件,队列记录一组文件范围和一组字体(每个都有自己的面部索引)。每个字体都有一组字符和一组字形ID。

当应用114发起下载时,字体队列的内容被分配给下载操作,并且队列返回到空状态。字体支持库执行下载操作并且可以指示完成。字体支持库可以按顺序或并行地下载队列中的每个文件,如下:

1.如果文件头不是本地的,下载它。检查头以确定字体格式(例如,OpenType集或TrueType集)。

2.对于文件中的每个所请求的字体,如果它不是本地的,则得到从头开始算起的面部的偏移并且下载表目录。

3.检查表目录,并且确定哪些表可以是稀疏的以及哪些表要完全下载。例如,可以假设glyf表是稀疏的,因为它典型地占TrueType字体中的80 %或更多的数据。该设计还可以扩展到包含每字形数据的其它表。

4.下载已经不是本地的每个非稀疏表。

5.将足以计算字符的字体解析为字形映射(cmap)和字形依赖性图(见下文)。

6.将每个字符请求转换为每cmap的字形请求。对于某些Unicode范围(诸如阿拉伯文)内的字符请求,表现为好像范围中的每个字符都被请求。

7.对于每个字形请求,将请求添加到它可能取决于的任何其它字形ID,如字形依赖性图所指定的。递归地进行这个动作。

8.使用字体中的位置数据(例如,本地表)将字形请求转换为字节范围,并且按照并非已是本地的范围来下载所请求的。

9.检查每个新下载的字形以确定它是否为TrueType组合。如果是,则确保其组件字形也是本地的。组件字形本身可以是个组合,因此递归地这么做。

使用智能字符和字形缓存的字体流传输可以用于见机行事地下载在以给定字体渲染的给定组的字符(或字形)中可能涉及的字体数据。为此,文本布局模块228可以考虑可以在生成布局230期间执行的每个字形替代,加上可以在渲染颜色字形中涉及的任何字形替代。这样,应用114可以使用两遍来绘制页面以使一切都以正确的字体渲染。在第一遍中,一些字体或字符可以是远程的,使得发生回退并且字符下载请求被添加到队列,如先前所描述的。然而,在第二遍中(在下载完成之后),用于渲染页面的每个字形是本地的,并且没有发生回退。

为了使得能够进行智能字形缓存,当第一次下载字体时,字体支持库可以构造字形依赖性图。这发生在下载非稀疏表之后,并且用于构造依赖性图的每个表都是非稀疏的。字形依赖性图由字体缓存120来缓存。

当它可以直接或间接产出的字形中的每个字形是本地的时,字符被认为是本地的。确保字符是本地的以使得当到了实际使用它时不发生误差,这涉及对文本布局进程的知晓,因为存在单个字符可以取决于多种因素产生不同字形的点,诸如其相邻字符是什么、读取方向、是否支持颜色以及它是否是组合字形。因而,在经过整形之后,单个字符可以变换成十几种不同的可能性中的任一种可能性,特别是在应用了OpenType特征的复杂字体(如Gabriola或Palatino)中。

如图6的示例600所示出的,布局中的第一步是当读取方向颠倒(诸如RTL希伯来文)并且字符具有镜像对时镜像Unicode字符,诸如圆括号和括号,例如,“[] {}()”。然后,Unicode字符经由cmap表映射到标称字形ID,或者如果变型选择器跟在基本字符之后,则映射到特定变型,其对于像‘ ’之类的CJK字符是最常见的,但对于诸如“≥”数学运算符也是可能的。

然后,整形(shaping)应用来自GSUB表的每个上下文查找,由于连字、样式集合、字形组合/分解、垂直替代和若干个其它特征而可能替代许多字形。如果是彩色字体,则可以使用COLR表将单个字形分成许多彩色字形流(run),以将基本字形id映射到分层字形组件的列表。组合字形被分成单独的组件(对于CJK字符是常见的),尽管这是单独处理的并且没有在字形依赖性图中考虑。

在概念上,形成依赖性示图的字形依赖性的生成从每个字符开始并且遵循它可以被组成为字形的每种方式。这导致具有叶节点的有向非循环图,叶节点可以被聚类为等同类别的依赖性列表,并且相同的所得字形ID可能出现在多于一个依赖性列表中,但每个标称字形仅具有一个依赖性列表。依赖性列表排除任何TrueType字形组件,因为那些在用于标识组件字形ID的“glyf”表字形记录被水合(hydrate)之前是无法知晓的。

因为存在有关字符也可以用于任何给定字符的可能性,所以下载进程可以以比单个字符更大的粒度工作,而可以见机行事一次预先获取整个Unicode块。当一些字母已经存在并且相同语言文字的相邻字母还没有时,这可以用于避免所连接的语言文字(如阿拉伯文和梵文)中的瞬态情况,其可能暂时导致显示未加入的文本,直到下载了新字符为止。对于像汉文和韩文那样涉及成千上万个字符的块的更大的语言文字,请求粒度可以每字符保留,任何额外的字符被作为文件区块大小的附带后果而下载。

图7中示出了创建依赖性示图的示例700。对于字体中支持的每个字符,如果存在一个镜像('['→'['']';'}'→'{"}'),则镜像对被添加到给定字符的依赖性示图中的依赖性列表,。然后,如果块不是像CJK和表情符号之类的部分水合块,则添加来自字符的Unicode块的每个其它字符。可以指出,在大多数实例中,因为镜像对典型地在相同块内找到,所以步骤一可能变得多余。还有,因为下载整个块可能不会自动地抓取在块外部的这些常见的语言文字字符,所以可以添加一小组已知的特定于语言文字的字符,诸如用于阿拉伯文或叙利亚文的tatweel字符。

接着,获得来自cmap的标称字形,以及任何其它变型。因为查找是比语言文字和语言更低级别的项并且逻辑附加在针对每个输入和对应的输出字形的依赖性列表,所以枚举了GSUB中的每个查找,其也隐式地枚举每个语言文字和语言。

附加地,使用COLR表添加每个字形分解的颜色字形ID。然后,递归依赖性列表被展平为顶层映射,并且组合相同的列表。这产生将每个标称字形ID映射到依赖性列表的阵列,该依赖性列表是16位字形ID的有序列表。省略了具有单个输出字形的任何依赖性列表,并且如果拖尾(trailing)字形ID是单个计数列表,则阵列大小可以小于字形计数。

还设想了其它示例。例如,可以省去智能字符和字形缓存,并且在这种情况下,字体下载队列包含文件范围请求,而非字符请求和字形请求。当在文本格式化或渲染的普通过程中,字体支持库尝试读取远程文件数据时,可以生成文件范围请求。

示例系统和设备

图8一般地在800处图示了示例系统,其包括表示可以实施本文中所描述的各种技术的一个或多个计算系统和/或设备的示例计算设备802。这通过包括字体管理器模块122、字体提供方模块116和字体缓存模块118来图示。计算设备802可以例如是服务提供方的服务器、与客户端(例如,客户端设备)相关联的设备、片上系统和/或任何其它合适的计算设备或计算系统。

如所图示的示例计算设备802包括彼此通信地耦接的处理系统804、一个或多个计算机可读媒体806和一个或多个I/O接口808。尽管未示出,但是计算设备802还可以包括将各种组件彼此耦接的系统总线或其它数据和命令传递系统。系统总线可以包括不同总线结构中的任一个或组合,诸如存储器总线或存储器控制器、外围总线、通用串行总线和/或利用多种总线架构中的任一种总线架构的处理器或局部总线。还设想了多种其它示例,诸如控制线和数据线。

处理系统804表示使用硬件执行一个或多个操作的功能性。因而,处理系统804被图示为包括可以被配置为处理器、功能块等等的硬件元件810。这可以包括以硬件实施为使用一个或多个半导体形成的专用集成电路或其它逻辑器件。硬件元件810不受形成它们的材料或其中采用的处理机制的限制。例如,处理器可以由一个或多个半导体和/或晶体管(例如,电子集成电路(IC))构成。在这种上下文中,处理器可执行指令可以是电子可执行指令。

计算机可读存储媒体806被图示为包括存储器/存储装置812。存储器/存储装置812表示与一个或多个计算机可读媒体相关联的存储器/存储装置容量。存储器/存储装置组件812可以包括易失性媒体(诸如随机存取存储器(RAM))和/或非易失性媒体(诸如只读存储器(ROM)、闪存、光盘、磁盘等等)。存储器/存储装置组件812可以包括固定媒体(例如,RAM、ROM、固定硬盘驱动器等等)以及可移除媒体(例如,闪存、可移除硬盘驱动器、光盘等等)。计算机可读媒体806可以以如下文进一步所描述的多种其它方式配置。

一个或多个输入/输出接口808表示允许用户向计算设备802录入命令和信息并且还允许使用各种输入/输出设备向用户和/或其它组件或设备呈现信息的功能性。输入设备的示例包括键盘、光标控制设备(例如,鼠标)、麦克风、扫描仪、触摸功能性(例如,电容传感器或被配置成检测物理触摸的其它传感器)、相机(例如,其可以采用可见或不可见波长(诸如红外频率)来辨识不涉及触摸的作为手势的移动)等等。输出设备的示例包括显示设备(例如,监视器或投影仪)、扬声器、打印机、网卡、触觉响应设备等等。因此,计算设备802可以以如下文进一步所描述的多种方式配置,以支持用户交互。

在本文中可以在软件、硬件元件或程序模块的一般上下文中对各种技术进行描述。通常,这样的模块包括执行特定任务或实施特定抽象数据类型的例程、程序、对象、元件、组件、数据结构等等。如本文中所使用的术语“模块”、“功能性”和“组件”通常表示软件、固件、硬件或其组合。本文中所描述的技术的特征是平台无关的,意味着可以在具有多种处理器的多种商业计算平台上实施这些技术。

所描述的模块和技术的实施方式可以存储在某种形式的计算机可读媒体上或跨越某种形式的计算机可读媒体传送。计算机可读媒体可以包括可以由计算设备802访问的多种媒体。作为示例而非限制,计算机可读媒体可以包括“计算机可读存储媒体”和“计算机可读信号媒体”。

“计算机可读存储媒体”是指与纯粹的信号传输、载波或信号本身相比,能够使得进行信息的持久存储和/或非暂态存储的媒体和/或设备。因此,计算机可读存储媒体是指非信号承载媒体。计算机可读存储媒体包括诸如易失性和非易失性、可移除和不可移除媒体和/或存储设备之类的硬件,其以适合于存储诸如计算机可读指令、数据结构、程序模块、逻辑元件/电路或其它数据之类的信息的方法或技术实施。计算机可读存储媒体的示例可以包括但不限于RAM、ROM、EEPROM、闪存或其它存储器技术、CD-ROM、数字通用盘(DVD)或其它光学存储器、硬盘、磁带盒、磁带、磁盘存储装置或其它磁性存储设备、或其它存储设备、有形媒体、或适合于存储所期望的信息并且可由计算机访问的制品。

“计算机可读信号媒体”可以是指被配置成诸如经由网络向计算设备802的硬件传输指令的信号承载媒体。信号媒体典型地可以在诸如载波、数据信号或其它传输机制之类的经调制的数据信号中体现计算机可读指令、数据结构、程序模块或其它数据。信号媒体还包括任何信息递送媒体。术语“经调制的数据信号”意指使得以在信号中编码信息的方式设置或改变其一个或多个特性的信号。作为示例而非限制,通信媒体包括诸如有线网络或直接有线连接之类的有线媒体以及诸如声学、RF、红外和其它无线媒体之类的无线媒体。

如先前所描述的,硬件元件810和计算机可读媒体806表示以硬件形式实施的模块、可编程设备逻辑和/或固定设备逻辑,其可以在一些实施例中用于实施本文中所描述的技术中的至少一些方面,诸如以执行一个或多个指令。硬件可以包括集成电路或片上系统、专用集成电路(ASIC)、现场可编程门阵列(FPGA)、复杂可编程逻辑器件(CPLD)和硅或其它硬件中的其它实施方式的组件。在这种上下文中,硬件可以作为执行由由硬件体现的指令和/或逻辑所定义的程序任务的处理设备以及用来存储用于执行的指令的硬件(例如,先前所描述的计算机可读存储媒体)来操作。

前述的组合也可以用于实施本文中所描述的各种技术。因而,软件、硬件或可执行模块可以被实施为在某种形式的计算机可读存储媒体上体现的和/或由一个或多个硬件元件810体现的一个或多个指令和/或逻辑。计算设备802可以被配置成实施对应于软件和/或硬件模块的特定指令和/或功能。因而,可由计算设备802作为软件执行的模块的实施方式可以至少部分地以硬件实现,例如,通过使用处理系统804的计算机可读存储媒体和/或硬件元件810。指令和/或功能可以由一个或多个制品(例如,一个或多个计算设备802和/或处理系统804)执行/操作以实施本文中所描述的技术、模块和示例。

如图8中进一步所图示的,当在个人计算机(PC)、电视设备和/或移动设备上运行应用时,示例系统800能够实现无缝的用户体验普遍存在的环境。在利用应用、播放视频游戏、观看视频等等的同时,从一个设备到下一设备转变时,服务和应用在所有三个环境中基本上类似地运行以获得共同的用户体验。

在示例系统800中,多个设备通过中央计算设备互连。中央计算设备可以在多个设备的本地,或者可以位于远离多个设备的地方。在一个实施例中,中央计算设备可以是通过网络、因特网或其它数据通信链路连接到多个设备的一个或多个服务器计算机的云。

在一个实施例中,该互连架构使得能够跨越多个设备递送功能性,以向多个设备的用户提供共同且无缝的体验。多个设备中的每个设备可以具有不同的物理要求和能力,并且中央计算设备使用平台来使得能够向设备递送针对设备定制而对于所有设备是也共同的体验。在一个实施例中,创建一类目标设备,并且为该通用类设备定制体验。一类设备可以由物理特征、使用类型或设备的其它共同特点来定义。

在各种实施方式中,计算设备802可以采取多种不同的配置,诸如用于计算机814、移动装置816和电视818的使用。这些配置中的每个配置包括可以具有通常不同的构造和能力的设备,并且因此可以根据不同设备类别中的一个或多个设备类别来配置计算设备802。比如,计算设备802可以被实施为包括个人计算机、台式计算机、多屏计算机、膝上型计算机、上网本等在内的计算机814的设备类别。

计算设备802还可以被实施为包括诸如移动电话、便携式音乐播放器、便携式游戏设备、平板计算机、多屏计算机等等之类的移动设备在内的移动装置816的设备类别。计算设备802还可以被实施为包括在休闲观看环境中具有或连接到通常较大屏幕的设备在内的电视818的设备类别。这些设备包括电视、机顶盒、游戏控制台等。

本文中所描述的技术可以由计算设备802的这些各种配置来支持,并且不限于本文中所描述的技术的具体示例。该功能性还可以经由如下文所描述的平台822全部或部分通过使用分布式系统来实施,诸如通过“云”820。

云820包括和/或表示用于资源824的平台822。平台822抽象云820的硬件(例如,服务器)和软件资源的底层功能性。资源824可以包括可以在远离计算设备802的服务器上执行计算机进程的同时利用的应用和/或数据。资源824还可以包括在因特网上和/或通过诸如蜂窝或Wi-Fi网络之类的订户网络提供的服务。

平台822可以抽象用于将计算设备802与其它计算设备连接的资源和功能。平台822还可以用来抽象资源的规模以针对所遇到的经由平台822所实施的资源824的需求提供对应的规模水平。因而,在互连设备实施例中,本文中所描述的功能性的实施可以分布在整个系统800中。例如,该功能性可以部分地在计算设备802上实施以及经由抽象云820的功能性的平台822来实施。

结论

尽管已经以特定于结构特征和/或方法动作的语言描述了示例实施方式,但是要理解的是,所附权利要求中定义的实施方式不一定限于所描述的具体特征或动作。相反,这些具体特征和动作被公开为实施所要求保护的特征的示例形式。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1