自 Java 7u13 以来,字体字形未使用 Graphics2D drawString 呈现

Font glyph not rendering with Graphics2D drawString since Java 7u13

在 Windows 10 的 Java 32 位中使用某些特定的 True Type 字体绘制字符串时,我遇到了一个奇怪的问题。

自 Java 7u13 起,每当字体的 character/glyph 宽度超过其高度的 4 倍时,它根本不会使用 Graphics2D.drawString 呈现(例如字形 4001em 宽,基本字体大小为 1000em):

public void paint(Graphics g) {
    Graphics2D g2 = (Graphics2D)g;
    g2.setFont(new Font("myFontWithWideGlyphForX", Font.PLAIN, 12));
    g2.drawString("XXXX", 10, 10);
}

但是,字体在 JLabel 上正确呈现,所以在对底层 Swing 代码进行一些调查后,我意识到将呈现提示 KEY_TEXT_ANTIALIASING 设置为 VALUE_TEXT_ANTIALIAS_LCD_HRGB 可以使文本正确呈现:

public void paint(Graphics g) {
    Graphics2D g2 = (Graphics2D)g;
    g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
    RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
    g2.setFont(new Font("myFontWithWideGlyphForX", Font.PLAIN, 12));
    g2.drawString("XXXX", 10, 10);
}

似乎在设置子像素 atialiasig 并正确渲染字体后渲染算法的工作方式有所不同。

如果我切换到 Java 7u11 或更早版本,文本呈现没有任何问题并且没有设置 VALUE_TEXT_ANTIALIAS_LCD_HRGB。

具有如此宽字形的任何其他字体都会发生同样的情况 - 例如,这种随机字体具有如此宽的字符字形 "J": http://www.fontspace.com/digital-magic/hdgems5 - 它在 Java 7u11 上渲染正常,但在任何比它更新的情况下都无法渲染。

设置子像素抗锯齿 VALUE_TEXT_ANTIALIAS_LCD_HRGB 只是为了渲染字体看起来很老套、丑陋,而且并不总是可行的(例如,当使用第三方库时)。有谁知道自 7u13 以来 awt 不渲染此类字符的原因是什么?不支持这种字体吗?或者这可能是一个错误?

我无法得到有关此问题的答案,但我确实找到了解决方法。

当使用 Java 7u13 或更新版本时,我发现

None 的 .ttf 字体呈现的字形宽度是边界 box/glyph 高度的 4 倍。无论使用何种工具生成字体,此问题仍然存在。

但是 .otf 字体似乎工作正常,即使使用如此宽的字形,因此作为解决方法,将字体转换为 otf。