Java2D - 访问字体 CMap 以呈现连字

Posted

技术标签:

【中文标题】Java2D - 访问字体 CMap 以呈现连字【英文标题】:Java2D - Access font CMap to render ligatures 【发布时间】:2017-06-01 17:10:45 【问题描述】:

我需要将带有连字的表情符号 (???? + ???? = ???????? ) 打印到 Graphics2D 对象中。据我所知,您可以使用 graphics2d.drawString(string, x, y); 或从字体创建 GlyphVector,然后将该 GlyphVector 打印到 Graphics2D 对象中。

这两种方法都不起作用,因为它们无法呈现连字。 Font 中有一个有趣的方法:createGlyphVector(frc, int[] glyphCodes),它允许您创建具有指定字形索引的 GlyphVector。

问题:

如何检索此类字形索引。手动访问连字字形的索引我可以解决这个问题。

java.awt.Font 类隐藏了所有允许您访问 CMap 的 API,我在标准 API 中看不到任何访问/查询字形的方法。

有什么办法吗?

【问题讨论】:

为什么不 ~~~~~ public GlyphVector createGlyphVector(FontRenderContext frc, char[] chars) ~~~~~ 因为它不是 emoji 而是呈现一个正方形。我认为基本上存在错误的代理对处理。并且阅读字体连字也没有得到很好的支持。 啊。众所周知,连字很难被 java2d 渲染。据我所知,没有用于查询连字字体的 api。幸运的是,许多表情符号只有一个 unicode 字符,应该直接映射到这些字形 (unicode.org/emoji/charts/emoji-released.html)。 不支持代理对。不仅可以渲染表情符号,还可以渲染其他脚本。到目前为止,唯一的解决方案是使用sun.font.Font2D 您可能应该显示(减少到只有最低限度的工作)代码。将java2s.com/Code/Java/Development-Class/… 与使用代码点整数序列生成代理对的简单循环结合起来不起作用吗? 【参考方案1】:

我搜索了 JAVA 并找到了 createGlyphVector(frc, int[]) ,这是我使用 JAVA 显示本机代码中的文本所需要的。

在我的搜索中,我发现了这个精彩的问题,这正是我正在寻找的,以验证我们在 JAVA DrawGlyphRuns D2D 中的等效项。

在本机代码中使用 JAVA 的替代方法是包含一个库,例如 freetype-gl,并在本机端执行所有操作。

因此,对于在 JAVA 中无法轻松获取 cmap 数据的解决方案,我将其提前准备好用于特定字体并制作成资源数据表。这对于具有合理数量的 Unicode 代码点的脚本非常有效且非常快速。假设cmap数据是稳定的数据。这些表占用的内存非常少,即使 cmap 数据随时可用,也不必为每个字形调用函数。

【讨论】:

以上是关于Java2D - 访问字体 CMap 以呈现连字的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将 CFF 字体转换为 OpenType 字体

以编程方式将CFF字体转换为OpenType字体

Java2D:XWindows 事件和帧率之间的交互

Fabric.js 一些自定义字体以非常小的尺寸和错误的字体呈现

如何从 CMap 访问元素?

Chrome 在设备上以不同的方式呈现基于 em 的字体大小