1

我正在尝试提出一种独立于平台的方式来将 unicode 文本呈现到某个平台特定的表面,但假设大多数平台都支持至少有点相似的东西,也许我们可以谈谈 win32 API。我对渲染 LARGE 缓冲区和支持富文本最感兴趣,所以虽然我绝对不想查看 unicode 缓冲区,但我想被告知要绘制什么并被提示在哪里绘制它,所以如果缓冲区被修改,我可能会正确要求更新缓冲区的部分区域。

所以实际的问题。GetTextExtentExPointW 清楚地允许我获取每个字符的宽度,我如何获取不间断文本范围的宽度?如果我有一些长词,他可能应该换行而不是拆分词。我怎么知道在哪里打破文本?我需要实际查看 unicode 缓冲区吗?这似乎非常危险。另外,我如何计算渲染时每个基线应该有多远?

最后,这看起来已经非常复杂了。是否有替代策略来做我想做的事情?每次我更改一小块缓冲区时,我真的一点都不想重新渲染一个巨大的缓冲区。在查看单个字形和只是给一个框来吐出文本之间的东西。

最后,我对使用 knuth 的分词算法之类的东西不感兴趣。没有连字符。理想情况下,我想呈现合理的文本,但如果给出了单词定位,那是我的事。粗糙的右手边距对我来说很好。

4

3 回答 3

1

您正在尝试做的事情在 unicode 行话中称为塑造。不要费心编写自己的整形引擎,这是一项全职工作,需要不断更新以考虑 unicode 和 opentype 标准的变化。如果您想花时间在应用程序的其余部分上,您需要将整形委托给第三方引擎(harbuzz-ng、uniscribe、icu 等)

正如其他人所写:
– unicode 字体渲染非常复杂,比您预期的要复杂得多
– winapi 根本不是跨平台的

渲染 unicode 文本的三种常用策略是:
1. 每个系统编写一个后端(插入系统原生文本堆栈)或
2. 选择一组跨平台库(例如 freebidi + harfbuzz-ng + freetype + fontconfig,或 QT 之类的框架)并为每个目标系统重新编译它们或
3. 采取合规性捷径

我强烈反对的唯一策略是最后一个。您无法控制 unicode.org 规范化(将大写 ss 添加到德语),您不了解全球脚本的使用(非洲语言和越南语都是拉丁语变体,但它们具有意想不到的 unicode 属性),您低估字体创建者的独创性(哦,印度用户请求了这个 opentype 属性,但是对于这个英文用例来说它真的很方便......)。

前两种策略有其自身的缺点。维护单个文本后端更简单,但在外部系统上部署完整的文本堆栈远非一帆风顺。几乎每个尝试跨平台的项目都必须首先摆脱 msvc,因为它以 Windows 为目标,并且它的语言方言无法在其他平台上运行,跨平台库通常只能在 gcc 或 llvm 中轻松编译。

我认为 harfbuzz-ng 即使在 Windows 上也已与 uniscribe 相提并论,所以如果我今天想要跨平台(chrome、firefox 和 libreoffice 至少在某些平台上使用它),这就是我的目标库。然而,Libreoffice 至少使用了多后端策略。不知道它是否比过去的历史评估更能反映当前的图书馆状态。没有那么多跨平台应用程序可以查看大量文本使用,而且其中大多数都承担着遗留选择的负担。

于 2013-09-16T18:13:37.417 回答
0

如果你想要一些完美的多平台会有问题。如果您使用 GDI 绘制一个句子,一个 GDI+,一个使用 Direct2D,一个在 Linux 上,一个在 Mac 上,在同一个缓冲区上都使用相同的字体大小,您将在某些位置上有所不同,以便 int 其他一些使用 float 示例.

没有一个问题,至少有两个问题。
绘制文本和计算文本位置、换行等是非常不同的。有些库两者都做有些只做计算或渲染部分。一个非常简单的解释是绘图只在您要求的位置渲染一个字符,并带有变换缩放、旋转和抗锯齿。计算做其他一切选择单词中的每个字符位置,句子换行符,段落等

如果您想独立于平台,您可以使用 FreeType 读取字体文件并获取每个字符的所有信息。该库在每个平台上都得到完全相同的结果,并且字体的可预测性很好。字体的主要问题是字符描述中有很多不好的、遗漏的甚至是错误的信息。没有人能完美地做文本,因为它非常困难(向单词、acrobat 和每个直接处理字体的团队倾诉)

如果你的字体计算是好的。在一个好的文字处理器软件中你可以看到很多工作(字符之间的空格,单词之间的空格,换行符,对齐,旋转,油脂,混叠......)然后你可以进行渲染。它应该更容易。您可以使用相同的计算来执行 GDI、Direct2D、PDF 或打印渲染路径。

于 2013-09-15T14:29:22.813 回答
0

Unicode 渲染非常复杂。换行只是开始;我认为您还没有意识到许多其他细微之处(垂直文本、从右到左的文本、字形组合等等)。例如,微软有几个团队专门致力于实现文本渲染。

听起来您对DirectWrite感兴趣。请注意,这显然不是平台独立的。如果您不关心语言独立性,也可以做不太准确的工作;许多更不寻常的功能只出现在更稀有的语言中。(中国人是一个明显的例外。)

于 2013-09-15T06:23:15.010 回答