尽管关闭了小数宽度,但macOS Retina上的OpenJDK 11 Swing等距字体渲染问题

问题描述 投票:2回答:1

我正在尝试解决我正在开发的代码编辑器的问题,该问题仅在具有Retina显示屏的Mac上使用OpenJDK 11时出现。以下屏幕截图说明了该探针。顶部是OpenJDK 11(采用OpenJDK 11.0.5 HotSpot),底部是JDK 8(我相信Apple / Oracle JDK 8):

enter image description here

如您所见,OpenJDK 11使字体更宽。这是一个大问题,因为我正在使用FontRenderContext#getStringBounds确定等宽列的宽度。使用默认的等宽字体(看起来像Menlo)和字体大小14,据报告每个字符前进8个像素,这正确地对应于JDK 8渲染,但不对应于OpenJDK 11渲染。更糟糕的是,在后一种情况下,似乎没有获得整数像素,而是8.5像素(第一条非注释行包含38个字符,在JDK 8上需要38 * 8 * 2 = 608像素,但是在OpenJDK 11上大约646像素。

更奇怪的是,此问题是[[通过渲染AttributedText实例引起的]使用Graphics2D#drawString。如果我转换为纯文本,请使用g.setFont,OpenJDK 11的呈现方式与JDK 8完全相同。因此,它必须与呈现AttributedCharacterIterator的特定实现有关。

显然,由于此错误,我没有更改整个实现,因此,我正在寻找一种解决方法(当然,除了要求用户选择其他字体之外,我还没有)。也许有一些系统属性...?


Edit:

经过进一步的调试会话后,我发现ExtendedTextSourceLabel#createGV和更深的SunLayoutEngine#layout产生了区别,然后它们调用了本机代码,尽管在JDK 8中有相同的字体提示描述,字形数据中的_positions设置为整数,而在OpenJDK 11中将其设置为小数(并且实际上也不是0.5的倍数,因此与以下事实无关)我们在Retina显示器上运行;也许该字体由本机macOS字体支持)
java macos swing retina-display font-rendering
1个回答
0
投票
[This显示它取决于字体大小,而不取决于字体是“本机”还是捆绑的:

enter image description here

这是类路径上的

Inconsolata .ttf,字体大小为32。相比之下,字体大小为33:

enter image description here

这里基于FontRenderContext#getStringBounds的报告的字体进度是17.0,由灰色矩形可视化,但是实际渲染略窄一些。

© www.soinside.com 2019 - 2024. All rights reserved.