文本排版方法及排版引擎的制作方法

文档序号:6358176阅读:370来源:国知局
专利名称:文本排版方法及排版引擎的制作方法
技术领域
本发明实施例涉及计算机技术,尤其涉及一种文本排版方法及排版弓I擎。
背景技术
EPub是一种开放式的电子书格式标准,能支持多种装置应用,可以“自动重新编 排”的内容。Epub电子书的关键技术之一是排版技术,其排版的速度直接关系到使用者的 体验,特别是对于章节很长的Epub电子书,如果排版时间很长会造成用户承受不了长时间 的等待,从而决定放弃阅读。因此,实现一种高性能的排版系统对于提升Epub电子书的阅 读体验是至关重要的。由于目前Epub电子书中的内容95%以上是文本,提高文本排版算法 的性能就成为提高整个Epub电子书展现性能的关键技术。绝大多数软件的文字排版引擎对一段文本T进行排版时,先将文本T输出给操 作系统提供的文本宽度计算函数,根据操作系统提供的文本宽度计算函数计算出的文 本宽度,对文本T进行断行。例如Windows平台提供了用于文本宽度计算的API函数 GetTextExtentPoint, Android 平台提供了函数 Paint. measureText,在其它带有 GUI 库的 操作系统,都有对应的文本宽度计算函数。各操作系统提供的文本宽度计算函数功能强大, 可适应各种字体,目前大多数Epub书阅读软件在排版时都会频繁调用操作系统提供的文 本宽度计算函数。然而,采用操作系统提供的文本宽度计算函数需依赖于构建在驱动一级的GUI 库,而Epub电子书阅读软件是构建在用户层的,每调用一次GUI库提供的文本尺寸计算函 数相当于一次系统调用。而调用文本尺寸计算函数在整个Epub电子书的文字排版过程是 非常频繁的,这些频繁的系统调用严重影响了排版性能。

发明内容
本发明实施例提供一种文本排版方法及排版引擎,用以解决文本排版过程中需频 繁调用系统提供的文本宽度计算函数的缺陷,有效提高了电子书阅读过程中的排版性能。本发明实施例提供一种文本排版方法,包括获取解析后的文本后,排版引擎从所述文本中逐个读取字符;在所述字符为方块字符时,根据所述字符所属的语种和字号在方块字符宽度表中 查找所述字符的字符宽度;在所述字符为非方块字符时,根据所述字符的字体,在非方块字 符宽度表中查找所述字符的字符宽度;所述排版引擎根据文本显示区的宽度、所述文本中非方块字符的字符宽度和所述 文本中方块字符的字符宽度,对所述文本进行断行;调用操作系统提供的文本输出函数在所述文本显示区输出断行后的所述文本。本发明实施例提供一种排版引擎,包括读取模块,用于获取解析后的文本后,排版引擎从所述文本中逐个读取字符;宽度确定模块,用于在所述字符为方块字符时,根据所述字符所属的语种和字号在方块字符宽度表中查找所述字符的字符宽度;在所述字符为非方块字符时,根据所述字 符的字体,在非方块字符宽度表中查找所述字符的字符宽度;断行模块,用于所述排版引擎根据文本显示区的宽度、所述文本中非方块字符的 字符宽度和所述文本中方块字符的字符宽度,对所述文本进行断行;输出调用模块,用于调用操作系统提供的文本输出函数在所述文本显示区输出断 行后的所述文本。本发明实施例的文本排版方法及排版引擎,排版引擎逐个从文本中读取字符,并 通过查找方块字符宽度表或非方块字符宽度表获取当前读取字符的字符宽度。同一语种的 所有方块字符在同一字号的字符宽度均相同,因此,对于方块字符,排版引擎根据语种和字 号在方块字符表中查找方块字符的字符宽度。对于非方块字符,排版引擎根据非方块字符 的字体在非方块字符宽度表中,查找非方块字符的字符宽度。由于本发明实施例排版引擎 查找方块字符宽度表或非方块字符宽度表获取当前读取字符的字符宽度,因此排版引擎在 用户层完成了字符宽度的计算,不需要调用系统提供的文本宽度计算函数,节省了系统开 销,提高了排版性能。


为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现 有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发 明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以 根据这些附图获得其他的附图。图1为本发明提供的文本排版方法实施例一流程图;图2A为本发明提供的文本排版方法中一种获取方块字符的字符宽度方法流程 图;图2B为本发明提供的文本排版方法中一种获取非方块字符的字符宽度方法流程 图;图3为本发明提供的文本排版方法实施例三流程图;图4为本发明提供的文本排版方法实施例四流程图;图5为本发明提供的电子书排版引擎实施例一结构示意图;图6为图5中宽度确定模块结构示意图;图7为图6中方块字符宽度查找单元的结构示意图;图8为图6中方块字符宽度查找单元的结构示意图;图9为图5或图6中断行模块的结构示意图;图10为本发明提供的文本排版引擎实施例二结构示意图。
具体实施例方式为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例 中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是 本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员 在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
图1为本发明提供的文本排版方法实施例一流程图。如图1所示,本实施例包括步骤11 获取解析后的电子书文件中文本后,排版引擎从文本中逐个读取字符。电子书阅读软件中的排版引擎进行排版前,电子书文件需依次经过解压、格式解 析和描述语种解析。例如,Epuh电子书文件的压缩包依次经解压、Epuh格式解析和HTML解 析。电子书阅读软件中的排版引擎开始对HTML解析后的文本进行排版时,先对HTML解析 后的文本进行字体、字号和字形设置。步骤12 在字符为方块字符时,排版引擎根据字符所属的语种和字号在方块字符 宽度表中查找当前读取字符的字符宽度;在字符为非方块字符时,排版引擎根据字符的字 体,在非方块字符宽度表中查找当前读取字符的字符宽度。对于中文字符、日文字符和韩文字符等方块字符,属于同一语种的所有方块字符 的字符宽度,在同一字号的所有字体下是等宽的。同一语种下,不同字号的方块字符的字符 宽度成等比例关系。同一字号下,不同语种的方块字符的字符宽度不相同。即方块字符的 字符宽度与所属的语种和字号有关,与字符和字体无关。对于各种字体的所有中文字符,在 同一字号下的字符宽度均相同。例如宋体、楷体、隶书、方正姚体等中文字符的字符宽度均 相同。而同一字号下,中文字符与日文字符或韩文字符的字符宽度不相同。因此,针对方块 字符,可建立包括“方块字符、所属语种、字形,与字号为基准字号的非方块字符的字符宽度 的对应关系”的方块字符宽度表。在确定一个方块字会的字符宽度时,根据所属的语种和字 号,在方块字符宽度表中查找该方块字符的字符宽度。对于各种标点符号、拉丁字母、数学运算符号等除方块字符以外的非方块字符,在 同一字体下,同一种语种的不同非方块字符,它们的字符宽度不相同。例如,字符i和字符 w,在同一种字体下,字符w的字符宽度大于字符i的字符宽度。对于同一个非方块字符,在 字号不相同或字体不相同的情况下,字符宽度也不相同。但在同一字体下,对于不同字号的 同一非方块字符,字符宽度成等比例关系。例如,不同字体或不同字号的字符i,其字符宽度 互不相同。但对于同一字体,字号为10号的字符i的字符宽度,与其它字号的字符i的字 符宽度成等比例关系。因此,对于非方块字符的字符宽度,不仅与所属的语种和字号有关, 而且与字体和字符相关。因此,针对非方块字符可建立包括“非方块字符、非方块字符的字 体,与字号为基准字号的非方块字符的字符宽度的对应关系”的非方块字符宽度表。在确定 一个非方块字符的字符宽度时,根据字符的字体,在非方块字符宽度表中查找字符的字符 宽度。步骤13 排版引擎根据文本显示区的宽度、文本中非方块字符的字符宽度和文本 中方块字符的字符宽度,对文本进行断行。具体的排版引擎将当前读取字符的字符宽度逐个累加至宽度统计值;宽度统计 值的初始值为零。当宽度统计值小于文本显示区的宽度时,排版引擎继续读取从文本中读 取下一个字符,确定下一个字符的字符宽度并累计至宽度统计值中,直至宽度统计值小于 文本显示区的宽度大于或等于文本显示区的宽度。宽度统计值小于文本显示区的宽度时, 表明在文本显示区的当前行还有多余的空间容纳字符,因此排版引擎确定读取从文本中下 一个字符,重复读取过程,直至宽度统计值大于或等于文本显示区的宽度。当宽度统计值等于文本显示区的宽度时,排版引擎在字符之后将文本断7行;宽 度统计值大于文本显示区的宽度时,排版引擎在字符之前将文本断行。
宽度统计值等于文本显示区的宽度时,表明若在文本显示区的一行增加中“从读 取第一个字符(或从上一次断行)开始到当前读取的字符为止”排版引擎所读取的所有字 符后,恰好到达文本显示区的页边界,因此,排版引擎在当前读取字符之后(即当前读取字 符的下一字符之前)将文本断行。宽度统计值大于文本显示区的宽度时,表明若在文本显示区的一行增加中“从读 取第一个字符(或从上一次断行)开始到当前读取的字符为止”排版引擎所读取的所有字 符后,会超出文本显示区的页边界。因此,排版引擎在当前读取字符之前(即当前读取字符 的上一字符之后)将文本断行。在进行文本断行后,排版引擎将宽度统计值清零,继续从剩余文本中逐个读取字 符,将字符的字符宽度累加至宽度统计值,并根据宽度统计值和文本显示区的宽度对剩余 文本进行断行,直至读取到的字符为空。步骤14 排版引擎调用操作系统提供的文本输出函数在文本显示区输出断行后 的文本。将整个文本断行后,调用操作系统提供的文本输出函数在文本显示区输出断行后 的文本。电子阅读软件在第一次打开文本时,调用排版引擎利用上述方法对解析后的文本 进行排版,可将排版后的文本存储以便在下一次打开文本时,直接显示排版后的文本;也可 以不存储排版后的文本,每次打开时调用排版引擎通过上述方法重新对文本进行排版。进 一步,在电子设备上显示排版后的文本时,如果用户在使用过程中变化设备显示屏的使用 方向(例如将设备显示屏由横向显示变化为竖向显示)会导致显示区的宽度发生变化,可 在第一次变化设备显示屏的显示方向时,调用排版引擎利用上述方法对解析后的文本进行 重新排版并将排版后的文本存储,以便在下一次显示屏显示方向发生同样变化时,直接显 示排版后的文本。本发明实施例,排版引擎逐个从文本中读取字符,并通过查找方块字符宽度表或 非方块字符宽度表获取当前读取字符的字符宽度。同一语种的所有方块字符在同一字号的 字符宽度均相同,因此,对于方块字符,排版引擎根据语种和字号在方块字符表中查找方块 字符的字符宽度。对于非方块字符,排版引擎根据非方块字符的字体在非方块字符宽度表 中,查找非方块字符的字符宽度。由于本发明实施例排版引擎查找方块字符宽度表或非方 块字符宽度表获取当前读取字符的字符宽度,因此排版引擎在用户层完成了字符宽度的计 算,不需要调用系统提供的文本宽度计算函数,节省了系统开销,提高了排版性能。通常情况下,字形包括常规字形、加粗字形、倾斜字形和加粗倾斜字形。其中,加粗 字形、倾斜字形和加粗倾斜字形,称为变形字体。一个方块字符在字体和字号相同的情况 下,字形不相同时字符宽度不相同。即方块字符的各种字形的字符宽度互不相同。一个非 方块字符在字体和字号相同的情况下,字形不相同时字符宽度也不相同。图2A为本发明提供的文本排版方法中一种获取方块字符的字符宽度方法流程 图。针对方块字符本发明实施例建立了方块字符宽度表,考虑到变形字体时,方块字符宽度 表中包括方块字符、所属语种、字形,与字号为基准字号的非方块字符的字符宽度的对应关 系。如表1所示,例如,中文字符在基准字号下的正常字形的字符宽度对应一表项,其它三 种变形体也各对应一表项。日文字符在在基准字号下的正常字形的字符宽度对应一表项,其它三种变形体各对应一表项。表1为一种方块字符宽度表
权利要求
1.一种文本排版方法,其特征在于,包括获取解析后的文本后,排版引擎从所述文本中逐个读取字符; 在所述字符为方块字符时,根据所述字符所属的语种和字号在方块字符宽度表中查找 所述字符的字符宽度;在所述字符为非方块字符时,根据所述字符的字体,在非方块字符宽 度表中查找所述字符的字符宽度;所述排版引擎根据文本显示区的宽度、所述文本中非方块字符的字符宽度和所述文本 中方块字符的字符宽度,对所述文本进行断行;调用操作系统提供的文本输出函数在所述文本显示区输出断行后的所述文本。
2.根据权利要求1所述文本排版方法,其特征在于,所述排版引擎根据文本显示区的 宽度、所述文本中非方块字符的字符宽度和所述文本中方块字符的字符宽度,对所述文本 进行断行,包括排版引擎将所述字符的字符宽度逐个累加至宽度统计值;所述宽度统计值的初始值为零;所述宽度统计值小于文本所述显示区的宽度时,继续从文本中读取下一个字符,确定 所述下一个字符的字符宽度并累计至所述宽度统计值中,直至所述宽度统计值大于或等于 所述文本显示区的宽度;所述宽度统计值等于所述文本显示区的宽度时,在所述字符之后将文本断行;所述宽 度统计值大于所述文本显示区的宽度时,在所述字符之前将文本断行;在文本断行后,将所述宽度统计值清零,继续从剩余文本中逐个读取字符,将所述字符 的字符宽度逐个累加至宽度统计值,并根据所述宽度统计值和所述文本显示区的宽度对剩 余文本进行断行,直至读取到的字符为空。
3.根据权利要求1或2所述文本排版方法,其特征在于,在所述字符为方块字符时,根 据所述字符所属的语种和字号在方块字符宽度表中查找所述字符的字符宽度,包括根据所述字符所属的语种和字形,在方块字符宽度表中查找字号为基准字号的所述字 符所对应的字符宽度;所述方块字符宽度表中包括方块字符、所述方块字符所属语种和所 述方块字符字形,与所述方块字符的字号为基准字号时的字符宽度的对应关系;在所述字符的字号与所述基准字号相同时,将查找到的字符宽度确定为所述字符的字 符宽度;在所述字符的字号与所述基准字号不相同时,根据所述基准字号和所述文本中方块字 符的字号,将查找到的字符宽度进行等比例缩放,得到所述字符对应的字符宽度。
4.根据权利要求1或2所述文本排版方法,其特征在于,在所述字符为非方块字符时, 根据所述字符的字体,在非方块字符宽度表中查找所述字符的字符宽度,包括根据所述字符的字体,在非方块字符宽度表中查找字号为基准字号的所述字符所对应 的字符宽度;所述非方块字符宽度表中包括所述非方块字符和所述非方块字符的字体,与 所述非方块字符的字号为基准字号时的字符宽度的对应关系;在所述字符的字号与所述基准字号相同时,将查找到的字符宽度确定为所述字符的字 符宽度;在所述字符的字号与所述基准字号不相同时,根据所述基准字号和所述字符的字号, 将查找到的字符宽度进行等比例缩放,得到所述字符对应的字符宽度。
5.根据权利要求1或2所述文本排版方法,其特征在于,在所述字符为非方块字符时, 根据所述字符的字体,在非方块字符宽度表中查找所述字符的字符宽度,包括根据所述字符的字体和字形,在所述非方块字符宽度表中查找所述字符的基准字号 所对应的字符宽度;所述非方块字符宽度表中包括所述非方块字符、所述非方块字符的字 形和所述非方块字符的字体,与所述非方块字符的字号为基准字号时的字符宽度的对应关 系;所述字形包括常规字形、粗体和变形体;在所述字符的字号与所述基准字号相同时,将查找到的字符宽度确定为所述字符的字 符宽度;在所述字符的字号与所述基准字号不相同时,根据所述基准字号和所述字符的字号, 将查找到的字符宽度进行等比例缩放,得到所述字符对应的字符宽度。
6.根据权利要求4所述文本排版方法,其特征在于,在所述获取解析后的文本之前,还 包括从操作系统提供的字体库中获取不同字体且字号为基准字号的非方块字符; 调用系统提供的文本宽度计算函数计算所述非方块字符的基准字号所对应的字符宽度;将所述非方块字符、所述非方块字符的字体与字号为所述基准字号的非方块字符对应 字符宽度的对应关系存入所述非方块字符宽度表中。
7.一种排版引擎,其特征在于,包括读取模块,用于获取解析后的文本后,排版引擎从所述文本中逐个读取字符; 宽度确定模块,用于在所述字符为方块字符时,根据所述字符所属的语种和字号在方 块字符宽度表中查找所述字符的字符宽度;在所述字符为非方块字符时,根据所述字符的 字体,在非方块字符宽度表中查找所述字符的字符宽度;断行模块,用于所述排版引擎根据文本显示区的宽度、所述文本中非方块字符的字符 宽度和所述文本中方块字符的字符宽度,对所述文本进行断行;输出调用模块,用于调用操作系统提供的文本输出函数在所述文本显示区输出断行后 的所述文本。
8.根据权利要求7所述排版引擎,其特征在于,所述断行模块包括累加单元,用于将所述字符的字符宽度累加至宽度统计值;所述宽度统计值的初始值 为零;判断单元,用于所述宽度统计值小于文本所述显示区的宽度时,继续从文本中读取下 一个字符,确定所述下一个字符的字符宽度并累计至所述宽度统计值中,直至所述宽度统 计值大于或等于所述文本显示区的宽度;断行单元,用于所述宽度统计值等于所述文本显示区的宽度时,在所述字符之后将文 本断行;所述宽度统计值大于所述文本显示区的宽度时,在所述字符之前将文本断行;将 所述宽度统计值清零,继续从剩余文本中逐个读取一字符,将所述字符的字符宽度累加至 宽度统计值,并根据所述宽度统计值和所述文本显示区的宽度对剩余文本进行断行,直至 读取到的字符为空。
9.根据权利要求7或8所述排版引擎,其特征在于,所述宽度确定模块包括 类型判断单元,用于判断所述字符是否方块字符;方块字符宽度查找单元,用于在所述字符为方块字符时,根据所述字符所属的语种和 字号在方块字符宽度表中查找所述字符的字符宽度;非方块字符宽度查找单元,用于在所述字符为非方块字符时,根据所述字符的字体,在 非方块字符宽度表中查找所述字符的字符宽度。
10.根据权利要求9所述排版引擎,其特征在于,所述方块字符宽度查找单元包括第一查找子单元,用于根据所述字符所属的语种和字形,在方块字符宽度表中查找字 号为基准字号的所述字符所对应的字符宽度;所述方块字符宽度表中包括方块字符、所述 方块字符所属语种和所述方块字符字形,与所述方块字符的字号为基准字号时的字符宽度 的对应关系;第一确定子单元,用于在所述字符的字号与所述基准字号相同时,将查找到的字符宽 度确定为所述字符的字符宽度;第二确定子单元,用于在所述字符的字号与所述基准字号不相同时,根据所述基准字 号和所述文本中方块字符的字号,将查找到的字符宽度进行等比例缩放,得到所述字符对 应的字符宽度。
11.根据权利要求9所述排版引擎,其特征在于,所述非方块字符宽度查找单元包括第二查找子单元,用于根据所述字符的字体,在非方块字符宽度表中查找字号为基准字号的所述字符所对应的字符宽度;所述非方块字符宽度表中包括所述非方块字符和所述 非方块字符的字体,与所述非方块字符的字号为基准字号时的字符宽度的对应关系;第三确定子单元,用于在所述字符的字号与所述基准字号相同时,将查找到的字符宽 度确定为所述字符的字符宽度;第四确定子单元,用于在所述字符的字号与所述基准字号不相同时,根据所述基准字 号和所述字符的字号,将查找到的字符宽度进行等比例缩放,得到所述字符对应的字符宽 度。
12.根据权利要求11所述排版引擎,其特征在于,所述第二查找子单元还用于根据所 述字符的字体和字形,在所述非方块字符宽度表中查找所述字符的基准字号所对应的字符 宽度;所述非方块字符宽度表中包括所述非方块字符、所述非方块字符的字形和所述非方 块字符的字体,与所述非方块字符的字号为基准字号时的字符宽度的对应关系;所述字形 包括常规字形、粗体和变形体。
13.根据权利要求12所述排版引擎,其特征在于,还包括字符获取模块,用于从操作系统提供的字体库中获取不同字体且字号为基准字号的非 方块字符;调用模块,用于调用系统提供的文本宽度计算函数计算所述非方块字符的基准字号所 对应的字符宽度;非方块字符宽度表建立模块,用于将所述非方块字符、所述非方块字符的字体与字号 为所述基准字号的非方块字符对应字符宽度的对应关系存入所述非方块字符宽度表中。
全文摘要
本发明提供一种文本排版方法及排版引擎。该方法包括获取解析后的文本后,排版引擎从所述文本中逐个读取字符;在所述字符为方块字符时,根据所述字符所属的语种和字号在方块字符宽度表中查找所述字符的字符宽度;在所述字符为非方块字符时,根据所述字符的字体,在非方块字符宽度表中查找所述字符的字符宽度;所述排版引擎根据文本显示区的宽度、所述文本中非方块字符的字符宽度和所述文本中方块字符的字符宽度,对所述文本进行断行;调用操作系统提供的文本输出函数在所述文本显示区输出断行后的所述文本。本发明不需要调用系统提供的文本宽度计算函数计算待文本中字符的字符宽度。
文档编号G06F17/21GK102147790SQ20111009614
公开日2011年8月10日 申请日期2011年4月15日 优先权日2011年4月15日
发明者周爱芳, 孙诗, 尧俊利, 张小兵, 戎亚新, 李晓慧, 王志, 王超 申请人:华为软件技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1