文本排版方法及排版引擎 【技术领域】
本发明实施例涉及计算机技术, 尤其涉及一种文本排版方法及排版引擎。背景技术 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 为一种方块字符宽度表
语种 中文 中文 中文 中文 日文 日文 日文 日文 韩文 韩文 韩文 韩文
字形 常规 加粗 倾斜 加粗倾斜 常规 加粗 倾斜 加粗倾斜 常规 加粗 倾斜 加粗倾斜 字符宽度 A1 A2 A3 A4 B1 B2 B3 B4 C1 C2 C3 C4另外, 还可针对方块字符的每个字号, 为方块字符建立方块字符宽度表, 其中包括 方块字符、 所属语种、 字形, 字号, 与字符宽度的对应关系。
本实施例主要说明考虑到变形字体时, 以表 1 所示的表结构为基础, 获取方块字 符的字符宽度的方法。如图 2A 所示, 本实施例包括 :
步骤 21A : 根据方块字符所属的语种和字形, 在方块字符宽度表中查找文本中方 块字符的字号为基准字号时的字符宽度。
根据字符编码方式和字符码值可确定一个是字符是方块字符还是非方块字符。 例 如, 采用 Unicode 编码值, Unicode 码表中 ox4E00 ~ ox9FFFF, 为中文方块字符、 日文方块字 符和韩文方块字符的编码区域。ox4E00 ~ ox9FA0 为中文方块字符的编码区域, ox0020 ~ ox007F 为基本拉丁字符的编码区域。 根据字符码值确定当前待计算字符宽度的字符为方块 字符和该方块字符所属的语种时, 根据该方块字符所属的语种和字形, 在方块字符宽度表 中查找字号为基准字号的该方块字符所对应的字符宽度。
步骤 22A : 判断方块字符的字号与方块字符宽度表的基准字号是否相同。如果相 同, 执行步骤 23A, 否则执行步骤 24A。步骤 23A : 在方块字符的字号与方块字符宽度表的基准字号相同时, 将查找到的 字符宽度确定为文本中方块字符的字符宽度。
步骤 24A : 在方块字符的字号与基准字号不相同时, 根据基准字号和文本中方块 字符的字号, 将查找到的字符宽度进行等比例缩放, 得到文本中方块字符对应的字符宽度。
本实施例针对方块字符, 建立了包括 “方块字符、 所属语种、 字形, 与字号为基准字 号的非方块字符的字符宽度的对应关系” 的方块字符宽度表, 减少了方块字符宽度表占用 的空间, 提高了查找方块字符宽度的效率。
图 2B 为本发明提供的文本排版方法中一种获取非方块字符的字符宽度方法流程 图。
本发明实施例针对字符宽度互不相同的非方块字符创建了非方块字符宽度表。 对 于非方块字符宽度表有多种构建方法。一种建表方法是, 可为所有字体建立一个非方块字 符宽度表。 在该非方块字符宽度表中, 保存所有非方块字符为所有字体时的字符宽度。 针对 一种字体的非方块字符, 在该表中可只保存非方块字符的字号为基准字号时的字符宽度, 对于同一字体下的同一非方块字符, 其它字号的字符宽度可以通过等比例缩放基准字号的 字符宽度得到。例如, 一个非方块字符在 10 号字的宽度为 w, 则在相同字体 15 号字的字符 宽度为 1.5w, 20 号字的字符宽度为 2w。 另外, 在该表中一个非方块字符对应多个表项, 例如 支持 10 种字体, 一个字符在字符宽度表中对应 10 个表项。 基于上述建表方法, 在计算文本中非方块字符的字符宽度时, 根据文本中非方块 字符的字体在非方块字符宽度表中查找该非方块字符在基淮字号情况下的字符宽度。 文本 中该非方块字符的字号是基准字号时, 直接将查找到的字符宽度确定为文本中该非方块字 符的字符宽度。文本中该非方块字符的字号不是基准字号时, 根据基准字号和文本中该非 方块字符的字号, 对查找到的字符宽度进行等比例缩放, 获得文本中该非方块字符的字符 宽度。在设计排版引擎代码时, 可将查找非方块字符宽度表的代码直接填入排版引擎的代 码中, 从而排版引擎在用户层即可完成文本宽度的计算。
另一种建表方法是, 可针对一种字体提供一个非方块字符宽度表。如果安装电子 书阅读软件的设备支持多种字体, 则针对一种字体提供一个非方块字符宽度表, 根据支持 的字体数提供相应个数的非方块字符宽度表, 例如支持 10 种字体, 则提供 10 个字符宽度查 找表。 另外, 也可为所有字体建立一个非方块字符宽度表, 在该表中一个非方块字符对应多 个表项, 例如支持 10 种字体, 一个字符在字符宽度表中对应 10 个表项。 无论哪种建表方式, 在非方块字符宽度表中只保存非方块字符的字号为基准字号时的字符宽度时, 对于一个非 方块字符的每个表项都包括以下对应关系 : 非方块字符、 该非方块字符的字体、 与字号为基 准字号的该非方块字符对应字符宽度的对应关系。
本实施例主要说明安装电子书阅读软件的设备支持各种变形字体时, 非方块字符 的字符宽度获取方法。如图 2B 所示, 本实施例包括 :
步骤 21B : 根据文本中非方块字符的字体和字形, 在非方块字符宽度表中查找非 方块字符在基准字号下的字符宽度。
对于一种字体提供一个非方块字符宽度表的建表方法, 考虑到变形字体时, 可针 对同一字体建立个数与字形个数相同的非方块字符宽度表。例如, 对于 Time New Roman 字 体, 可分别建立常规字形的非方块字符宽度表、 加粗字形的非方块字符宽度表和倾斜字形
的非方块字符宽度表以及加粗倾斜字形的非方块字符宽度表。例如, 安装阅读软件的设备 支持 10 种字体, 并支持上述四种字形, 则建立 4×10 个非方块字符宽度表。针对 10 号 ( 基 准字号 )Time New Roman 字体的常规字形建立的非方块字符宽度表, 如表 2 所示。排版引 擎在计算文本中字符的字符宽度时, 根据字符码值确定当前待计算字符宽度的字符为非方 块字符后, 根据该非方块字符的字体和字形查找对应的非方块字符宽度表, 再在对应的非 方块字符宽度表中, 根据字符码值查找该非方块字符在基准字号下的字符宽度。
表 2 为 Time New Roman 字体 Unicode 码在 ox0000 ~ ox007F 区域的非方块字符 宽度表
另外, 对于所有字体建立一个非方块字符宽度表的建表方法, 考虑到变形字体时, 可在非方块字符宽度表中增加 “字形” 属性, “字形” 属性可包括常规字形、 加粗字形、 倾斜字 形和加粗倾斜字形。例如支持 10 种字体, 并支持上述四种字形, 则一个非方块字符在非方 块字符宽度表中对应 4×10 个表项。如表 3 所示, 在一个非方块字符宽度表中保存字号为 基准字号时非方块字符在所有字体和字形下的字符宽度时, 该非方块字符宽度表的属性包 括: 字符 Unicode 码值、 字体、 字形和字符宽度。 排版引擎在计算文本中字符的字符宽度时, 根据字符码值确定当前待计算字符宽度的字符为非方块字符后, 根据该非方块字符的字符 码值、 字体和字形在如表 3 所示的非方块字符宽度表中, 查找该非方块字符在基准字号下 的字符宽度。
表 3 为另一种包括所有非方块字符的非方块字符宽度表
Unicode 码值 XX XX XX XX YY YY YY YY 字体 Time New Roman Time New Roman Time New Roman Time New Roman PMingLiu PMingLiu PMingLiu PMingLiu ...
字形 常规字形 加粗字形 倾斜字形 加粗倾斜字形 常规字形 加粗字形 倾斜字形 加粗倾斜字形 ... 字符宽度 A1 A2 A3 A4 B1 B2 B3 B4 ...步骤 22B : 判断非方块字符的字号与非方块字符宽度表的基准字号是否相同。如 果相同, 执行步骤 23B, 否则执行步骤 24B。
步骤 23B : 在文本中非方块字符的字号与非方块字符宽度表的基准字号相同时, 排版引擎将查找到的字符宽度确定为文本中非方块字符的字符宽度。步骤 24B : 在文本中非方块字符的字号与非方块字符宽度表的基准字号不相同 时, 排版引擎根据基准字号和文本中非方块字符的字号, 将查找到的字符宽度进行等比例 缩放, 得到文本中非方块字符对应的字符宽度。
本实施例针对非方块字符, 建立了包括 “非方块字符、 该非方块字符的字形和该非 方块字符的字体, 与该非方块字符的字号为基准字号时的字符宽度的对应关系” 的方块字 符宽度表, 减少了非方块字符宽度表占用的空间, 提高了查找非方块字符宽度的效率。
图 3 为本发明提供的文本排版方法实施例三流程图。在排版引擎获取解析后的电 子书文件中文本之前, 如图 3 所示还包括以下建立非方块字符宽度表的步骤 :
步骤 31 : 从操作系统提供的字体库中, 获取不同字体、 不同字形且字号为基准字 号的非方块字符。
对于一个非方块字符, 从操作系统提供的字体库中分别获取字号为基准字号时, 每种字体下所有字形的该非方块字符。
步骤 32 : 调用操作系统提供的文本宽度计算函数计算非方块字符在基准字号下 所对应的字符宽度。
通过操作系统提供的文本宽度计算函数计算字号为基准字号的该非方块 字 符 所 对 应 的 字 符 宽 度。 例 如 Windows 平 台 提 供 了 用 于 文 本 宽 度 计 算 的 API 函 数 : GetTextExtentPoint, Android 平台提供了函数 Paint.measureText。
步骤 33 : 将非方块字符、 非方块字符的字体和非方块字符的基准字号所对应的字 符宽度的对应关系存入非方块字符宽度表中。
将该非方块字符、 该非方块字符的字体和该非方块字符的基准字号所对应字符宽 度的对应关系存入非方块字符宽度表中。
需要说明的是 : 非方块字符宽度表可在电子书阅读软件启动之前预先建立, 也可 在电子书阅读软件运行过程中建立, 例如可以在电子书阅读软件初始化或电子书阅读软件 的排版引擎设定某种字体时建立, 在电子书阅读软件初始化或电子书阅读软件的排版引擎 设定某种字体时建立非方块字符宽度表, 虽然建表的过程需要一点时间, 但方式可以动态 修改查询表中的内容, 灵活性大, 并且占用的程序空间也小。
图 4 为本发明提供的文本排版方法实施例四流程图。本实施例说明在仅支持中文 字符和英文字符的情况下, 基于本发明实施例创建的字符宽度表的文本排版方法。英文字 符的 Unicode 编码范围在 ox0020 ~ ox007F 区域, 在仅支持中文字符和英文字符的情况下。 为提高查找非方块字符宽度表的效率, 可对一种字体建立一个非方块字符宽度表。 此时, 一 个非方块字符宽度表可是一个数组, 数组下标对应非方块字符的 Unicode 码值, 而数组元 素的值就是该非方块字符的字符宽度。
表 4 为另一种在 Time New Roman 字体下 Unicode 码在 ox0000 ~ ox007F 区域的 非方块字符宽度表
如图 4 所示, 本实施例包括 :
步骤 40 : 排版引擎获取解析后的电子书文件中文本。
步骤 41 : 排版引擎从文本中逐个读取字符。
步骤 42 : 排版引擎判断该字符的字符内容是否为 NULL。 如果该字符的字符内容为 NULL, 表明当前已到达文本末尾, 执行步骤 418。如果不为 NULL, 执行步骤 43。
步骤 43 : 排版引擎根据 Unicode 码值判断该字符是否为方块字符。如果是, 执行 步骤 44, 否则执行步骤 48。
步骤 44 : 若该字符为方块字符, 根据该字符所属的语种和字形, 在方块字符宽度 表中查找字号为基准字号的该字符所对应的字符宽度。
步骤 45 : 判断该字符的字号与方块字符宽度表的基准字号是否相同。如果相同, 执行步骤 46, 否则执行步骤 47。
步骤 46 : 在该字符的字号与方块字符宽度表的基准字号相同时, 将查找到的字符 宽度确定为该字符的字符宽度。之后, 执行步骤 412。
步骤 47 : 在该字符的字号与基准字号不相同时, 根据基准字号和该字符的字号, 将查找到的字符宽度进行等比例缩放, 得到文本中该字符的字号对应的字符宽度。 之后, 执 行步骤 412。
步骤 48 : 若该字符为非方块字符, 排版引擎根据该字符的字体和字形, 在非方块 字符宽度表中查找该字符在基准字号下的字符宽度。
步骤 48 中, 根据该字符的字体和字形, 确定与当前字体和当前字形对应的非方块 字符宽度表后, 根据非方块字符的 Unicode 码值, 从该非方块字符宽度表中提取序号为该 字符 Unicode 码值的表项所存储的字符宽度。
步骤 49 : 判断该字符的字号与非方块字符宽度表的基准字号是否相同。如果相 同, 执行步骤 410, 否则执行步骤 411。
步骤 410 : 在该字符的字号与非方块字符宽度表的基准字号相同时, 排版引擎将 查找到的字符宽度确定为该字符的字符宽度。之后, 执行步骤 412。
步骤 411 : 在该字符的字号与非方块字符宽度表的基准字号不相同时, 排版引擎 根据基准字号和该字符的字号, 将查找到的字符宽度进行等比例缩放, 得到该字符对应的 字符宽度。之后, 执行步骤 412。
步骤 412 : 排版引擎将该字符的字符宽度累加至宽度统计值 W 中, 将字符个数统计 值 C 加一。其中, 宽度统计值 W 和字符个数统计值 C 的初始值均为零。
步骤 413 : 排版引擎判断宽度统计值 W 是否小于文本显示区的宽度。如果是, 返回 步骤 41 执行, 否则执行步骤 414。
步骤 414 : 排版引擎判断宽度统计值是否等于文本显示区的宽度。如果是, 执行步 骤 415, 否则执行步骤 416。
步骤 415 : 若宽度统计值 W 等于文本显示区的宽度, 排版引擎在该字符之后将文本 断行, 确定在第 N 行显示 C 个字符。之后, 执行步骤 417。
N 初始值为 1, 排版引擎每断一行, 将 N 加一。
步骤 416 : 若宽度统计值大于文本显示区的宽度, 排版引擎将字符个数统计值 C 减 一后, 在该字符之前将文本断行, 确定在第 N 行显示 C-1 个字符。
步骤 417 : 排版引擎将宽度统计值和字符个数统计值分别清零。将 N 加一后, 返回 步骤 41 执行。
步骤 418 : 排版引擎调用操作系统提供的文本输出函数在文本显示区输出断行后 的文本。
本发明实施例, 针对一种字体和字形建立一个非方块字符宽度表, 在该非方块字 符宽度表中采用非方块字符的 Unicode 码值, 作为该非方块字符在非方块字符宽度表中的 序号。在排版引擎计算文本中非方块字符的字符宽度时, 根据字体和字形确定相应的非方块字符宽度表后, 根据非方块字符的 Unicode 码值, 从该非方块字符宽度表中提取序号为 该字符 Unicode 码值的表项所存储的字符宽度, 从而获取该非方块字符的基准字号所对应 字宽度。本发明实施例缩短了查找非方块字符的基准字号所对应字宽度的时间, 降低了计 算非方块字符的字符度宽的开销。
图 5 为本发明提供的文本排版引擎实施例一结构示意图。如图 5 所示, 本实施例 包括 : 读取模块 51、 宽度确定模块 52、 断行模块 53 和输出调用模块 54。
读取模块 51, 用于获取解析后的文本后, 排版引擎从所述文本中逐个读取字符。
宽度确定模块 52, 用于读取模块 51 读到文本中字符后, 在该字符为方块字符时, 根据该字符所属的语种和字号在方块字符宽度表中查找该字符的字符宽度 ; 在该字符为非 方块字符时, 根据该字符的字体, 在非方块字符宽度表中查找该字符的字符宽度。
断行模块 53, 用于宽度确定模块 52 确定字符的宽度后, 所述排版引擎根据文本显 示区的宽度、 所述文本中非方块字符的字符宽度和所述文本中方块字符的字符宽度, 对所 述文本进行断行。
输出调用模块 54, 用于断行模块 53 对所述文本进行断行后, 调用操作系统提供的 文本输出函数在所述文本显示区输出断行后的所述文本。
其中, 如图 6 所示, 宽度确定模块 52 包括 : 类型判断单元 521、 方块字符宽度查找 单元 522 和非方块字符宽度查找单元 523。
类型判断单元 521, 用于判断读取模块 51 读取的字符是否方块字符。
方块字符宽度查找单元 522, 用于类型判断单元 521 确定字符为方块字符时, 根据 所述字符所属的语种和字号在方块字符宽度表中查找所述字符的字符宽度。
非方块字符宽度查找单元 523, 用于类型判断单元 521 确定字符为非方块字符时, 根据所述字符的字体, 在非方块字符宽度表中查找所述字符的字符宽度。
本发明实施例, 排版引擎逐个从文本中读取字符, 并通过查找方块字符宽度表或 非方块字符宽度表获取当前读取字符的字符宽度。 同一语种的所有方块字符在同一字号的 字符宽度均相同, 因此, 对于方块字符, 排版引擎根据语种和字号在方块字符表中查找方块 字符的字符宽度。对于非方块字符, 排版引擎根据非方块字符的字体在非方块字符宽度表 中, 查找非方块字符的字符宽度。由于本发明实施例排版引擎查找方块字符宽度表或非方 块字符宽度表获取当前读取字符的字符宽度, 因此排版引擎在用户层完成了字符宽度的计 算, 不需要调用系统提供的文本宽度计算函数, 节省了系统开销, 提高了排版性能。
图 7 为图 6 中方块字符宽度查找单元的结构示意图。如图 7 所示, 方块字符宽度 查找单元 522 包括 : 第一查找子单元 5221、 第一确定子单元 5222 和第二确定子单元 5223。
第一查找子单元 5221, 用于根据所述字符所属的语种和字形, 在方块字符宽度表 中查找字号为基准字号的所述字符所对应的字符宽度 ; 所述方块字符宽度表中包括方块字 符、 所述方块字符所属语种和所述方块字符字形, 与所述方块字符的字号为基准字号时的 字符宽度的对应关系。
第一确定子单元 5222, 用于第一查找子单元 5221 在方块字符宽度表中查找字号 为基准字号的所述字符所对应的字符宽度后, 所述字符的字号与所述基准字号相同时, 将 查找到的字符宽度确定为所述字符的字符宽度。
第二确定子单元 5223, 用于第一查找子单元 5221 在方块字符宽度表中查找字号为基准字号的所述字符所对应的字符宽度后, 所述字符的字号与所述基准字号不相同时, 根据所述基准字号和所述文本中方块字符的字号, 将查找到的字符宽度进行等比例缩放, 得到所述字符对应的字符宽度。
本实施例针对方块字符, 建立了包括 “方块字符、 所属语种、 字形, 与字号为基准字 号的非方块字符的字符宽度的对应关系” 的方块字符宽度表, 减少了方块字符宽度表占用 的空间, 提高了查找方块字符宽度的效率。
图 8 为图 6 中方块字符宽度查找单元的结构示意图。 如图 8 所示, 非方块字符宽度 查找单元 523 包括 : 第二查找子单元 5231、 第三确定子单元 5232 和第四确定子单元 5233。
第二查找子单元 5231, 用于根据所述字符的字体, 在非方块字符宽度表中查找字 号为基准字号的所述字符所对应的字符宽度 ; 所述非方块字符宽度表中包括所述非方块字 符和所述非方块字符的字体, 与所述非方块字符的字号为基准字号时的字符宽度的对应关 系。
进一步, 第二查找子单元还用于根据所述字符的字体和字形, 在所述非方块字符 宽度表中查找所述字符的基准字号所对应的字符宽度 ; 所述非方块字符宽度表中包括所述 非方块字符、 所述非方块字符的字形和所述非方块字符的字体, 与所述非方块字符的字号 为基准字号时的字符宽度的对应关系 ; 所述字形包括常规字形、 粗体和变形体。
第三确定子单元 5232, 用于第二查找子单元 5231 在非方块字符宽度表中查找字 号为基准字号的所述字符所对应的字符宽度后, 所述字符的字号与所述基准字号相同时, 将查找到的字符宽度确定为所述字符的字符宽度。
第四确定子单元 5233, 用于第二查找子单元 5231 在非方块字符宽度表中查找字 号为基准字号的所述字符所对应的字符宽度后, 所述字符的字号与所述基准字号不相同 时, 根据所述基准字号和所述字符的字号, 将查找到的字符宽度进行等比例缩放, 得到所述 字符对应的字符宽度。
本实施例针对非方块字符, 建立了包括 “非方块字符、 该非方块字符的字形和该非 方块字符的字体, 与该非方块字符的字号为基准字号时的字符宽度的对应关系” 的方块字 符宽度表, 减少了非方块字符宽度表占用的空间, 提高了查找非方块字符宽度的效率。
图 9 为图 5 或图 6 中断行模块的结构示意图。如图 9 所示, 断行模块 53 包括 : 累 加单元 531、 判断单元 532 和断行单元 533。
累加单元 531, 用于宽度确定模块 52 确定字符的宽度后, 将所述字符的字符宽度 累加至宽度统计值 ; 所述宽度统计值的初始值为零。
判断单元 532, 用于累加单元 531 累加宽度统计值后, 所述宽度统计值小于文本所 述显示区的宽度时, 确定继续从文本中读取下一个字符, 确定所述下一个字符的字符宽度 并累计至所述宽度统计值中, 直至所述宽度统计值大于或等于所述文本显示区的宽度。
断行单元 533, 用于累加单元 531 累加宽度统计值后, 所述宽度统计值等于所述文 本显示区的宽度时, 在所述字符之后将文本断行 ; 所述宽度统计值大于所述文本显示区的 宽度时, 在所述字符之前将文本断行 ; 将所述宽度统计值清零, 继续从剩余文本中逐个读取 一字符, 将所述字符的字符宽度累加至宽度统计值, 并根据所述宽度统计值和所述文本显 示区的宽度对剩余文本进行断行, 直至读取到的字符为空。
本发明实施例缩短了查找非方块字符的基准字号所对应字宽度的时间, 降低了计算非方块字符的字符度宽的开销。
图 10 为本发明提供的文本排版引擎实施例二结构示意图。如图 10 所示, 在图 5 基础上还包括 : 字符获取模块 55、 调用模块 56 和非方块字符宽度表建立模块 57。
字符获取模块 55, 用于从操作系统提供的字体库中获取不同字体且字号为基准字 号的非方块字符。
调用模块 56, 用于调用系统提供的文本宽度计算函数计算所述非方块字符的基准 字号所对应的字符宽度。
非方块字符宽度表建立模块 57, 用于将所述非方块字符、 所述非方块字符的字体 与字号为所述基准字号的非方块字符对应字符宽度的对应关系存入所述非方块字符宽度 表中。
需要说明的是 : 非方块字符宽度表可在电子书阅读软件启动之前预先建立, 也可 在电子书阅读软件运行过程中建立, 例如可以在电子书阅读软件初始化或电子书阅读软件 的排版引擎设定某种字体时建立, 在电子书阅读软件初始化或电子书阅读软件的排版引擎 设定某种字体时建立非方块字符宽度表, 虽然建表的过程需要一点时间, 但方式可以动态 修改查询表中的内容, 灵活性大, 并且占用的程序空间也小。
本领域普通技术人员可以理解 : 实现上述方法实施例的全部或部分步骤可以通过 程序指令相关的硬件来完成, 前述的程序可以存储于一计算机可读取存储介质中, 该程序 在执行时, 执行包括上述方法实施例的步骤 ; 而前述的存储介质包括 : ROM、 RAM、 磁碟或者 光盘等各种可以存储程序代码的介质。
最后应说明的是 : 以上实施例仅用以说明本发明的技术方案, 而非对其限制 ; 尽 管参照前述实施例对本发明进行了详细的说明, 本领域的普通技术人员应当理解 : 其依然 可以对前述各实施例所记载的技术方案进行修改, 或者对其中部分技术特征进行等同替 换; 而这些修改或者替换, 并不使相应技术方案的本质脱离本发明各实施例技术方案的精 神和范围。