4

注意:我的整个 senario 仅适用于 android 版本的 ICS。

我的目标是渲染具有复杂脚本/印度脚本的文本。在 ICS 中,此功能已添加到 WebView(以及浏览器)中。如果在 Browser 或 WebView 中呈现任何指示文本,则它会正确呈现。但在其他小部件(TextView、EditText)中,它呈现损坏。

现在我的目标是重新使用代码在 webcore 中正确绘制 indic 文本,并使用该代码在自定义小部件中绘制 indic 文本。

我还在浏览器中使用 HTML5 画布进行了测试,它可以很好地呈现 indic 文本。我已经测试了 android 的 android.graphics.Canvas 并且它无法正确呈现 indic 文本。

libskia严重缺乏文档,所以我无法弄清楚如何使用它来呈现文本。

我检查了 libwebcore.so 的 objdump,发现它依赖于 lib“skia”“libicu”。所以我假设我可以使用这些库绘制印度文字。

谁能建议我如何使用skia和icu绘制印度文字?或者任何人都可以指向 libwebcore 中的特定代码段吗?

4

1 回答 1

1

有几个常用的替代文本堆栈,但都没有通过 Android NDK 直接公开。在基础级别,您需要:

  1. 将您的文本分成单个脚本、单个字体、单个方向、单个行的运行。
  2. 将每次运行中的字符序列转换为字形序列。
  3. 在 2D 空间中布置这些字形,如果您的换行不成功,可能会返回到步骤 (1)。
  4. 栅格化所选位置的字形。

最流行的堆栈大约是 (1) fribidi,(2) harfbuzz-ng,(3) 更多 harfbuzz-ng,(4) libfreetype。所有这些项目都很容易在 Android 上运行;文档质量参差不齐。

还有一个 Pango 项目,它位于刚刚描述的堆栈之上,但提供了更高级别的接口。不幸的是,Pango 有很多依赖项,因此合并 Pango 可能比直接使用堆栈更费力。如果没有别的,Pango 可以作为如何使用堆栈的很好的文档。

作为替代堆栈,libicu 的各个部分可以替换 fribidi、harfbuzz-ng 和 Pango(最后一个几乎没有文档化的 ParagraphLayout 类);你仍然需要 libfreetype 来实际处理字体和光栅化。请注意,libicu 的部分内容正在转移到 harbuzz-ng,因此这些堆栈并不完全不同;虽然 libicu 的某些部分都非常出色且定期更新,但其他部分则比较模糊。

于 2013-02-23T04:39:50.290 回答