我如何强制 Red Hat OpenJDK 8 像 AdoptOpenJDK 和 Oracle JDK on Windows 一样清晰地呈现字体?
How can I force Red Hat OpenJDK 8 to render fonts as clearly as AdoptOpenJDK and Oracle JDK on Windows?
我们的用户 运行 我们的 Java GUI 应用程序在他们的 Windows 桌面上,我们正计划从 Oracle Java 8 切换到 OpenJDK 8. 但我们发现不同的 OpenJDK 构建在字体渲染质量上不一致,Oracle 和 AdoptOpenJDK 相当,但 Red Hat 严重缺乏。
以下屏幕截图显示了一个简单的 Java AWT/Swing 程序 Windows 在三个不同的 JDK 上:
- 甲骨文 1.8.0_201-b26
- 采用开放JDK 1.8.0_202-b08
- 红帽 1.8.0_201-2-redhat-b09
Red Hat JDK 中的渲染存在一些问题,因为每个字符都变形了。
该程序仅显示带有命令行指定 Dialog/bold/12 字体的 Swing JLabel(每个 JDK 映射到 Windows OS Arial 字体) :
$ cat fontname.groovy
import javax.swing.*
import java.awt.Font
import sun.font.*
styles=[bold:Font.BOLD,italic:Font.ITALIC,plain:Font.PLAIN]
SwingUtilities.invokeLater({
l = new JLabel("${args}: ${System.getProperty('java.runtime.name')} ${System.getProperty('java.runtime.version')}")
l.setFont(new Font(args[0],styles[args[1]],Integer.valueOf(args[2])))
f = new JFrame()
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE)
f.getContentPane().setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10))
f.getContentPane().add(l)
f.pack()
f.setVisible(true)
logicalFont = l.getGraphics().getFont()
print(logicalFont)
physicalFont = FontManagerFactory.getInstance().findFont2D( logicalFont.getName(), 0, FontManager.NO_FALLBACK )
print(physicalFont)
})
下面的附加屏幕截图显示了此 Windows 系统上可用的 3 个 Swing PLAF 上的相同字体,并显示每个 PLAF 在 Red Hat OpenJDK 下的外观是一致的(通过系统设置 属性 选项 "-Dswing.defaultlaf="):
- 默认外观(javax.swing.plaf.metal.MetalLookAndFeel)
- Windows 外观和感觉 (com.sun.java.swing.plaf.windows.WindowsLookAndFeel)
- Nimbus 外观和感觉 (javax.swing.plaf.nimbus.NimbusLookAndFeel)
有谁知道为什么 Red Hat OpenJDK 版本会以如此不同的方式呈现字体? Red Hat OpenJDK 可能需要一些额外的 JDK 配置或设置吗?
Update - alexkasko 的回答(谢谢!)设置环境变量 FREETYPE_PROPERTIES 的解决方法确实纠正了字体问题,截至 OpenJDK版本 1.8.0_201-2-redhat-b09:
这是由 FreeType update to 2.8. AdoptOpenJDK jdk8 build uses older FreeType 2.5.3 引起的 Red Hat 构建中的回归。这将在 Red Hat 构建中得到修复,同时旧行为可以 re-enabled 使用环境变量:
FREETYPE_PROPERTIES=truetype:interpreter-version=35
我们的用户 运行 我们的 Java GUI 应用程序在他们的 Windows 桌面上,我们正计划从 Oracle Java 8 切换到 OpenJDK 8. 但我们发现不同的 OpenJDK 构建在字体渲染质量上不一致,Oracle 和 AdoptOpenJDK 相当,但 Red Hat 严重缺乏。
以下屏幕截图显示了一个简单的 Java AWT/Swing 程序 Windows 在三个不同的 JDK 上:
- 甲骨文 1.8.0_201-b26
- 采用开放JDK 1.8.0_202-b08
- 红帽 1.8.0_201-2-redhat-b09
Red Hat JDK 中的渲染存在一些问题,因为每个字符都变形了。
该程序仅显示带有命令行指定 Dialog/bold/12 字体的 Swing JLabel(每个 JDK 映射到 Windows OS Arial 字体) :
$ cat fontname.groovy
import javax.swing.*
import java.awt.Font
import sun.font.*
styles=[bold:Font.BOLD,italic:Font.ITALIC,plain:Font.PLAIN]
SwingUtilities.invokeLater({
l = new JLabel("${args}: ${System.getProperty('java.runtime.name')} ${System.getProperty('java.runtime.version')}")
l.setFont(new Font(args[0],styles[args[1]],Integer.valueOf(args[2])))
f = new JFrame()
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE)
f.getContentPane().setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10))
f.getContentPane().add(l)
f.pack()
f.setVisible(true)
logicalFont = l.getGraphics().getFont()
print(logicalFont)
physicalFont = FontManagerFactory.getInstance().findFont2D( logicalFont.getName(), 0, FontManager.NO_FALLBACK )
print(physicalFont)
})
下面的附加屏幕截图显示了此 Windows 系统上可用的 3 个 Swing PLAF 上的相同字体,并显示每个 PLAF 在 Red Hat OpenJDK 下的外观是一致的(通过系统设置 属性 选项 "-Dswing.defaultlaf="):
- 默认外观(javax.swing.plaf.metal.MetalLookAndFeel)
- Windows 外观和感觉 (com.sun.java.swing.plaf.windows.WindowsLookAndFeel)
- Nimbus 外观和感觉 (javax.swing.plaf.nimbus.NimbusLookAndFeel)
有谁知道为什么 Red Hat OpenJDK 版本会以如此不同的方式呈现字体? Red Hat OpenJDK 可能需要一些额外的 JDK 配置或设置吗?
Update - alexkasko 的回答(谢谢!)设置环境变量 FREETYPE_PROPERTIES 的解决方法确实纠正了字体问题,截至 OpenJDK版本 1.8.0_201-2-redhat-b09:
这是由 FreeType update to 2.8. AdoptOpenJDK jdk8 build uses older FreeType 2.5.3 引起的 Red Hat 构建中的回归。这将在 Red Hat 构建中得到修复,同时旧行为可以 re-enabled 使用环境变量:
FREETYPE_PROPERTIES=truetype:interpreter-version=35