创建并使用可移植字体的设备与方法

文档序号:6409674阅读:285来源:国知局
专利名称:创建并使用可移植字体的设备与方法
技术领域
本发明涉及计算机字体技术,即字母字符和其它与文本一起使用的图象的形状的表示和生成的计算机技术。
本发明的技术背景自从有了书写文字之后,文件的创建者不仅关心文字的语音效果,而且进一步考虑到阅读时的视觉效果。在印刷技术出现之前,书法则主要是一种艺术形式。有了印刷,创建并使用字体的工艺已绝大部分地取代了书法。
表示字母字符集内每一字符的形状的集合称为字体。通常,对于每一种字体,字母的形状具有一定的特性,例如水平和垂直位置上呈一定的形状特征,其垂直和水平笔划的大体宽度,以及其是否有衬线、是否加粗与是否倾斜,这样就使具有一定字体的字符整体看来比较和谐。
字体通常用一个基本字体名称标识,例如“Courier”、“Arial”、“Helvetica”、“Times New Roman”,它们定义了与尺寸无关的字符的大体形状。这些基本字体名称经常是设计者们的商标。基本字体名称后经常跟随一个点大小设置以标识其字体的尺寸。有时在基本字体名称和点大小设置之间插有其它文字,例如,“bold”指的是它的笔划将变粗;“narrow”指的是它的所有字符将被变得更加狭窄;“italic”指的是它的字符将被倾斜;“oblique”用于无衬线字符,意味着其字符将被倾斜。
字体可以改变的话就会有许多好处。它使用户可以变换字母的尺寸,在必要时使文本更加紧凑,或者使文本更易于阅读。使用不同字体也可以显著地区别文本的不同部分,使得文本更易于浏览和使用。另外,一些文本较之其它更悦目,相反,一些则更易于阅读。不同的字体呈现不同的美学色彩,如传统的、现代的、art nouveau、art deco、手写体、幽默的、夸张的。字体选择的广泛性极大地提高了校准文件美学信息的能力。
在计算机时代的最初年代,大部分计算机仅有一种字体用来表达文本。然而,在最近十年中,越来越多的计算机具有使用多种字体来显示和打印文本的能力。大部分这种计算机有字体源,它包括对于其可处理的每一种字体的每一字符形状的预定义字体描述。这种预定义字体描述用一种特定的形式或语言描绘了字符的形状。
一些字体语言用位象表示其形状,使之可直接译为象素信息,以用于视频显示或激光打印。它具有运行速度快的优点,同时也有不利之处,即每一不同的大小的字需要定义不同的字体描述集合。
最近,矢量字体语言已经成为了一种趋势。这些语言定义了字符的外观,它使用定0义其形状的一个或多个轮廓来定义字符的形状。每一个这样的轮廓由一个去往起始位置的移动和随后一系列轮廓线段所定义,这种轮廓线段既可为直线也可为曲线,例如“Quadratic”、“CubicBezier”曲线、和“circular arc”,它们后面带有一个去往下一个字母的标准位置的移动。Bezier曲线是一种著名的曲线,它由曲线的两个终点和位于这两个终点间的一个或两个曲线外控制点所定义。Quadratic Bezier曲线仅有一个曲线外控制点,每个终点和外控制点的连线在终点处与曲线相切,这两根切线形成一定的角度。Cubic Bezier曲线有两个曲线外控制点,每一终点和最近的控制点的连线在终点处与曲线相切,以及作为从终点至切线相应控制点间长度函数的沿终点附近的切线的大体方向上的曲线长度。这些直线和线段通常具有1000×1000或2048×2048单元的分辨率,这被称为轮廓精度单元(outline resolution units),或ORU。由于这些字体描述用直线和曲线来定义形状,并且具有高分辨率,它们可用来生成实际所需尺寸的字体图象。
在矢量字体技术中,定义字符集中每一字符形状的字体描述集合可被认为是一种基本或物理的字体技术。从这种物理字体中产生的不同尺寸的字体被认为是逻辑字体,因为它们没有单独的与字符相关联的形状描述,它们只是从矢量的物理字体描述中产生特定大小的形状。使用这样的方法将会出现这样的情形,举例来说,即物理字体不仅与基本字体Arial相关联,而且与具有特定点大小描述的逻辑字体相联,如Arial 12或Arial 24。一个独立物理字体的命名通常包括“Bold”、“Italic”、和“Narrow”等描述,而带有“Oblique”的物理字体名称通常产生于被倾斜的相应的物理字体。同样地,如果没有提供相应的斜体的物理或基本字体,“Italic”的描述是必要的。
现在有几种主要的矢量字体语言。它们包括PostScript(由AdobeSystems Incorporated开发,其位于1585 Charleston Road,Mountain View,CA 94039),TrueType(由Apple Computer Inc.开发,其位于20525Mariani Avenue,Cupertino,CA 95014),Speedo(由Bitstream Inc.开发,本申请的受让人),以及Intellifont(由AGFA division of Miles Inc.开发,其位于90 Industrial Way,Wilmington,MA 01887)。这些语言使用不同的代码或形式风格各异地描述和表现形状。例如,TrueType使用QuadraticBezier曲线定义曲线线段的形状,而PostScript和Speedo使用Cubic Bezier曲线,Intellifont使用circular arcs。
为了展现文件中指定的字体,计算机不仅需要那种字体中字符的位图描述或可伸缩字体描述,而且需要一种称为字体解释器的软件,它们知道如何解释用于书写每种字体语言的字体描述的特定代码,并将它们转换成为位案或一系列移动与轮廓线段。
然而,并非所有的计算机都具有相同的字体描述或解释相同字体语言的能力。由此产生一个问题,如果一个电子文件被创建在第一台计算机上,并且使用了一种或多种给定字体,然后将其传送到第二台计算机上,而这台计算机却没有那些字体或不能解释这些字体。这样,在第二台计算机上的文件将会以与预期不同的字体显示或打印出来。这可能使此文件有一个截然不同的非我们所需的外表,并且可能危及它的间隔和页数。在严格编排的文本中,例如一个带有分栏格式的分本,这个问题可能使此文本几乎不能阅读。另外,某些字体具有的特殊字符在另一些字体中是找不到的,或者这些特殊字符使用了与其它字体中普遍使用的字符代码所不同的字符代码,这些字体的不匹配不仅破坏一个文件的外观与编排,也可能导致信息的丢失或篡改。
一种解决字体化文本移植问题的方法是随同文件传送所有字体和可以正确呈现文件中字符的字体解释程序的拷贝。然而这仍有许多问题。首先,为了找出哪些字体和解释程序需要与这样的文件一起传送并将它们安装在机上观察,将会使工作量增加。而且它会产生法律纠纷,因为即使这些字体的实际形状长期以来不享有版权保护,但是包含于字体描述中的代码和一系列轮廓线段已被公认为可受版权保护,这样,在没有法律允许的情况下它们不能被安装在一台新的机器上。
现已有许多解决这个问题的先有技术。
第一个先有技术是使用软件使计算机重新显示一个文件,它使用一种相似的字体(如果有的话)来尝试着接近文本中所要求的某种字体。这个系统试图用另一种字体替换要求的字体,如将有衬线字体替换为另一种,斜体替换为另一种,等等。然而,这种处理仍然要求重新显示文件的计算机中带有和它要替换的字体相近似的字体,而且这种近似替换往往令人失望。
另一个先有技术在第一个先有技术的基础上作了些改进,它使用一个软件,此软件将可以解释文件中所使用的每一种字体中的每一个字符的尺寸大小的信息随同文件一同发送出去。这使计算机上的相应软件可以伸展和压缩任何一种它用来接近某种丢失字体的字体,以产生一种具有同样空间的字体。这种方法避免了由于空间差异而使文件混乱,从而具有一定的优势,但它仍然仅是一种近似。
另一个先有技术已经将字体描述嵌入或包括于文件中,所以在另一端的用户可以使用它们。由于这种可嵌入字体的制造者的设计,所以它们仅可用于包括该字体的文件,而且该字体描述的拷贝可以被制作而无需取得许可。然而,所有这些系统仅与使用一种语言的字体配合,而且是在假设该显示文件的计算机具有那种语言的解释程序。这样,如果显示文件的机器没有合适的字体解释程序,或者即使它有,此文件也不可被正确地再现。只有用那种解释程序的一种语言书写的字体才可以成功地移植文件。
另一先有技术使用一种文件记录器,该记录器从产生文本的计算机中的解释程序中记录所有包括于一文件中的字符-字体形状的位象并且将它们嵌入该文件的拷贝中。此可移植的文件可以在另一计算机上通过一个文件展示器应用程序展示或打印出来。该浏览器根据相应的嵌入字体展示文件中每一字符的形状。该程序实际上有创建位图化物理和逻辑字体的能力。即,如果用户决定不必为具有不同尺寸的相同形状字体存储各自的位象,系统将它们用同一尺寸字体存储,在展现文件时,它将依据这种同一尺寸字体产生不同尺寸的位象。
这种方法避免了版权纠纷,因为长期以来字体的形状不受版权保护,而且被复制的位图格式被原有的预定义字体描述的形状所决定,而不是由实际代码或一系列移动和轮廓线段来决定。该方法还可以重现创建文件的计算机中所有可处理的任何字体的优点。它的不足之处是需要很大容量的内存来精确地产生各种字体。
本发明的技术方案本发明涉及用于字符形状记录的计算机化的装置或方法。本发明的系统接收多个的字符,每一字符都被一预定义字体所定义。它为接收的字符和预定义字体的每一组合访问预定义的字体描述,该预定义字体描述用相关预定义字体描述了字符的字符-字体形状。然后它从每一被访问的预定义字体描述所定义的字符-字体形状中产生新字体描述,该新字体描述指定一相关字符并且用一系列轮廓线段描述了相关的字符-字体形状。
优选地,本发明开发了新字体描述,它仅仅依靠被预定义字体描述所描绘的真实的字符-字体形状,而与描绘那些形状的预定义字体描述的特殊方式无关。在本发明的优选实施例中,它将一预定义字体描述所提供的字符-字体形状作为模型,以得出这个形状的鲜明特征,而在此预定义字体描述中这个特征也许并不鲜明。例如,在优选实施例中,系统主要将每一字符-字体形状作为模型以找出形状轮廓上作为形状函数的点,而并不在意预定义描述定义形状的方式。这样的独立描述点可能包括拐点、切点、X或Y轴的终点、以及角点。如果想经过所给线段的两个端点并通过所给轮廓而画一条直线是不可能的,尽管在可能量化误差允许下,这三个终点中的任一个的位置可以改变,那么通常认为所给的线段终点就是描述-无关角点,此线段终点在一系列轮廓线段中用于定义一个所给字符-字体形状轮廓的预定义字体描述。
优选地,在这些描述-无关点中,系统近似在描述-无关点之间的由预定义字体描述所定义的字符-字体轮廓的形状。优选地,它还选择轮廓的顺序,为第一轮廓的描述选择起始点,以及依据标准规则选择描述的方向,而不管预定义描述中的那些顺序,点的开始,或轮廓的方向。如此使新字体描述摆脱了预定义描述的非所需外观的困扰,从而使这些描述变得非常正规,更容易重现。
优选地,系统还找出在新字体描述中每一曲线线段的“深度”。它指示曲线在重现时被细分至何种程度才可通过矢量近似每一这种细分,以精确地将其描绘出来。这种深度的计算是通过递归细分这种曲线成为细分线段,用矢量近似每一再细分线段,并继续在不合适的细分线段上递归直至其可被接受为止。最深层次的递归指示曲线的深度。
优选地,系统可根据字体和字体描述语言(包括轮廓描述和位图描述)所定义的形状而产生新字体描述。当系统接收许多由不同字体所定义的字符,根据它们代表的字体系统为第一字符的形状自动创建新字体描述。当系统接收许多具有不同字体描述语言的字体的字符,它为那些定义于单一字体描述语言中的字符产生新字体描述。如果系统从不同的字体接收预定义描述(包括不同的物理和逻辑字体),它将新字体描述组合成相关预定义字体描述的组合。
它的突出之处有,系统将与一种或多种独立的雕刻相关的字符-字体形状轮廓或无关联的形状组合在一起。系统决定哪些轮廓是这种雕刻的内部轮廓和外部轮廓,并且选择起始点和线段的顺序,这种线段用于根据标准规则定义在新字体描述中的每一这样的轮廓,这里的标准规则依据的是,此轮廓是该雕刻的内部轮廓还是外部轮廓。
优选地,如果字符形状被不同的字体描述语言所定义,系统与各种字体中的不同字符的形状保持一致,并且通过记录用于一种以上的新字体描述的任何形状的单一描述而保存存储空间。优选地,在比较有代表的字符-字符字体形状时,这种比较与形状的尺寸和地址无关。可以通过创建描述此种形状的某一特征的标记图,和比较不同形状的标记图,而且仅仅比较不同形状的真实轮廓(如果它们的标记图合适的话)而加快这种比较。此种比较可以通过它们的标记图归类此种形状而进一步加速,即,如果所给的标记图适合于任一已归类的标记图,就可以减少标记图的数目,此标记图的数目必须与所给标记图比较而决定。优选地,所比较的形状是雕刻,而且为了加速这种比较,所有雕刻的形状根据标准规则被分层。
优选地,系统从无字符形状中还产生新字体描述,例如标识语和其它可以用于文本的图象。
在本发明的一些实施例中,系统将一个字体化的输入文本转换为一个包含了可移植文件的字体化的输出文本。这种输出文本包括了一系列输入文本中原有的字符,这些字符的新字体描述,以及代表每一输出文本字符的新字体描述的指示。
优选地,在计算机屏幕或打印机上,系统也可以展现这个可移植文件的字体化的文本的图象。这种效果既可以在创建此移植文件的计算机上达到,也可以在另一台计算机上达到。当系统被安装于另一台计算机上时,可以通过诸如可擦除存储媒体或电子网络等方式在计算机间提供交互可移植文件的能力。
本发明的一个实施例包括了一个上述可移植文件,此文件被记录在大容量存储媒体上。
附图的简要说明在和相关附图一起阅读以下优选实施例的描述的基础上,本发明的各个方面将被表达得更加清楚,其中

图1示出了本发明的一个实施例的高级框图,其中,第一计算机利用多个预定义字体描述将输入文本转换为一个具有新字体描述的可移植文件,第二计算机接收可移植文件,并利用此文件所包含的新字体描述展现文件的一个图象;
图2是图1实施例的一个版本的高级框图,其中,可移植文件通过可擦除的大容量存储媒体在第一计算机与第二计算机之间交互;图3是图1实施例的一个版本的高级框图,其中,可移植文件通过电子数据网络在第一计算机与第二计算机之间交互;图4是字符形状记录软件模块的功能接口的框图,这个软件模块是依据本发明的一个适应于多个用途的实施例而设计的,这些用途包括图1所示的第一计算机的字符形状记录器的用途;图5是字符形状展示器软件模块的功能接口的框图,这个软件模块是依据本发明的一个适应于多个用途的实施例而设计的,这里的用途包括图1所示的第二计算机的字符形状展示器的用途;图6是一个更为详细的示于图1的第一计算机的函数元素的解析图,其中,使用了图4的字符形状记录器,包括文件发生器和字符形状展示器所执行的主要功能步骤;图7是一个更为详细的图4和图6中字符形状记录器的CsrSetFontSpecs()函数执行的功能步骤的流程图;图8是多个链表的图示,这些链表包括图4和图6的字符形状记录器所创建的物理字体记录,与每一这种物理字体记录相关联的记录器的逻辑字体记录和字符记录的二进制树,以及在这种字符记录和雕刻程序字符串(“GPS”)之间的链接,雕刻程序字符串中包括了这种字符形状的新描述;图9是一个更为详细的图4和图6中的字符形状记录器一部分的CsrDoChar()函数所执行的功能步骤的流程图10是一个被图4和图6的字符形状记录器所创建的数据结构的解析图,这些数据结构包括字符形状数列,打开形状结构,放置关闭形状的分层形状树,将那种树的形状结构分为雕刻元素的分法,跟这种雕刻元素一起创建的雕刻记录,以及包括从雕刻元素中导出的新形状描述的雕刻程序字符串(“GPS”);图11和12描述了图9的步骤364是如何细分曲线线段的,这些线段在拐点和X轴极值点处被字符形状数列接收;图13更详细地描述了图9的步骤366中的角判定函数;图14A-D,15A-C,和16A-C用于解释图13的角判定函数的步骤;图17和18是更为详细的图9中步骤422的曲线深度分析的步骤流程图;图19解释了如下事物雕刻记录的二叉树,示于图10的、由图4和图6的字符形状记录器所生产的形状,以及为每个新雕刻记录所执行的匹配,这种匹配是为了判断这种被雕刻程序字符串("GPS")说明的形状是否与树中某个雕刻记录相关的雕刻程序字符串说明的形状匹配;图20是包括在图1,6,和21中的可移植字体源的数据元素的解析图;以及图21是一个更为详细的图1中的第二计算机的函数元素的解析图,其中,使用了图5的字符形状展示器,包括页发生器和字符形状记录器执行的主要函数步骤。
本发明的优选实施例图1提供了系统100的概括图,系统100用于创建和重现可移植字体文件。这个系统包括第一计算机102,可移植文件104在该计算机上创建,系统还包括显示器106。它还包括第二计算机系统108,它可以重现可移植文件,并包括显示器110和打印机112。
计算机102和108最好是个人计算机和工作站,其中包括存储程序指令和数据结构的内存设备,以及执行指令和处理数据结构的处理部件。计算机的一个或多个处理器执行这些指令,它为每个计算机形成函数元素。
第一计算机102包括文件发生器114。文件发生器用于接收字体化输入文本116。这样的文字可以来自于外源,例如磁盘或数据网络,或者被创建在第一计算机的运行程序上,例如一个字处理软件或桌面出版程序。这个输入文本由一系列字体名称、文本字符、和位置代码组成。通常,每个文本字符与在它之前的第一个字体名相关。每个字体名与在计算机字体源122中一个代码化的预定义字体描述集合相关,此预定义字体描述是为了描述在那个字体中每一字符的形状。
文件发生器将对应于每一输入文本的顺序字体名称、文本字符、和位置代码放入可移植文件104的文本118中。另外,为了每一个唯一的字符和字体名称组合,文件发生器为描述于预定义字体描述中的形状创建一个新字体描述。
为达到以上效果,第一计算机的字体解释器120解释计算机字体源122中字符-字体形状的预定义字体描述。字体解释器将被编码的预定义字体描述翻译成为一系列的定义字符-字体形状轮廓的移动、直线、和曲线,并将它们提供给文件发生器。然后,文件发生器将这种被转换的形状描述依次提供给第一计算机的字符形状记录器(“CSR”)124。CSR可以为包括在已解释的描述中的形状建模,并且生成一个新字体描述,此新字体描述和不为代表形状所需的被转换字体描述无关。CSR将新字体描述返回给文件发生器,然后将它放置在可移植文件的可移植字体源126上,这个字体源被位于可移植文件的文本118中的、用于表现它的相关字体和字符的代码所指明。
第一计算机102和第二计算机108都包括了一个信息交互设备。如图2所示,设备128A通过可擦除大容量存储媒体130将可移植字体源从第一计算机传送给第二计算机,此存储媒体包括磁盘、光盘、CD、或磁带。这个可擦除媒体130可以包括个别生产的拷贝,或多个生产的拷贝。如图3所示,它也可以是一个网络接口128B,通过网络132传送此可移植文件。网络132可以包括LAN,WAN,电信连接,联机服务,Internet,以及的信息高速公路。
第二计算机108也包括一个页发生器134和一个字符形状展示器(“CSP”)136。此页发生器创建一个被渲染了的图象,例如可移植文件中的页面图象或屏面图象。它阅读可移植文件104的文本118中的字体、字符、和位置代码,并利用此字体代码决定与每一字符相关的字体,以及利用位置代码决定被渲染图象中的字符的地址。为了响应每个字符代码,页发生器要求CSP生成与字体代码相关联的字符形状。CSP从新字体描述中生成由可移植字体源126中的字符和字体所指明的形状,并将此形状传送给页发生器。这里的页发生器将被渲染的图象放置在合适的位置,并将它传送给输出设备,例如显示器110或打印机112。
这样,示于图1的本发明的实施例允许一个字体化的文件与第一计算机中的字体解释器和预定义字体源一起创建,如第一计算机的显示器106所示的文件,它被传送给第二计算机,并被第二计算机以极其相似的形状展现出来,而此第二计算机却没有那些字体解释器和字体源。而且,它并没有第一计算机的预定义字体描述的受版权保护的形状-无关特性。
因为第一计算机的字符形状记录器124可以为任何被描述为一系列移动、直线、quadratic曲线、以及cubic Bezier曲线的形状创建一个新字体描述,所以它可以从任何字体描述语言创建新字体描述,只要第一计算机的字体解释器可以将这些语言解释成一系列的移动、直线、和曲线。因为所有主要的字体描述语言都与字体解释器相关,而字体解释器可以提供输入数据或可被轻易转换为一定形态的输出数据,这就意味着图1的实施例可被用于所有这样的字体描述语言,即使它们共存于同一文件中。
在本发明的一些选择实施例中,文件发生器包括在可移植字体源126中放置位图字体的描述方法。包括从字体解释器120中直接为小字体记录位图格式,此位图格式在可移植字体源中作为这些图象的字体描述。当实施例中的文件发生器接收了较大的位图,为了在位图格式上进行边缘判断,它在此格式的每一边缘上创建一个去向起点的移动命令,和一条对应于边缘上每个相继点的距离的直线,以及将这些移动和直线线段提供给上述的字符形状记录器。因为这些特征,本发明才可以使得用任一字体所创建的任一文件被真实地再现在另一计算机上,而这台计算机却并不包括创建它的原始字体描述。
图1所包含的基本概念有许多应用程序。在某些时候,文件发生器114和字符形状记录器124被直接设计为一个用户应用程序,例如文字处理软件、绘图程序、或桌面出版程序,还被置于操作系统中。在另一些时候,它还被放置在作为打印机驱动程序的接口化的驱动模块中,以致它可以与任何主要的运行在相关计算机平台上的应用程序相接。
相似地,在一些应用程序中,页发生器134和字符形状展示器136被设计成一个更大的用户应用程序。或者作为特殊可移植文件浏览器程序的一部分。在另一些情况下,它被设计到操作系统中。
可移植文件的形态随文件发生器114、记录器124、页面发生器134、以及字符形状展示器136的使用而异。例如,在这些模块都被设计为一个更大的用户应用程序的系统中,可移植文件对那些程序而言只是一个普通的文件。当文件发生器和记录器在一个打印驱动模块中,并且页发生器和展示器是文件浏览程序的一部分,这个可移植字体文件通常不能被原始创建字体化文本的应用程序所读取。在文件发生器、记录器、页面发生器、和展示器被集中到操作系统的情况下,任何与操作系统兼容的应用程序所产生的文件都可能是可移植文件104。
在某些实施例中,一个单一的计算机包括文件发生器和记录器,以及页发生器和展示器,所以这个计算机既可以传送也可以接收可移植文件。
在某些实施例中,可移植文件包括页发生器和展示器代码,所以阅读此文件的计算机可以显示此可移植文件的文本和字体,而无需事先有页发生器和记录器的拷贝。
图4和图5是字符形状记录器124和字符形状展示器136的优选实施例。在此实施例中,记录器和展示器136被设计成独立的软件模块。因为它们已被模块化,所以它们的代码可被用于许多不同的应用软件,不同的计算机,和不同的操作系统。它们由普遍使用的C程序语言写成,而几乎所有的主计算机系统都支持此语言。它们不包括任何从属操作系统的函数。也不包括从一种应用程序至另一种应用程序的有可能会改变的多种函数。
在某些实施例中,记录器和展示器是那些运行在Unix、IBM PC兼容机、和APPLE Macintosh计算机上的应用软件的一部分。在每一机器中,应用程序的从属版本被代码所包围,这些代码与操作系统相接,执行文件和页发生器的功能,并且创建在其它类型计算机上被应用程序的相应版本所读的可移植文件。从而使得字体化的可移植文件在一种计算机上被创建,并可以逼真的效果重现在另一种计算机上。
记录器和展示器的函数的模块化也允许它们被用于不同的要求,而不局限于图1所描述的内容。例如,在本发明的一个实施例中,记录器被用作某程序的一部分,该程序独立于任何输入文本从预定义字体描述集合中创建新字体描述集合。一旦记录器被创建,这种新字体就可以与任何包含了展示器模块的应用程序一同使用。
图4和图5左部所示的是函数调用,它由使用了每个模块的宿主软件建立。它们是图4的函数150-158和图5的函数170-178。图的右部是由模块所建并返回宿主软件的函数调用。它们被称为“回调”函数,在图4中的编号是160-165,在图5中的编号是190-202。图中左部的函数代码是记录器和展示器模块的一部分。右部的回调函数代码是使用这些模块的宿主软件的一部分。
图4中,函数CsrMoveTo()、CsrLineTo()、CsrQuadraticTo()、和CsrCubicTo()被来自于回调函数ExecChar()的直线所指示,因为这些函数被ExecChar()调用以将那些定义字符形状的移动、直线、和曲线传递到记录器。
图6更详细地描述了示于图1的第一计算机102上的函数元素。它显示了一个过程,即作为模块字符形状记录器124的宿主程序的文件发生器114怎样将一个使用了预定义字体描述的输入文本116转换为可移植文件14。
文件发生器包括一个主程序204和图4右部列出的回调函数160-165。
步骤210是文件发生器的主程序运行的第一步。它调用CSR的CsrOpen()函数150。在步骤212中,CsrOpen()打开并初始化演示软件模块124,给予它所需的内存缓冲和临时文件,并建立它的初始数据结构。
一旦函数返回,文件发生器的下一步骤214执行一个循环直到处理完所有输入文本116中的代码。为每一个从输入文本中接收的代码,此循环执行步骤216、218、220、和222。
步骤216判断接收的代码是否为字体名称,例如输入文本中的代码217。如果是字体名称,便执行步骤224、226、228、和230。步骤224保存接收来的完整字体名称的基本字体名称部分,并用pFontId指向它。步骤226从接收来的完整字体名中计算字体属性,例如它的尺寸,是否倾斜,以及是否为实体字体或轮廓字体,并且将字体属性保存到一个叫做FontAttribute的数据结构中。步骤228用pFontId和FontAttribute调用CSR的CsrSetFontSpecs()函数151。
图7更详细地描述了CsrSetFontSpecs()操作。在步骤300中,它在示于图8顶部的物理字体记录302的链表中查找一个物理字体记录,这个物理字体记录的pFontID数值304指向的物理字体名称和CsrSetFontSpecs()调用时使用的物理字体名称一样。如果这个匹配没有找到,就是说CSR没有指定物理字体的记录,那么步骤306就执行步骤308、310、和312来创建这样一个物理字体记录。步骤308实际地创建一个新物理字体记录数据结构302,此结构具有给定的pFontID数值,并将它放在物理字体链表的最后。步骤310调用宿主文件发生器的GetFontInfo()回调函数162(示于图6),从字体解释器得到关于物理字体的信息,并将这个信息放置在新物理字体记录中。此信息包括ORU精度,字体解释器用这种精度定义那个物理字体形状的移动、直线、和曲线。它还包括物理字体的名称。步骤312在一个称为“暗示”的过程中为每一个字母数字子集调用文件发生器的GetCharID()和ExecChar()函数。首先调用GetCharID(),它返回在第一计算机的字体解释器中定义那个字符所用的字符码,然后它用GetCharID()返回的字符调用ExecChar(),从而得到字符形状。
如此就得到了一个标准的水平和垂直位置的测量,以及在物理字体中与特定字符特性相关的标准粗细。这些暗示值被记录在物理字体记录中,并最终和物理字体一起存储在可移植文件中。如此,它们可以被字符形状展示器使用以转换被展示字符轮廓的重要边缘的位置,从而生成更吸引人的图象,也可以得到被使用的象素格式的颗粒形状。暗示是著名的计算机字体技术。值得注意的是,记录在可移植文件104中的暗示信息并非来自于第一计算机的字体源的预定义字体描述中的暗示信息,而是来自于字体的字符特征的实际位置和尺寸。
ExecChar()164作为一个重要的回调函数被CsrSetFontSpecs()和CsrDoChar()一起使用。它以字体解释器给每个给定字符所使用的名称而被CSR功能调用,它通常是输入文本中代表字符的代码。它通过调用第一计算机的字体解释器120而响应,此解释器是为被pFontIDFont和FontAttributes所指示的现有字体的字符而设计的。如果这个字体是矢量字体,ExecChar()分别调用CsrMoveTo()、CsrLineTo()、CsrQuadraticTo()、或CsrCubicTo()响应每个从字体解释器所接收到的移动、直线、quadratic Bezier曲线、或cubic Bezier曲线,以将直线和轮廓线段的定义传递给CSR。在某些文件发生器中,如果字体解释器返回的是位图格式,ExecChar()通过在位图上执行边缘判断而响应,然后用去往每一点的初始移动向CSR描述每个被探测到的边缘,这些移动后面跟有被边缘上的在每个相继点之间的系列直线。
无论物理字体是否与给定的pFontID匹配(无论pFontID是早已存在,或只是被步骤308,310,和312所创建),步骤314使那个物理字体记录成为当前有效的物理字体。
然后,步骤316在与当前有效的物理字体记录302相关的逻辑字体记录318的链表中查找逻辑字体记录,这些逻辑字体记录的FontAttribute值319和调用CsrSetFontSpecs()时所使用的参数值的FontAttribute匹配。这些值包括FontMatrix,它定义了物理字体是如何伸缩和倾斜(如有必要)以产生定义在文件坐标系中的字符形状的。它也包括一些这样的信息字符形状是否要用实体形式或用轮廓形式来显示,并且如果要用轮廓形式显示,应使用多粗的轮廓,以及在角的地方应该怎样连接。如果这样的具有指定FontAttribute的逻辑字体记录没有找到,步骤320在逻辑字体列表的末尾创建一新逻辑字体记录,并将指定的FontAttribute值319记录在其中。然后步骤322将早已存在的或新建的具有匹配的FontAttribute的逻辑字体当作CSR的当前有效的逻辑字体,并且步骤324返回到文件发生器,返回时带有一个代码,这个代码唯一地指定了pFontCode指针所指向的当前有效逻辑字体。
CsrSetFontSpecs()返回文件发生器后,步骤230将pFontCode指向的FontCode 217A放置到可移植文件的文本118的代码队列中。一旦这些完成了,程序回到循环214的顶端,以处理从输入文本中接收来的下一个代码。
如果从输入文本中接收来的代码是表示字符的代码219,步骤218中的判断将满足,并且步骤236和238将执行。
步骤236为这个代码调用CSR的CsrDoChar()函数。这个函数在图9中展示得较清楚,它是CSR的一个特别重要的部分,因为是它真正地执行字符-字体形状记录过程。它的第一步,步骤328,在字符记录330的二叉树中查找具有与CsrDoChar()函数调用时使用的charCode相匹配的charCode 332的字符记录,刚才提到的二叉树在图8中展示了,它里面有当前有效的物理字体记录302。这种树是二叉树,一种非常著名的数据结构,因为每一个它的字符记录可以指向两个孩子字符记录,一个通过pNextUp指针340指向,另一个用pNextDown指针342来指向。记录被加到树中要满足下面的情况,所有charCode比给定记录的charCode小的记录在给定记录的pNextDown指针指向的分支中,所有charCode比给定记录的charCode大的记录在给定记录的pNextUp指针指向的分支中。这样树可以快速查找,在每一个记录处,如果指定的charCode比它的charCode小就顺着pNextDown分支查找,如果指定的charCode比它的charCode大就顺着pNextUp分支查找。这个查找将一直进行,直至找到了charCode和指定的charCode匹配的记录,或者遇到pNextDown或pNextUp为空指针,这意味着和指定charCode匹配的记录在树中不存在。
如果这个匹配charCode在一个当前物理字体的相关字符记录中找到了,刚才对CsrDoChar()的调用已经录制了当前字体的当前字符的形状,这样CsrDoChar()就执行完了。在这种情况下,步骤334返回到文件发生器。如果找不到匹配的字符,步骤336激发图9中的其它步骤,来执行字符形状录制。
字符形状录制的第一步,步骤338,创建一个新的字符记录数据结构330,并将它插入到二叉树中合适的位置,给定它的charCode。如果pRootCharacter的值为0,则二叉树为空,意谓着对这个当前物理字体而言,它是所处理的第一个字符。在这种情况下,新字符记录作为树的根结点插入到二叉树中,并且用pRootCharacter指向它。如果树不为空,新字符记录插到一个节点,在这个节点处,上述的树查找遇到一个空的pNextDown或pNextUp指针,并用这个指针指向这个新记录。系统依据树的一边的记录是否比另一边多来判断树是否不平衡。如果这样,它将重新组织树以使它平衡,树就有尽可能少的层次,这样搜索就很快。
一旦步骤338为所处理的字符插入了一个字符记录到字符树中,步骤340通过设置它的初始化数据结构来初始化字符形状处理过程,这些数据包括图10的字符形状数列339的开始部分。字符数列339以点数据结构341的顺序存储描述轮廓线段的点,此轮廓线段来自于文件发生器的ExecChar()函数164。步骤342为字符调用文件发生器的ExecChar()函数164,它通过调用图6中的CSR的CsrMoveTo(),CsrLineTo(),CsrQuadraticTo(),和CsrCubicTo()函数153,154,155和156来实现,为每一个移动、直线、quadratic Bezier曲线、和cubic Bezier曲线单独地从第一计算机的字体解释程序中补充ExcChar()函数。一旦ExecChar()被调用,CsrDoChar()就等待ExecChar()结束,在这个等待过程中,CSR将通过ExecChar()调用的Csr To()函数153-156来初始化字符形状录制过程。为了简便,图9和它的描述中,等待和函数Csr To()所执行的步骤用循环344和它以下的步骤来表示,好象它们是CsrDoChar()函数的一部分。
当被ExecChar()调用的函数是CsrMoveTo()时,步骤346激发步骤348和350。步骤348判断是否存在一个打开的形状数据结构349A,如同图9中所示,如果存在,它执行步骤352和354。打开的形状数据结构349A用于接收信息,包括从调用CsrDoChar()时所使用的当前字符-字体组合的正在处理的当前轮廓的形状中导出的轮廓线段。如果存在这种打开的形状,CsrMoveTo()指示一个从这个轮廓到下一个轮廓的移动。在这种情况下,步骤352在刚才打开的形状结构349A中完成填写信息并关闭它。然后步骤352将这个关闭的形状349放置到形状树356上去,356(如图10所示)是这些关闭形状组成的层次树。不论调用CsrMoveTo()时是否早已存在打开的形状,如果在执行步骤350时没有,这个步骤将用CsrMovoTo()指示的移动决定的第一个点打开一个新形状。
当ExecChar()调用CsrLineTo(),CsrQuadraticTo(),或CsrCubicTo()时,步骤358激发位于图9下部的步骤360,362,364,366,和368。
如果没有打开的形状,步骤360返回一个错误,因为CsrLineTo(),CsrQuadraticTo(),和CsrCubicTo()都定义了与当前形状中的一个预定义点相关的线段,如果没有这样的打开形状,系统就不知道怎样解释它们。
步骤362通过调用函数Crs To()存储与每一后续轮廓线段相关的点。ExecChar()对CsrLineTo()的每一次调用都增加一个点到数列中,这个点是从数列中前一个点开始的线段在轮廓线上的终点。对CsrQuadraticTo()的每一次调用都增加两个点到数列中,第一个是从数列中前一个点开始的quadratic Bezier曲线的一个轮廓外控制点,另一个是这个曲线上的轮廓终点。对CsrCubicTo()的每一次调用都增加三个点到数列中,其中两个是从数列中前一个点开始的cubicBezier曲线的两个轮廓外控制点,另一个是这个曲线的轮廓终点。
步骤364通过调用CsrQuadraticTo()或CsrCubicTo()来区别接收来的每一个曲线线段,以判断这条曲线是否包括一个拐点或XY极值点(具有水平或垂直切线的点)。如果找到了这样的点,它就标记它们,如同在字符形状数列中一样,或者,如果这些点不是早已存在于字符形状数列中的终点,它在这个标记点处将曲线分成两根,然后用表示分开而成的每一曲线的点集合替换表示原曲线的点集合。
图11展示了cubic Bezier曲线402,在其中间有一个拐点。最初,这条曲线用从CsrCubicTo()接收来的三个点表示第一控制点404,第二控制点406,和一个终点408。这条曲线也可由字符形状数列中的前一个点410定义。步骤364可以判定这条曲线有一个拐点412。由于这个点不是曲线的两个终点408和410,它在拐点412处将曲线分成两条新的曲线411和413,每一条曲线分别具有两个控制点415和416,417和418。曲线411将拐点412当成它的终点。曲线413将原始曲线的终点408当成它的终点。点415,416,412,417,和418被插入到字符形状数列中,以替换原始曲线的两个控制点404和406。图12展示cubicBezier曲线402A,它在水平切线的切点处将曲线分成两条新曲线。
步骤366判断在字符形状数列中是否存在轮廓上的点,在这个字符形状数列中,经过用于定义直线段或曲线段的两个点存在一条直线段或曲线段。如果存在,对于每一个这样的点,336要判断是用角还是用切线来标记。切线是通过选择那些没有被标识为角的,位于曲线段和直线段之间的点来确定的,这些直线段具有足够的长度,用单一的cubic Bezier曲线很难近似它们的形状。每一个这样的点都与最大值和最小值进行比较,这种比较相对于形状ContourBBox中的X和Y轴进行,如果它大于最大值或小于最小值,最大值或最小值将被修改。如果这个点是X轴上的最大点,在那里形成的角的方向,不论是顺时钟还是逆时钟,如同图13的处理所确定的一样,将作为这个形状的实际方向记录下来。
图13展示了挑选要标记为角的点以及(如果可能的话)将这个角和一个方向联系起来的过程。这个过程确保了CSR接收的形状描述的轮廓精度单元(“ORU”)量化过程生成的清晰角度不会被标记为角点。它包括步骤370-376。
步骤370找出最左和最右的矢量1L和1R,分别如图14B所示,矢量从点380开始,前置点381在字符形状数列中试探,这些试探点形成一个方形384。这个方形的每边具有两个轮廓精度单元(ORU),它的中心点是试探点381。“左”和“右”由轮廓线段在字符形状数列中的接收顺序所决定。步骤372找出最左和最右矢量2L和2R,分别从381开始,在以382为中心的边长为两个ORU的方形386中试探,在字符形状数列中382后紧跟测试点。
在给定每一个点位置的允许量化错误的情况下,矢量1L和1R表示从点380到点381的矢量的可能方向的范围。同样,在给定这些点的允许错误的情况下,矢量2L和2R表示从点381到点382的矢量的可能方向的范围。
如果试探点381的前面或后面的线段是曲线,点380或382分别是曲线外控制点。然而,这并不困难,因为从quadratic或cubic Bezier曲线的终点到它的最近的控制点的连线在它的终点处和曲线相切,这样从终点到此控制点的连线将影响它在终点处跟相近轮廓线段所形成的角度。
一旦步骤370和372计算了矢量1L、1R、2L,和2R,步骤373,374,375,和376将执行一系列的判断,以确定试探点381应该怎样标记。步骤373判断矢量2L和2R各自与1L和1R所形成的左角是否在0和180度之间。在图14的实例中,它味着判断矢量2L和2R是否落到图14C的范围377中。如果判断成立,这意味着在点381和点382之间的所有可能矢量(如果给定允许的量化错误)和所有在点380和381之间的可能矢量形成一个左角,这样,步骤373将试探点381标记为一个确定的左角。
如果步骤373中的判断没有满足,步骤374将判断矢量2L和2R各自与1L和1R所形成的右角是否在0和180度之间。在图14的实例中,这意味着判断矢量2L和2R是否落到图14C的范围378中。如果步骤374中判断成立,这意味着所有在点381和点382之间的可能矢量(如果给定允许的量化错误)和所有在点380和381之间的可能矢量形成一个右角,这样,步骤374将试探点标记为一个确定的右角。
如果步骤373和步骤374中的判断都不满足的话,步骤375将判断2L和1R形成的右角是否在0和180度之间,以及2R和1L形成的左角是否在0和180度之间。在图14的实例中,这意味着判断在矢量2L和2R之间的可能方向是否没有一个落到图14C的矢量1L和1R之间的可能方向381形成的范围中。如果步骤375中的判断成立,即意味着所有在点381和点382之间的可能矢量没有一个可以与点380和点382之间的可能矢量形成直线,给定允许的量化错误,并且步骤375将这个点标记为一个确定角。但是它标记这个点为左角或右角,因为373和374中的判断没有一个满足。
如果步骤373,374和375中的判断都不满足,步骤376标记这个点为非角。
在图14D中揭示了图14A和14B中展示的点集合的测试应用程序。图中,可以看到在2L和2R之间的可能矢量的范围落到弧线的377部分,此弧线在矢量1L和2R之间的可能矢量的左边。这样,步骤373中的判断将满足,并且试探点被表示为左拐,它有一个小于ORU量化的特别小的角度。这在图14A中展示出了,因为尽管每个点380,381,和382的X和Y值允许在最大ORU错误(半个ORU)之内变化,如以这些点为中心的一个ORU单位的方形398所示,通过这些点不可能画出一条直线400(在图中以点线示出)。
如图15A-C的实例所示,点380A,381A,和382A之间的明显左角足够小,给定它们之间的距离,可以画出接触了三个方形398A的直线400A,表示点之间的明显角可以在ORU许可错误之内形成。如图15C所示,步骤373,374和375中的判断没有一个满足,因为在2L和2R之间的可能矢量的方向范围并不完全位于左边、完全位于右边、或完全超出了1L和1R之间的可能矢量的方向的范围。这种情况下,步骤376标识试探点为非角。
如图16A-C的实例所示,明显左角足够的小,但是量化错误太大了,以致实际上成了右拐,而不是左拐,如同点线角边400A所示。在这种情况下,如图16C所示,2L和2R之间的可能矢量方向的范围并不完全在1L和1R之间的可能矢量方向范围的左边,或完全在右边,并且导致步骤373和374中的判断都不满足。但是2L和2R之间的可能矢量方向范围完全在1L和1R之间的可能矢量方向范围的外面,这样步骤375中的判断将满足,试探点被标识为一个左方向角或右方向角。这种情况下,字符形状记录器为了实现图9的步骤368而把此点当成标记点使用,但是如果这个角是X的最大值,它不会为图中的步骤366的形状方向的计算而使用这个角。反而它将离开上一个确定方向(如果有),这个方向和一个角相联,这个角在此时作为形状的实际方向的X最大值。
一旦步骤364和366处理完了,步骤368为字符形状数列中位于两个后续点之间的轮廓线段部分执行步骤420,422,424和426,这两个后续点被步骤364和366标记为拐点,XY极值点,角,或切线。
步骤420近似轮廓的这种部分,轮廓用一条直线或曲线可以覆盖字符形状数列中的一个或多个线段。如果这两个标记点之间的轮廓部分是一条简单直线或cubic Bezier曲线,此直线或Bezier曲线将用作近似线。否则,直线或曲线调整技术将用于寻找近似。
如果轮廓部分是用曲线来近似的,步骤422将计算近似曲线的“深度”。也就是说,它计算曲线被递归地分成两条曲线的次数,直到在细分和两终点之间的矢量最大误差小于半个ORU。这个值在展示器从可移植字体源中读字符形状时被字符形状展示器使用,这样它可以知道该怎样细分每一条曲线,以精确地用矢量近似来展示曲线。
图17揭示了执行这个深度分析的主程序的步骤,图18揭示了执行递归细分的递归程序的步骤。此主程序有四个主要步骤430,432,434和436。
步骤430检查跨越曲线的终点和每个曲线控制点的矢量间的距离是否小于半个ORU。如果这样,它归还一个0的深度,因为在终点间矢量错误的允许下,曲线根本用不着细分就可近似曲线。依据cubic Bezier曲线的本来形状,矢量和曲线的控制点的距离被采纳,因为矢量到它相应的cubic Bezier曲线的距离不会大于到曲线控制点的距离,并且在数学上寻找从矢量到两个控制点的最大距离比寻找从矢量到曲线的最大距离简单得多。
如果步骤430中的判断不满足,步骤432将调用图18中的递归细分子程序。如同图18中所示,这个子程序调用时带有要细分的cubic Bezier曲线的1stEnd,1stControlPoint,2ndControlPoint,和2ndEnd指针。它还带有递归的深度参数。子程序由步骤440,442,444,446和448构成。
步骤440判断子程序调用次数的深度值是否大于当前的maxDepth(对于这个曲线所能执行的最大递归深度)。如果满足,它将maxDepth设置成这个递归深度。然后步骤442找出Bezier曲线的中点,在此点处,递归被调用,并将曲线分成两条新的Bezier曲线。然后,步骤444找出哪一条子曲线和从终点到它的一个控制点的矢量的距离最大。一旦完成,步骤446就判断这个最大距离是否小于半个ORU。如果这样,步骤446将1stEnd和2ndEnd存储到一个叫做deepestSubCurve的结构中,这样在图17中揭示的程序可以给出具有最深递归的曲线在哪结束,并且返回到那个程序。如果不是这样,步骤448为新子曲线调用递归细分子程序,此新子曲线与从终点到它的一个控制点的矢量的距离最大。
对编程熟悉的人可以看出,这个递归子程序将反复地在曲线的中间细分给定的Bezier曲线,直到剩下的曲线的长度在半个ORU之间。在此点上,maxDepth等于最深的递归层次,deepestSubCurve等于最深子曲线的终点,那个递归将返回到调用它的递归程序,依次类推,直到对递归细分的最初调用返回到图17的步骤432。
在这点上,步骤434判断存储在deepestSubCurve中的最深子曲线的一个终点是否是经过了深度计算的源完整曲线的终点。如果是,它将继续调用递归细分子程序,这一次是针对源曲线的另一半,源曲线是包括了刚才递归所找到的最深子曲线的曲线。给定cubic Bezier曲线的细分之间的偏差和对细分的矢量近似之间有一个局部最大值,对于整个曲线来说,这也是全局最大值,它位于曲线的两个终点间的某个位置,或位于曲线一个终点处的两个全局最大值之间,它们中间的一个可能需要比另一个更深的递归调用。在第一种情况下,对步骤432中的细分程序的第一次调用递归可以保证找到整个(源)曲线的最大偏差。但在第二种情况中,源曲线的在第一层递归调用时具有最大偏差的那一半曲线可能不是具有最深局部最大值的那一端,这样,步骤432的递归可能找不到曲线的真正最大深度。步骤434为第二种情况中源曲线的另一端激发递归执行,以确保源曲线的两端的曲线深度都可以找到,这样maxDepth将是最大的深度。
图17和18中展示的深度查找算法显著地加快了字符形状录制的执行,因为它只在最不符合矢量的那一半子曲线上执行递归,这就避免了对随这曲线的深度成指数递增的多个的深度分析的计算操作。
现在回到图9,其中,步骤422执行完后,步骤424将步骤420计算出的近似线段插入到图10中的打开形状结构349A的点数列339A中。可以看到,用曲线上的点和在形状点数列中的控制点所表示的轮廓线段跟水平和垂直切线拐点、筛选角,以及可以在由从CSR中ExecChar()接收来的轮廓线段定义的,而不是由这些轮廓线段的实际线段定义的形状中找到的曲线和清晰直线之间的边界线有关。
一旦新近似的轮廓线段被放置于打开的形状349A中,步骤426从字符形状阵列中删除所有那些不属于没有被近似的、或不需处理的非近似线段的点。这样可以节约内存,因为这些点已没有使用价值。
步骤346或358和它们各自的子步骤在处理给定字符字体形状时将调用CSR的ExecChar()。
接下来对CsrMoveTo()的每一次调用是从ExecChar()中发出的,它确定了形状或轮廓描述的末尾、在ExecChar()描述的形状和另一个这种形状的开始,或如果不存在多个这样的形状,则确定了去往下一个字符的开始位置的移动,此字符标志ExecChar()的形状描述的完结。每一种情况下,如果下一个对CsrMoveTo()的调用发生了,步骤352填充完并关闭形状349A,步骤354将它放置在形状树的合适位置。
步骤354将它放置于层次树356中的步骤如下如果形状树是空的,它将全局变量pContourRoot指向一个新的形状。如果形状树不为空,它将在最高层次上扫描形状列表。对于每一次扫描,如果这个新的封闭了它,它将扫描过的形状从列表中除去,并将它加到新形状的女儿列表中,女儿列表由pDaugther 452指定。如果新形状被扫描过的形状所封闭,它将从这个刚扫描过的形状的女儿重新开始扫描。当达到这个列表的末尾,它将这个新的形状加到列表中。实际的形状插入操作保持了一致的顺序,以确保下面所说的雕刻匹配可靠。顺序是依据形状大概方框ContourBBox的xmin值所决定。为严谨起见,顺序ymin,xmax,或ymax在遇到不同的值之前一直使用。具有唯一大概方框的明显兄弟形状应是不存在的。
在图10揭示的实例中,与注册商标符号453中的圆的外轮廓相连的形状结构349B将最终被放在形状树的第一个或最高层次,因为它包括了所有那些符号的其它形状。和注册商标的“”字的外轮廓相联系的形状349C将是第二层次上的形状。和注册商标的“”字的外轮廓相联系的形状349D将是第三层次上的形状。和注册商标的“”字的内轮廓相联系的形状349E将是第四层次上的形状。应该明白,一些字符在一个层次上可有多个形状。举例,形状“”在第一层次上有所有的三个形状,然而,形状“B”在第一层次上有一个形状,在第二层次上有两个相关形状。
一旦ExecChar()返回到图9的步骤460中的CsrDoChar(),字符-字体形状的每一轮廓将记录在一个关闭的形状结构349中,每一个这样的结构都应该包括到层次树中,表明层次树包括它。在这点上,打开的形状存在于在步骤350中由ExecChar()调用的CsrMoveTo()所创建的结构中,它和字符-字体形状的退出(出口)有关。步骤460将保存这个打开的形状中的初始点,以为所录制的形状计算退出值,并且关闭这个打开的形状。
然后步骤462将形状树365分成两个层次子树。也就是说,将每一个奇数形状和它的0个或多个女儿形状包括到子树355中。例如,图10中,第一层次形状349B,它表示注册商标符号“”的外轮廓圆,以及形状349C,它表示内轮廓圆将包括在同一个子树中,而且形状349D和349E,它们表示符号“”的外轮廓和内轮廓将包括在另一个子树中,它表明每一个层次子树都反映了一个雕刻元素,也就是说,反映了非连接的实体形状。
一旦形状树依据雕刻元素被分成了子树,步骤464为每一雕刻元素执行步骤466,468,470,472,474,476,和478。
步骤466标准化形状的方向。即它检查每一个雕刻元素的最高或最外层形状的轮廓线段的顺序是否是逆时钟方向,如果不是,它将颠倒这些线段的顺序,以使它具有逆时钟方向。同样,它将检查雕刻元素的第二层次或内面层次形状是否是顺时钟方向,如果不是,它将使它们变成顺时钟方向。这样有一个好处,雕刻元素的内面和外面形状分别都有同样的方向,而不管这些形状传给CSR时是怎样的方向。
步骤468为每一个形状选出一个标准点。因为每一个形状是关闭的,开始点是随机的。然而,为了简便雕刻匹配和优化文件的显示操作,对于每一个形状的开始点应依据几个简单的规则。对于外面的形状,开始点应选择形状的最低点。如果有好几个同样的最低点,则应选择最右边的那个。对于内面的形状,开始点应选择形状的最高点。如果有好几个同样的最高点,则应选择最右边的那个。这两个开始点的可能点的索引早已在字符形状处理时设置在形状数据结构中。这样,选择适当的点就简单地变成了依据形状的所期望的方向选择这两个索引中的一个。
步骤470创建边缘和笔画列表。边缘列表是形状中所有有效水平和垂直边缘的列表,这些边缘包括水平和垂直切线。笔画是一对对这样的边缘,这些边缘表示形状的给定的水平和垂直特性的相对边。这些值用于暗示。
步骤472为每一个雕刻元素产生一个雕刻记录482和雕刻程序字符串(“GPS”)484,如图10所示。在步骤466和468中按在雕刻元素相连的子树355中的那些形状的顺序标准化了轮廓线段的顺序后,雕刻程序字符串表示每一个雕刻元素相连的形状中的轮廓线段的顺序。可以看到,形状描述和轮廓线段的顺序方面无关,这些轮廓线段是为那些不是有形状本身确定的雕刻形状从ExecChar()中接收来的。这个GPS将加到GPS内存中GPS数列的末尾。它在内存中的位置和尺寸由Glyph记录中的glyphProgramStringOffset 454和glyphProgramStringSize 452决定。雕刻记录还计算雕刻标记符456。这个标记符是一个可以高效地唯一标识雕刻的压缩字节串。这个标识与因子的位置和范围无关。它包括雕刻的形状数目,在步骤470中计算出的水平和垂直边缘数目,所考虑的最右边笔画的相对尺寸,最高笔画的下边缘的相对位置,外面形状的外角数目,外面形状的内角数目,内面形状的外角数目,和内面形状的内角数目。在这标记符中,位置和尺寸全都是相对雕刻的大概方框而言的,因而,同样形状不同尺寸的雕刻具有同样的标记符。
一旦新雕刻记录482和它的相应新GPS 484A创建完了,步骤474将搜索二叉树481,如图19所示,二叉树中包括了为前一个所记录的雕刻形状生成的雕刻记录482。这棵二叉树由每一个雕刻记录的标记符中相同的字节组成的数字值构成。这是为了快速简单地查找匹配雕刻形状而设计的。在树中的每一个雕刻记录中,指针pNextDown 482指向树中那些具有较低值的标记符的雕刻记录的向下分支。指针pNextUp 484指向树中那些具有较高值的相应的雕刻记录的向下分支。指针pNextEqual 486指向树中那些具有同样标记符值的雕刻记录,如果存在。一组具有同样标记符的雕刻记录482C在图19中示出了。
如图19所示,如果找到了具有和新雕刻记录482A同样的标记符的雕刻记录482B,步骤476将执行步骤488和490。步骤488通过跟新记录482A具有同样标记符的雕刻记录482B,用在GPS 484B中点的顺序和跟GPS 484A相连的新雕刻记录中的点的顺序进行比较。在此之前,这两个雕刻记录的大概方框以被标准化成具有同样的尺寸,因此这个比较将独立的进行。这使得在“”中的形状“R”和“R”匹配,“”中的形状“1”和“1”匹配。在所示的例子中,假设同雕刻记录482B相连的GPS 484B中的点和新雕刻记录的GPS 484A中的点不匹配。
如果在雕刻树中存在一组和新雕刻记录482A具有同样的标记符的兄弟雕刻记录,新雕刻记录相连的GPS 484A将和这些兄弟雕刻记录的每一个进行比较。在图19中的例子中,这意味着GPS 484A也要和跟新雕刻记录482D相连的GPS 484D进行比较。在例子中,假设这两个GPS相匹配。
这种快速匹配的能力较大地由于下面的事实变得较为简单,每一个GPS的形状的顺序,形状的方向,和形状的开始点都是经过标准化了的,并且由ExecChar()传送雕刻到CSP的雕刻的形状的主要行为是各自独立的。这意味着,具有同样形状的雕刻,不管是从不同的字符,不同的字体,还是不同的字体描述语言中接收来的,都将具有同样的GPS,只要在范围和许可错误允许下,这样可以进行快速的匹配。
在允许错误下,如果找到这样的匹配,如同图19中的GPS 484A和484D,步骤490将照常地删除新雕刻记录的GPS 484A,并将在新雕刻记录482A中的glyphProgramStringOffset和glyphProgramStringSize的值指向这个匹配的GPS 484D。如果新雕刻记录的GPS和刚才记录的匹配GPS的尺寸不同,将在刚才记录的匹配GPS描述的雕刻转化成合适尺寸的空间信息和这个新的雕刻记录有关。如果在新GPS 484A中描述的尺寸比在刚才记录的匹配GPS 484D中所描述的尺寸大,它们被视为不匹配,以避免雕刻的形状中不必要的低精度描述继续用作新的雕刻记录中。
一旦匹配雕刻形状的工作完成了,如果雕刻GPS和树中的已有的不匹配,步骤478将新的雕刻记录482A插入雕刻记录二叉树481中适当的位置。
为所有当前正在处理的字符字体形状的雕刻,查找看是否这些形状可以用普通的GPS的参考来定义,当树中的所有雕刻记录都查找完了后,步骤480将图8所示的正在处理的字符字体形状的字符记录330的glyphProgramStringOffset 490和glyphProgramStringSize 492指向这个字符的GPS。如果字符记录相联系的形状是由伸缩,转化,或合并由一个或多个其它的GPS所定义的雕刻而成的,指向字符记录的GPS将是一个混合的GPS,如图8中的GPS 484D。每一个这样的混合的GPS包括一个或多个指向其它这样的GPS的指针,并带有一些必要的伸缩和转化信息,这些信息用语定义在字符记录相关形状中的每一个其它这样的GPS相关的雕刻的尺寸和位置。
一旦这些完成了,如果正在处理的字符字体形状的大概方框的x或y的最大值或最小值超过了刚才处理的字符字体形状的x或y的最大值或最小值,步骤496更改当前物理字体的大概方框的x或y的最大值或最小值。
在这里,调用CsrDoChar()的字符-字体形状的处理完成了,CsrDoChar()返回。
现在返回到图6,当步骤236对CsrDoChar()153的调用完成后,步骤238将代码219A放置到可移植文本文件118中,并且程序跳转到循环214的顶端,处理从输入文本中接收来的下一个代码。
如果从输入文本中接收来的代码是一个位置代码221,则在步骤220中的判断将满足,并且步骤220将相应的位置代码221A放置到输出文本中,程序跳到循环214的顶端继续执行。
输入文本可以包括描述,或代码,223表示非字符形状的形状,如在图1中所示的视频显示106上的记录242。在图6所示的实施例中,这些描述包括在PostScript页中的描述语言中,这种描述语言不但可以描述字体,而且可以描述页面布局和非字符形状。
如果在输入文本中接收到了非字符形状223,步骤222中的判断满足,那步骤如同为字体“shape”接收字体代码,它为代码223所描述的非字符形状分配一个唯一的字符代码。步骤222将pFontID指向“shape”,为FontAttributes置标准值,调用CsrSetFontSpecs(),将为“shape”字体返回的FontCode放置于可移植的文件104的文本中。然后,步骤222为形状唯一的charCode调用CsrDoChar(),以建立它的形状的字体描述,并且将形状的唯一的charCode 219A放置于可移植的文件文本中。
当pFontID指向“shape”,步骤222中的操作进行的时候,GetFontInfo()将用来为CSR描述形状的轮廓精度的信息填充CsrSetFontSpecs,GetCharID()返回空值,表示这个用于暗示的字符不是有效的“shape”字体,使CsrSetFontSpecs()不再调用ExecChar(),并且当CsrDoChar()调用ExecChar()时,它将返回由PostScript形状描述定义的移动,直线,和曲线。
一旦循环214处理完了输入文本116中的所有代码,步骤244调用CSR的CsrWriteResource函数157。CsrWriteResource()调用WriteResourceData()以实际地写这些数据,因为这种写操作依赖于所使用的操作系统。CsrWriteResource()压缩包括在物理字体记录中的数据,和与之相关的逻辑字体和字符记录,以及雕刻程序字符串,并将它们录制到可移植的字体源(“PFR”)126,该字体源是图20中的主要元素。如可以从图中所看到的,PFR包括逻辑字体目录500,一个或多个逻辑字体记录502,一个或多个物理字体记录504,一个或多个简单雕刻字符串,以及0个或多个混合雕刻程序字符串508,它由一个或多个其它GPS所定义,如图8中的GPS 484D。逻辑字体目录500,包括一张查找表,它可以将可移植文件中的fontCode 217A转换成在PFR中的那个fontCode的相关逻辑字体记录502的地址和尺寸。每个逻辑字体记录包括逻辑字体的FontCode的值和PFR中它的相关物理字体记录504的地址和尺寸。每一个物理字体记录包括一个或多个字符记录510,每一个记录包括简单或混合雕刻程序字符串506或508的地址和尺寸,它们用一系列的移动,直线和曲线实际地描述了它的形状。
一旦对CsrWriteResource写完了PFR,步骤246调用CsrClose以关闭CSR,程序204执行完毕。
图6中展示的输入文本116的图形是图1中在视频监视器106中显示的带字体的文本的初始部分的图解表示。图6中展示的可移植文本104的图形是表示这种带字体文件的文件18的图解表示。通过比较两种文本可以看到,输入文本中的每一字体名字217,每一字符代码219,以及每一位置代码221在可移植文件中分别都有一个相应的fontCode 217A,charCode 219A,或位置代码221A。并且,包括在输入文本中的每一非字符形状223在可移植文件中都有一个fontCode 217A或charCode219A。
图21给出了对图1中在第二台计算机上显示的功能元素的详细的图解视图。它显示了页发生器134和模字符形状展示器136是怎样显示可移植文件104中包含的带字体文本的可视图象的。它展示了一个实施例,这例子中的第二台计算机包括一字体解释器120A和字体源122A,它们和上面描述的第一台计算机的字体解释器120和字体源122具有相似的功能。
页发生器包括一个主程序250和图5中所示的回调函数190-202,一些没有必要的回调函数没有在图21中列出。
页发生器的主程序所展示的第一步是步骤252。它是形状展示器或CSP的CspOpen()函数171。它打开并且初始化CSP数据结构。
一旦CspOpen()返回,步骤254确定要创建的图象和可移植文件的关系,包括图象对文件的相对位置和它的尺寸,范围以及相对于文件的旋转。它使用这些数据为这个图象计算outputMatrix和outputBBox。outputMatrix描述了从可移植文件中计算来的文件坐标是怎样相对要创建的图象的坐标进行偏移,伸缩,或倾斜的。outputBBox确定了相对于文件坐标来说那些点是不符合图象的,这样就没有必要由CSP来产生了。
步骤256判断位图化或轮廓输出是否满意。位图化输出用于视频显示和激光打印。它用由象素数列组成的图象表示字符形状。轮廓输出用于标绘器,它可用于创建字体。它用一系列的移动,直线或曲线表示图象。
如果步骤256确定位图输出已经可以了,步骤258和260将执行。步骤258调用CSP的CspInitBitmapCache()函数170。它将初始化位图缓存,位图缓存存储了尽可能多的由CspDoChar()创建的字符字体形状的拷贝,这样,当为给定的字符字体合并对CspDoChar()做重复调用时,那个形状的实际位图将在第一个调用前创建完毕,并且,调用完成后位图可以容易地从位图缓存中恢复出来。当对CspInitBitmapCache()的调用返回后,步骤260调用CSP的CspSetOutputSpecs()函数175建立CSP,以展示位图化图象。如果步骤256确定轮廓输出可以使用了,步骤262调用CspSetOutputSpecs()来建立CSP以产生轮廓。
在这些情况里,CspSetOutputSpecs()也会设置CSP的outputMatrix和outputBBox数据结构,以影响页发生器的那些数据结构。CSP的outputMatrix确定了由CSP创建的形状的坐标应该怎样地依据包括在新字体描述中的形状伸缩和旋转。CSP的outputBBox使得CSP不处理它所创建的图象的外边的数据信息。
一旦步骤260或262中对CspSetOutputSpecs()的调用完成了,步骤264执行一个循环,它按顺序排好在可移植的文件中的文本118的代码,直到所有的与所创建图象中的信息相关的代码都处理完毕。这个循环由步骤266,268和270组成。
如果正在处理的文本118中的当前代码是fontCode217A(字体代码),步骤266使得步骤274,276和278开始执行。
步骤274调用CSP的CspGetFontSpecs()函数173,以获取用当前fontCode所表示的字体名字。如果这个完成了,步骤276判断第二台计算机的字体解释器120A和字体源122A是否可以用那种字体产生字符的图象。这需要字体解释器102A可以解释那种字体使用的字体描述语言,而且在字体源122A中有那种字体的预定义字体描述集合。如果这个满足了,并且字体可以被字体解释器产生,步骤276设置OrigFont标志,它表示指定字体的预定义的或原始的字体可以使用。如果字体解释器不能产生指定字体,步骤278将清除OrigFont标志,并为fontCode调用CSP的CspSetFont()函数176。它将fontCode设置为CSP的当前有效逻辑字体,并且将与之相关的物理字体设为CSP的当前有效物理字体。
如果正在处理的文本118中的当前代码是位置代码221A,步骤268计算新当前文件位置,以确定相对于当前文件来说的下一个要产生的形状应该放置的位置。
如果正在处理的文本118中的当前代码是charCode219A,步骤270激发子步骤280和282执行。子步骤280判断OrigFont标志是否已置位,如果置位了,它将调用计算机的字体解释器以获取当前charCode的形状,并且在当前设备、或图象、坐标中输出那些文本,并且修改当前文件和图象坐标以影响与字符图象相关的退出(正常宽度)。然而,如果OrigFont没有置位,步骤282中的判断将满足,它将为字符代码和当前设备坐标调用CSP的CspDoChar()函数178。CspDoChar()在当前设备位置上产生字符的位象或轮廓描述,并且用那个字符的退出修改页发生器的当前设备位置。如果位图输出设置好了,它将通过调用页发生器的SetBitmap()回调函数193产生这个图象。调用这个CspDoChar()使用的参数有字符的位案指针,图案的大小,当前设备的坐标。SetBitmap()获取那个图象,并将它插入到图象缓冲区中。如果轮廓输出设置好了,CspDoChar()用页发生器的轮廓-输出回调函数。这些函数包括Vstem()和Hstem()函数197和198,它们接收有关当前字体的标准水平和垂直笔画宽度的暗示信息。它们也包括Moveto(),LineTo(),CurveTo()和ClosePath()函数199-202,它们接收移动、直线、曲线指令,以及从CspDoChar()那里接收画一条到轮廓上的第一个点的直线的指令,它使用这些指令在图象缓冲区中画出形状。
一旦循环264处理完了所有文本118中的代码(文本118和要产生的图象有关),它就创建出了那个图象。在这个点上,它通过调用CSP的CspClose()函数178可以退出页发生器或子程序,如步骤284中所示。这将关闭所有展示器的数据和内存结构。然而,在使用了页发生器来交互式地浏览文件的实施例中,程序将循环返回到步骤254,等待改变需要显示图象的位置、尺寸或旋转的新命令,并在从用户那里接收到改变这些参数的指令时创建新图象。
应该知道,前面的描述和图解仅做了简单的解释和说明,而且本发明并不局限于这些,只是因为对附加的权利要求的解释是非常有限的。在这个技术领域的曾有过发明的熟练者可以做修改和变形而不超出本发明范围。
如应该看到,在本发明的一些创建可移植文件的实施例中,文件创建程序具有为带有一个或多个在可移植文件中出现了的字符的字体的所有字符插入-新字体描述到可移植字体源中的功能。在CsrSetFontSpecs()调用了GetFontInfo()和GetFontId()时,它通过为在字符集合中的每一个字符调用CsrDoChar()来实现这个操作,这意味着CsrSetFontSpecs调用时使用的那种字体是新物理字体。这使得接收可移植文件的人可以用所有包括在其中的字体来编辑这个文件。
同时也应该看到,本发明可以在许多不同形式的应用中使用。
如,本发明对于打印机控制器和打印机驱动程序非常有用,它可以确保带有字体的文件可以在给定的打印机上打印出来。在打印机的控制器或直接驱动它的计算机具有页发生器和上述常规类型的字符形状展示器的情况下,打印机可以将送来的任何字体集合当成可移植文件(如图1中的104)的一部分打印出来。当所有的网络打印机具有这样的能力时,用户可以将可移植文件发送到网络上的任何打印机,并且可以确保文件将以所有所希望的字体形状打印出来。
本发明在带有我们提供的软件时非常有用。所提供的软件(包括一个页发生器和字符形状展示器)可以忠实地再现任何所创建的带有内置可移植字体源的可移植文件的字体。这使得任何这种文件可以用在任何装有这种提供的软件的计算机上,而无须关心计算机中的字体源中包括了哪些字体,没有包括哪些字体。
本发明在网络应用如电子邮件,群件,计算机公告牌,在线服务和那些被称为信息高速公路的应用中非常有用。通过使用如图3所示的系统,带有给定字体的文本和可移植字体源的媒体可以传送到网络上,并且可以在接收计算机上精确的显示出来,只要该计算机中装有页发生器和字符形状展示器,而无须关心该计算机中的字体源中包括了哪些字体。在带字体的文件被上千,或上百万不同的计算机接收和浏览,并且它们各自具有不同的字体源组合的应用中,这就显得尤为重要了。
在交互式网络应用中,可移植文件可以交互式地创建。也就是说,当每一连续的直线或屏幕被传送时,它的字符所需的新字体描述将一同传送。
本发明在电子出版如CD-Rom出版中非常有用,因为它确保了任何在电子出版文件中使用的理想字体可以在任何计算机上精确的描绘出来。而无须担心该计算机中的字体源中是否包括出版信息中所包括的每一种字体。
在网络,电子出版,和其它应用中,传给页发生器和形状展示器的实际代码可以随同可移植文件一起传送,以确保每一台接收文件的计算机可以显示这文件。
本发明在创建和编辑字体集合的应用中非常有用。例如,在一些实施例中,字符展示器将当作应用程序的一部分使用,用来将预定义字体描述转换为新字体描述,新字体描述是从预定义字体描述中的形状信息中导出来的。然后这些新字体描述可以安装到计算机的字体源中去。在这样的应用中,和字符形状展示器近似的软件将被设计并且安装为计算机的字体解释器。
本发明对于多媒体应用非常有用。它使得在多媒体中的字体文本可以用字母数字字符紧密地表示,并且在任何计算机上都可以快速而精确地重现出来。在这种应用,以及绘画和桌面出版应用中,本发明可以更改以处理颜色,三维,透明,以及其它的图形效果。
计算机领域的技术人员可以知道,许多上述的软件中执行的功能可以通过硬件来实现。同样,上述许多模块和函数的划分相当地随机,并且本发明不仅仅限制在这种划分上。举例,在本发明的一些实施例中,文件发生器和形状展示器可构建为一个软件模块,而不是现在的两个模块。另一方面,文件发生器可以不是单独的软件模块,而是某一个主应用程序的一部分,如字处理器,桌上出版,或图象程序。另一方面,字符形状记录器和展示器可以是一个被设计成可以创建、浏览、和编辑可移植文件的应用程序的大模块的一部分。
应该看到,在本发明的字符形状记录器的其它实施例中,用于从用预定义字体描述定义的形状中抽取新字体描述的规则可以是不同的。如,在位于那些被标记为描述-无关点,如角、切线、偏移、或X或Y极值点这样的点之间的字符形状数列中的轮廓线段的一些给定部分可以用多条曲线来近似,而不是用一条曲线来近似,如果只用一条曲线来近似不够理想的话。另外,举例,不同的开始点或形状方向的标准可以用于新字体描述,或者为了表示曲线轮廓线段可以使用不同的描述形式。
上述详细描述了的本发明一个实施例可以接收用PostScript,TrueType和Speedo语言书写的预定义字体描述。应该看到,在本发明的其它实施例中,文件发生器或字符形状记录器可以设计用来接收用其它字体描述语言书写的预定义字体描述,如Intellifont,或者在不久的将来可能会发展出来的新字体描述语言。
举例,Intellifont语言将圆弧描述为曲线。这可以通过用文件发生器的ExecChar()函数将每一条从Intellifbnt字体解释器中接收的圆弧轮廓线段转换成相应的Bezier曲线来实现。它通过改变字符形状记录器本身,来使CsrArcTo()函数接收这样的弧线并且将它转换为Bezier曲线来实现这个操作。在将来,如果用其它方法定义轮廓线段的其它字体描述语言开发出来了,字符形状记录器或它相应的宿主软件可以修改,以适应这种新描述性技术。
在上述的页发生器的实施例中,页发生器判断计算机的字体解释器和字体源是否可以显示给定的字体,如果可以,它使用这个字体解释器,以使这种字体可以显示。在另外的实施例中,页发生器用字符形状展示器来显示可移植文件中的所有字符。
在上述的本发明的实施例中,带字体文本被转换成一个可移植文件,这个文件中包括相应的输出文本和可移植字体源。然而,在另一些实施例中,输出文本和可移植字体源可能放置在格外的文件中,或者另外的内存位置。
如这些例子所示,本发明有许多可能的实施例,并且它的范围并不受在上面所详细描述的范围的限制,本发明的权利要求中有更详细的说明。
权利要求
1.一种计算机化的方法,其特征在于包括以下步骤接收多个字符,每个字符都有确定的预定义的字体;为每一个字符和接收的预定义字体的组合访问预定义的字体描述,这种预定义的字体描述描述了在它的相关的预定义字体中的字符的字符-字体形状;以及通过每一个被访问过的预定义字体描述所定义的字符-字体形状产生一种新字体描述,该新字体描述确定了相关的字符并且用一系列轮廓线段描述了相关的字符-字体形状。
2.根据权利要求1所述的计算机化方法其中所述的接收多个字符的步骤接收由一系列所述字符组成的输入文本,每一个所述字符都有一个确定的预定义字体;以及还包括创建输出文本的步骤,该输出文本包括相应于输入文本字符的一系列字符;为与输入文本相关的每一个字符-字体形状生成的一种新字体描述;以及用新字体描述来表示输出文本中的每个字符的字符-字体形状的指示。
3.根据权利要求2所述的计算机化方法,还包括将所述输出文本写入可擦除海量存储媒体的步骤。
4.根据权利要求2或3所述的计算机化方法,还包括使得所述输出文本对远程用户有效的步骤。
5.根据权利要求2-4中任一权利要求所述的计算机化方法,还包括显示所述输出文本的视频表示的步骤,该步骤包括确定与要包括在所述的视频表示中的输出文本相关的新字体描述;将每一个确定的新字体描述解释成相应的字符-字体形状;在所述视频表示的某一位置处显示每一个解释的字符-字体形状,所述位置和所述输出文本的字符序列中的前一个字符的位置接近。
6.根据权利要求5所述的计算机化方法其中所述的接收输入文本、访问预定义字体描述、产生新字体描述、以及创建输出文本的步骤都是在第一计算机上进行的;其中所述的显示输出文本的视频表示是在第二计算机上进行的;以及还包括将所述第一计算机生成的输出文本传送到所述第二计算机的步骤。
7.根据权利要求6所述的计算机化方法,其中所述的传送输出文本的步骤包括在一个计算机网络上传送代表输出文本的数字信号。
8.根据权利要求5-7中任一权利要求所述的计算机化方法,其中所述的显示步骤包括生成所述的视频表示的打印图象。
9.根据权利要求1-8中任一权利要求所述的计算机化方法,其中所述接收到的多个的字符中的不同字符可以有不同的预定义字体;以及所述的访问预定义字体描述和产生新字体描述的步骤为所有接收的字符自动地执行,这些字符包括所述的不同预定义字体的所述字符。
10.根据权利要求9所述的计算机化方法,其中所述不同的预定义字体可以有相关的用不同的字体描述语言定义的预定义字体描述;所述访问预定义字体描述的步骤访问由所述不同字体描述语言定义的预定义字体描述;以及所述产生新字体描述的步骤包括将预定义的字体描述从所述的不同字体描述语言解释成所述由单字体描述语言定义的新字体描述。
11.根据权利要求1-10中任一权利要求所述的计算机化方法,其中所述的预定义字体描述可以使用一种字体描述语言,而且所述新字体描述可以使用另一种描述语言。
12.根据权利要求1-11中任一权利要求所述的计算机化方法,其中,至少有一个所述被访问过的预定义字体描述采用了位案来描述字符-字体形状。
13.根据权利要求1-12中任一权利要求所述的计算机化方法,其中,至少有一个给定的所述被访问过的预定义字体描述采用一系列轮廓线段来描述字符-字体形状。
14.根据权利要求13所述的计算机化方法,其中,在与所述给定的预定义字体描述相应的新字体描述中的轮廓线段的顺序和分段与给定的预定义的预定义字体描述中的轮廓线段的顺序和分段无关,给定的预定义字符描述不是由给定的预定义字体描述所描述的实际形状的函数。
15.根据权利要求1-14中任一权利要求所述的计算机化方法,其中所述的接收多个字符的步骤还包括接收至少一个非-字符形状;所述访问预定义字体描述的步骤包括访问这样一个非-字符形状的预定义字体描述;以及所述的产生新字体描述的步骤包括为这个非-字符形状产生一个新字体描述。
16.根据权利要求1-15中任一权利要求所述的计算机化方法,其中所述的访问预定义字体描述的步骤包括访问组合在预定义字体的预定义字体描述;以及所述的产生新字体描述的步骤包括将新字体描述组合成新字体,每个这样的新字体和一个给定的预定义字体相对应并且具有和所述给定预定义字体相关联的预定义字体描述相对应的新字体相对应的新字体描述。
17.根据权利要求16所述的计算机化方法,其中所述的产生新字体描述和将新字体描述组合成新字体的步骤包括将新字体组合成新逻辑字体族,每一个字体族具有相关的物理字体,这样,通过和新逻辑字体相关的一组变换,可以从相关的新物理字体中推导出每一个新的逻辑字体中的每个字符的形状;为每一个新物理字体中的多个字符的每一个字符产生一个新的物理字体描述,该新物理字体描述用一系列由一条或多条表示那个形状的轮廓线的轮廓线段描述字符的形状;以及为每一逻辑字体产生一个新逻辑字体描述,该逻辑字体描述了与该逻辑字体相关的物理字体以及为从所述的物理字体中推导出所述逻辑字体中的一个字符的形状所进行的该组变换。
18.根据权利要求1-17中任一权利要求所述的计算机化方法还包括为每一个访问过的预定义字体描述定义的字符-字体形状创建几何模型的建模步骤,这个模型代表所述字符-字体形状的一个或多个轮廓;以及所述的产生新字体描述的步骤包括从为每一个访问过的预定义字体描述创建的模型中产生一个新字体描述,该新字体描述用一系列轮廓线段描述用所述模型表示的形状。
19.根据权利要求18所述的计算机化方法,其中所述建模步骤在字符-字体形状中明确地指定了在形状的相关预定义字体描述中没有被明确指定的一些特性;以及为这样的字符-字体形状模型创建的新字体描述的轮廓线段的顺序由所述明确指定的特性部分确定。
20.根据权利要求18-19中任一权利要求所述的计算机化方法,其中所述的建模步骤包括在这个字符-字体形状轮廓上指定描述-无关点的步骤,这些点是每一个这样的轮廓的形状的函数点,它们与用相关的预定义字体描述定义的字符-字体形状无关;以及其中所述的产生新字体描述的步骤使用了由所述建模步骤标识的描述-无关点,以确定所述新字体描述中轮廓线段的终点。
21.根据权利要求20所述的计算机化方法其中,标识描述-无关点的步骤包括在给定字符-字体形状上标识多个描述-无关点;所述的建模步骤还包括用一个在所述两个相邻点附近的近似线段来近似在所述给定轮廓上的两个相邻的描述-无关点之间的给定轮廓的形状;以及其中,产生新字体描述的步骤包括产生新字体描述,新字体描述中的一系列轮廓线段里包括所述的近似轮廓线段。
22.根据权利要求21所述的计算机化方法,其中所述的标识描述-无关点的步骤包括在每个字符-字体形状轮廓上标识足够的这种点,以使得每个这样的轮廓可以用一系列的一个或多个所述近似线段贴切地近似,每个线段都位于一对相邻点之间;所述的近似步骤在每个所述的字符-字体形状轮廓上的每一对描述-无关点之间创建一个所述的近似线段;以及所述产生新字体描述的步骤产生新字体描述,该新字体描述用一系列轮廓线段描述一个给定字符-字体形状,这些轮廓段全都是由所述的近似的轮廓线段组成。
23.根据权利要求20-22中所述的任何一条计算机化方法,其中所述建模步骤包括在所述字符-字体形状轮廓中标识那些表示在水平和垂直方向上表示极值点的点(如同确定描述-无关点);以及所述产生新字体描述的步骤包括产生新字体描述,该新字体描述具有这样的轮廓线段,这些线段的终点对应于所述字符-字体形状模型上标识为轮廓中的极值点的那些点。
24.根据权利要求20-23中任一权利要求所述的计算机化方法,其中所述建模步骤包括在所述字符-字体形状轮廓上标识那些表示这轮廓上的拐点的点(如同确定描述-无关点);以及所述产生新字体描述的步骤包括产生新字体描述,该新字体描述具有这样的轮廓线段,这些线段的终点对应于所述字符-字体形状模型上标识为轮廓中的拐点的那些点。
25.根据权利要求20-24中任一权利要求所述的计算机化方法,包括所述预定义的字体描述用一系列轮廓线段描述字符-字体形状,每一条轮廓线段具有一个起始端点和一个终止端点,线段的终止端点就是下一个线段的起始端点;以及所述的标识描述-无关点的步骤包括标识由预定义字体描述定义的轮廓线段的终点中哪一个代表由所述预定义字体描述定义的形状的轮廓的角点,所述确定角点的步骤包括为每一个被测的终点和它的轮廓上的两个相邻的终点进行测试以判断在可能的量化错误允许下对三个点的位置进行适当地调整时,是否可以通过这三个终点画一条直线;以及如果上述判断确定了这样的直线不能画出来,则将该被测终点标识为描述-无关点。
26.根据权利要求25所述的计算机化方法,其中所述判断三个点是否可以画一条直线的步骤包括在靠近所测试终点的那一条轮廓线段是Bezier曲线时操作,为了所述判断的目的将那条曲线上的最近控制点视为那条弯曲线段的邻近终点的步骤。
27.根据权利要求25-26中任一权利要求所述的计算机化方法,其中所述判断通过三个点是否可以画一条直线的步骤包括判断是否由被测终点和它的两个临近终点形成的凹角可以改变为等于或大于180度的角,如果在相应的最大量化误差情况下这三个点的每个点的位置在使该角度最大化的方向上移动的话。
28.根据权利要求20-27中任一权利要求所述的计算机化方法,其中所述的建模步骤包括依据所有这些模型使用的标准规则集合,将每一个字符-字体形状模型的轮廓排序,这些规则与所述预定义字体描述的任何非-形状-相关特性无关;以及所述产生新字体描述的步骤包括依据所述建模步骤中相应轮廓的顺序将每一新字体描述的轮廓线段顺序进行排序。
29.根据权利要求20-28中任一权利要求所述的的计算机化方法,其中所述标识描述-无关点的步骤包括依据所有这些轮廓使用的标准规则集合将所述点之一标识为每一个字符-字体形状模型的每个轮廓的一个起始点,这些规则是每个轮廓形状的函数,而与所述预定义字体描述的任何非-形状-相关特性无关;所述建模步骤还包括分配一个方向,在该方向,可以读到每一个字符-形状模型的每个轮廓的描述-无关点,它从为这条曲线标识的起始点处开始,所述方向依据标准规则集合分配,这些规则与所述预定义字体描述的任何非-形状-相关特性无关;以及所述产生新字体描述的方法,在为所述轮廓标识的起始点处开始的所述建模步骤为所述轮廓分配的所述方向中,为每个描述给定的字符-形状的轮廓产生一系列轮廓线段。
30.根据权利要求20-29中任一权利要求所述的计算机化方法,包括;由单个访问过的预定义字体描述所描述的字符-字体形状由一个或多个单独的形状,或雕刻组成,每一个形状或雕刻有一个外轮廓以及零个或多个内轮廓;所述建模步骤包括下列步骤确定哪一个由一个给定的预定义字体描述定义的轮廓和该相同的雕刻有关,以及和该相同的雕刻有关轮廓是外轮廓还是内轮廓;依据外轮廓和内轮廓的不同标准规则,分别地标记每一模型化的外轮廓和内轮廓上的起始点,这些规则用于所有的所述雕刻,并且和任何预定义字体描述无关,该预定义字体描述不是在字符-字体形状的预定义字体描述中所固有的;以及为每一个访问过的预定义字体描述产生的新字体描述用一系列轮廓线段描述每一预定义字体描述模型化的轮廓的形状,所述一系列轮廓线段是从被所述建模步骤为相应的模型轮廓标记为起始点的相应点处开始的。
31.根据权利要求20-30中任一权利要求所述的计算机化方法,其中所述建模步骤包括比较为不同访问过的预定义字体描述创建的字符-字体形状的轮廓,以确定哪一些来自不同模型的轮廓共有相似的形状;以及保存由比较步骤确定为共有相似形状的轮廓的指示;以及所述产生新字体描述的步骤包括以下步骤为这种共有的形状产生通用字体描述,它用一系列的轮廓线段定义每一个这种共有的形状;以及为字符-字体形状创建新字体描述,这种字符-字体形状包括共有的形状,以描述一系列的轮廓线段,这些轮廓线段参照用于共有形状的通用字体描述定义该共有形状。
32.根据权利要求31所述的计算机化方法,其中所述的比较轮廓的步骤可以比较用与不同的预定义字体相关的预定义字体描述所定义的字符-字体形状模型的轮廓;以及所述的为共有形状产生通用描述的步骤可以为这样一类形状产生所述的通用描述,这类形状在由与所述的不同预定义字体相关的预定义字体描述定义的字符-字体形状的模型之间共有。
33.根据权利要求31-32中任一权利要求所述的计算机化方法,其中所述的比较轮廓的步骤可以比较用不同字体描述语言书写的预定义字体描述所定义的字符-字体形状的轮廓;以及所述的为共有形状产生通用描述的步骤可以为这样一类形状产生所述通用描述,这类形状在由所述的不同字体描述语言书写的预定义字体描述所定义的字符-字体形状的模型之间共有。
34.根据权利要求31-33中任一权利要求所述的计算机化方法,其中所述所述的比较轮廓的步骤所进行的这种比较与这些轮廓的大小和位置无关,所以在不同字符-字体模型中的具有相似形状但不同尺寸或位置的轮廓被视为具有相似的形状。
35.根据权利要求31-34中任一权利要求所述的计算机化方法,其中所述建模步骤还包括为一个或多个所述每个字符-字体形状模型的轮廓的组合创建标记符,该标记符与相应的预定义字体描述的非-形状-相关特性无关,并且这种标记符包括一连串有标准顺序的数据文字,每一个数据文字都表示所述组合的轮廓形状的抽象;以及所述的比较轮廓的步骤包括比较和轮廓的不同组合相关的标记符,并且如果这种组合的标记符匹配,则将只比较轮廓不同组合的实际形状。
36.根据权利要求35所述的计算机化方法,所述比较标记符的步骤包括依据它们的标记符将所述轮廓的组合分类;以及使用所述分类来减少所述标记符的数目,这些标记符与给定的所述标记符之一比较以确定所给定的标记符是否和分类后的标记符匹配。
37.根据权利要求31-36中任一权利要求所述的计算机化方法,其中所述的建模步骤将一个字符-字体形状模型的至少一个轮廓组合成雕刻,该轮廓表示每一个模型的一个或多个不附加的实形状的边界;所述比较轮廓的步骤比较与不同雕刻相关的轮廓组合,以致当组合成一个雕刻的全部轮廓和组合成另一个雕刻的相应轮廓全部匹配时,才发现匹配;所述的存储表示哪些轮廓共有相似形状的指示的步骤存储确定哪些雕刻是相似雕刻,这些雕刻的字符-形状模型被确定为共有类似的轮廓形状组合;所述的产生通用字体描述的步骤为相似雕刻产生这种通用描述,这些相似雕刻共有同样的轮廓形状组合;以及所述的参照通用字体描述产生用于定义共有形状的新字体描述的步骤为字符-字体形状模型创建新字体描述,该模型包括一种相似雕刻以描述轮廓线段的顺序,这些轮廓线段参照这个相似雕刻的通用字体描述定义相似雕刻。
38.根据权利要求37所述的计算机化方法,其中所述的建模步骤包括依据同一的规则将每一个雕刻的一个或多个轮廓进行排序,这样,比较这种雕刻的轮廓形状的步骤的速度可以大大提高。
39.根据权利要求18-38中任一权利要求所述的计算机化方法,其中所述建模步骤包括以下步骤用一系列的一个或多个轮廓线段建立每一个字符-字体形状的每一个轮廓的模型,这种线段可以是曲线,也可以是直线;为每一个所述的曲线轮廓线段计算深度因子,这个深度因子表示将该曲线轮廓线段细分为子曲线的递归细分的必要深度,这些子曲线同所述子曲线的两个终点之间的矢量有小于最大距离的偏移,所述深度计算步骤包括以下步骤通过在所述的每个曲线轮廓线段上执行递归细分来计算所述的深度因子,在每一个细分的给定递归中要执行下面的步骤通过执行给定的递归将曲线细分成多个子曲线;判断给定递归产生的每一子曲线和所述子曲线两个终点间的矢量之间的最大偏移是否小于特定数值;当所有这些由给定递归生成的子曲线的最大偏移小于所述的特定数值,停止当前分支上的递归处理;当有一些由给定递归生成的子曲线的最大偏移大于所述的特定数值时,在由给定递归生成的、和位于其两个终点间的矢量具有最大偏移的子曲线上将选择性地执行更深的递归;保存给定递归的递归深度数值;在为那个轮廓线段执行所有递归细分的过程中,为每一个所述曲线轮廓线段,将所得深度因子基于由保存数值的步骤生成的最大递归深度值;以及其中所述的产生新字体描述的步骤产生新字体描述,其中,对应于给定字符一字体形状模型中的曲线轮廓线段的轮廓线段被由所述建模步骤计算所得的相应的深度因子所标记。
40.执行权利要求1-39中任一权利要求所述的计算机化方法的设备。
41.根据权利要求3所述的方法创建的可擦除的大型存储媒体。
全文摘要
一种用于接收字符(219)的计算化系统,每一个字符都有相关的字体(217)。对于接收到的每个字符-字体组合,系统访问那个组合的形状(453)的预定义字体描述(122中),并且产生对那个形状的新字体描述(126中)。其优选之处尤其在于当字符具有不同的字体时,系统为所有字符自动地产生新字体描述。优选地,接收到的字符是输入文本(116)的一部分,并且系统产生一输出文本(104),该输出文本不仅包括相应的字符(219A),同时也包括定义那些字符的形状所必要的新字体描述。优选地,输出文本可以通过记录媒体(130)或计算机网络(132)传送到其它计算机。优选地,新字体描述与预定义字体描述的定义的字符-字体形状的方式无关。优选地,该系统可以在创建它的计算机(102A,102B)上或在另一台计算机(108A,108B)上显示输出文本的图象(110中)。
文档编号G06T11/20GK1154169SQ95193840
公开日1997年7月9日 申请日期1995年5月24日 优先权日1995年5月24日
发明者约翰·S·寇林思, 马克·H·高德瓦特 申请人:碧特斯特雷姆有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1