对电子书阅读器来说,提示当前阅读进度是一项很自然的功能,习惯用电脑的人都常看到进度条 (progress bar) 和滚动条 (scroll bar),如右图是 Textus 中使用的右侧滚动条。 然而在实际实现中,进度计算是一件伤脑筋的事情,比如 Textus 的实现其实很简单:在打开文件时读入整个文件,然后整个交给 Core Text 去排版,将排版后的结果分解为行 (CTLineRef) 记录下来,并将所有行总的高度设置为整个文本视图的高度,这样,每当滚动视图 (NSScrollView) 移动到某个位置时,重绘函数 (-drawRect:) 被调用到,我们根据该位置来判断应该绘制从第几行到第几行的内容,再调用 Core Text 把这些行画出来。 这么做看似很简单直接,结果也很容易保证正确,带来的问题是,每次用户修改设置 (比如调整字体大小、窗口尺寸) 时,就得把整个文件重新排版一遍,即使此时我们只需要看到当前一页的内容。为什么这种方法这么低效,我还一直使用它呢?因为这个实现严格依赖滚动视图给出的位置来判断当前阅读进度,所以总的高度估计必须非常精确,不然随便滚动一下就可能出现错位,而一次算给出整个高度的方法最准确,不容易出错。 在 iTextus,也就是 iPad 版本的文本阅读器中,我打算换一种方法,主要的原因是: 大家在手持设备中都不喜欢用进度条,因为频繁滑动比较烦人 分页方式实现起来比较简单高效,而 iPad 的性能有限 其实从文件载入到显示出来,90% 的时间花费在排版上 (对于 Core Text 程序,就是 CTFramesetterCreateWithAttributedString 这一步),剩下 5% 用来读取文件,5% 用来绘制排版结果。所以在 iPad 上我们尽可能的减少排版时间,最简单的方法就是把这个时间均摊到每页上,这样每页的排版时间就几乎可以忽略不计了。另一方面,这样也能减少程序的内存占用,在内存紧张的时候可以简单地回收几个页面的排版数据,而不必清空所有的。 既然采用分页方式,进度显示就很灵活了,我们先看看常见的 iPhone 上电子书阅读器是怎么做的。 Stanza 在全屏阅读状态时,除了页面底部用不同颜色显示已读和未读进度比例之外,没有任何其他的提示,这样看起来非常简洁。 触碰页面中部之后 Stanza 会出现一个更详细的界面,包括上方的导航栏提供了书名和作者,中间提示了章节、页数和进度的百分比,下方工具栏还提供了直接通过拖拉跳转页面的功能。 [...]
在今年 7 月的 GUADEC 上 Behdad Esfahbod 做了一个题为 State of Text Rendering 的讲座,系统地综述了当前文本渲染技术的现状,顺带强调主要由他开发的 harfbuzz-ng 是未来发展的方向,4 个月过去了,最近文本渲染技术有了什么发展呢?这里谈谈我的一些印象和见解。 首先,harfbuzz-ng 到底想做成什么样子?我们知道底层的字体格式支持,开放的有 FreeType 一枝独秀,各平台私有的有 Win32 的 GDI font, Mac OS X 有 ATS 和 CGFont,上层的文本布局排版引擎,现在各家自有一套到两套:Windows 的 DirectWrite 和 Uniscribe;Mac OS X 有 Core Text 和 ATSUI,有 NSLayoutManager;GTK+ 有 pango,都是比较成熟的接口了,那 harfbuzz-ng 是要取代他们吗? 不是,也完全说不通,毕竟 pango 就是 Behdad Esfahbod 自己维护的,没理由拆自己的台。但是开放的 pango 等平台一直缺失的部分是 [...]
I did a talk in Cocoaheads Beijing yesterday on the topic “Text Layout with Core Text”, and here is my slides (4 MB, pdf). I may write a more detailed article on Core Text typesetting later, stay tuned.
After two days of work, here is the first beta of the 0.3 series of vim-cocoa. What’s New? Updated vim to 7.2.49 Use Core Text to replace ATSUI for text rendering Optimize program startup Support transparency option to control background transparency Fix cursor redraw on right clicking Fix CTRL + SHIFT + ? key handling [...]
© jjgod / blog. Powered by WordPress using the DePo Skinny Theme.